i
Universitas Kristen Maranatha ABSTRAK
Dewasa ini era modernisasi berkembang cukup pesat. Hal ini membuat orang – orang yang ahli di bidang elektronika berlomba – lomba membuat alat yang dapat memudahkan pekerjaan manusia. Salah satunya adalah mesin pencatat plat nomor otomatis. Namun seringkali terjadi kendala tidak terbacanya tulisan oleh jaringan saraf tiruan (JST) karena tulisan yang terlalu tebal.
ii
Universitas Kristen Maranatha ABSTRACT
Today's era of modernization developed rapidly. This made peoples who experts in the field of electronics race to make a tool that can facilitate the work of man. One of it is the automatic plate number recording machine. But the problem is often the artificial neural network did not recognize the letters because the size of the letters is too thick.
v
vi
Universitas Kristen Maranatha
3.2 Flowchart keseluruhan ... 18
3.3 Tampilan awal dan komponen yang digunakan ... 20
3.4 Coding untuk open file ... 21
3.5 Coding untuk save as ... 21
3.6 Coding untuk animate ... 22
3.7 Coding untuk button1 thin ... 22
3.8 Coding untuk button2 undo ... 23
3.9 Coding untuk struktur ketetanggaan ... 24
3.10 Coding untuk penipisan citra ... 24
BAB 4 PENGUJIAN DAN ANALISIS 4.1 Proses penipisan citra ... 30
4.1.1 Tampilan awal ... 30
4.1.2 Data pengamatan penipisan angka ... 31
4.1.3 Data pengamatan penipisan huruf ... 32
4.1.4 Data pengamatan penipisan tulisan ... 34
4.1.5 Data pengamatan penipisan huruf asing ... 35
4.1.6 Contoh penipisan citra perlangkah ... 39
4.2 Data kuesioner untuk pembacaan huruf cina dan arab ... 40
BAB 5 KESIMPULAN DAN SARAN 5.1 Kesimpulan ... 42
5.2 Saran ... 42
vii
Universitas Kristen Maranatha
DAFTAR GAMBAR
Halaman
Gambar 2.1 Representasi citra biner ... 4
Gambar 2.2 matriks ketetanggaan ... 8
Gambar 2.3 B(p1)=2 , A(p1)=1 ... 9
Gambar 2.14 garis vertical sebesar 2 piksel ... 14
Gambar 2.15 A(p4)!=1 ... 14
Gambar 2.16 p2.p4.p6=0 ... 14
Gambar 2.17 p2.p4.p6!=0 dan A(p4)=1... 15
Gambar 2.18 Garis horizontal sebesar 2 pixel. ... 15
Gambar 3.1 Diagram blok ... 17
Gambar 4.4 hasil penipisan tulisan ... 35
viii
Universitas Kristen Maranatha
Gambar 4.6 hasil penipisan huruf cina... 36
Gambar 4.7 hasil penipisan huruf arab ... 36
Gambar 4.8 hasil penipisan kaligrafi tulisan arab ... 37
Gambar 4.9 hasil penipisan huruf ibrani ... 38
Gambar 4.10 hasil penipisan huruf ibrani ... 38
ix
Universitas Kristen Maranatha
DAFTAR TABEL
Halaman
Tabel 4.1 tabel kuesioner pembacaan huruf cina ... 40
A-1 LAMPIRAN A CODING PROGRAM
unit Thinning;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, Menus, ExtCtrls, ExtDlgs, StdCtrls;
type
TRGBTripleArray = array[0..1000] of RGBTriple;
PRGBTripleArray = ^TRGBTripleArray;
TPoints = array of TPoint;
TForm1 = class(TForm)
OpenPictureDialog1: TOpenPictureDialog;
SavePictureDialog1: TSavePictureDialog;
Image1: TImage;
MainMenu1: TMainMenu;
File1: TMenuItem;
Open1: TMenuItem;
SaveAs1: TMenuItem;
N1: TMenuItem;
Animate1: TMenuItem;
A-2
Exit1: TMenuItem;
Button1: TButton;
Button2: TButton;
Image2: TImage;
StaticText1: TStaticText;
StaticText2: TStaticText;
procedure Open1Click(Sender: TObject);
procedure SaveAs1Click(Sender: TObject);
procedure Animate1Click(Sender: TObject);
procedure Exit1Click(Sender: TObject);
procedure Button2Click(Sender: TObject);
procedure FormCreate(Sender: TObject);
procedure Skeletonize(var Points : TPoints ;
ALebar, ATinggi : integer);
procedure SkeletonizeAnimate(var Points : TPoints ;
ALebar, ATinggi : integer);
function Tetangga(ATetangga : byte) : TPoint;
procedure Button1Click(Sender: TObject);
private
{ Private declarations }
UndoBitmap : TBitmap;
public
{ Public declarations }
A-3
var
Form1: TForm1;
implementation
{$R *.dfm}
procedure TForm1.FormCreate(Sender: TObject);
begin
UndoBitmap := TBitmap.Create;
UndoBitmap.PixelFormat := pf24bit;
end;
procedure TForm1.Open1Click(Sender: TObject);
begin
if not OpenPictureDialog1.Execute then Exit;
Image1.Picture.Bitmap.LoadFromFile(OpenPictureDialog1.FileName);
Image1.Picture.Bitmap.PixelFormat := pf24bit;
Image1.AutoSize := True;
Image2.Picture.Bitmap.LoadFromFile(OpenPictureDialog1.FileName);
Image2.Picture.Bitmap.PixelFormat := pf24bit;
Image2.AutoSize := True;
Button1.Enabled := true;
A-4
procedure TForm1.SaveAs1Click(Sender: TObject);
begin
if not SavePictureDialog1.Execute then Exit;
Image1.Picture.Bitmap.SaveToFile(SavePictureDialog1.FileName);
Image1.Picture.Bitmap.PixelFormat := pf24bit;
end;
procedure TForm1.Animate1Click(Sender: TObject);
begin
Animate1.Checked := not Animate1.Checked;
end;
procedure TForm1.Exit1Click(Sender: TObject);
begin
Close;
end;
procedure TForm1.Button2Click(Sender: TObject);
begin
Image1.Canvas.Draw(0, 0, UndoBitmap);
Button2.Enabled := False;
Button1.Enabled := True;
end;
A-5
begin
ATetangga := (ATetangga - 2 ) mod 8 + 2; // struktur ketetanggaan
Case ATetangga of
1 : begin Result.X := 0; Result.Y := 0; end; //
2 : begin Result.X := 0; Result.Y := -1; end; //
3 : begin Result.X := 1; Result.Y := -1; end; // |
4 : begin Result.X := 1; Result.Y := 0; end; //
5 : begin Result.X := 1; Result.Y := 1; end; //
6 : begin Result.X := 0; Result.Y := 1; end; //
7 : begin Result.X := -1; Result.Y := 1; end; //
8 : begin Result.X := -1; Result.Y := 0; end; //
9 : begin Result.X := -1; Result.Y := -1; end; //
end;
end;
procedure TForm1.Skeletonize(var Points : TPoints ;
ALebar, ATinggi : integer);
Var
Lx, Ly, index : integer;
B, A, N, AN2, AN4 : byte;
NOff : TPoint;
Ubah : boolean;
Hapus : array of boolean;
Image : array of array of byte;
A-6
// gambar diperbesar untuk tinggi dan lebarnya sebesar 2 pixel untuk
// menghindari access violation pada program
SetLength(Image, ALebar+2); // membuat array sebesar image
for Lx := 0 to ALebar + 1 do begin
SetLength(Image[Lx], ATinggi+2);
for Ly := 0 to ATinggi + 1 do begin
Image[Lx,Ly] := 0;
end;
end;
for index := 0 to High(Points) do
Image[Points[index].X+1][Points[index].Y+1] := 1; // array 2 dimensi diisi oleh Points dari image dengan nilai bit 1
SetLength(Hapus, length(Points)); // membuat array dengan nama Hapus panjangnya disesuaikan dengan image
Ubah := true; // memulai perubahan citra
while Ubah do begin // memulai loop untuk perubahan dan berhenti apabila sudah tidak ada perubahan
Ubah := false;
// loop melalui seluruh citra biner
for index := 0 to High(Points) do begin
A-7
Lx := Points[index].X +1; //dari array yang telah di isi point dari image, X dan Y dideklarasikan pointnya +1
Ly := Points[index].Y +1;
// kriteria 1
// menghitung B
// B adalah jumlah tetangga yang bernilai bit 1
B := 0;
for N := 2 to 9 do begin
NOff := Tetangga(N);
Inc(B, Image[Lx+NOff.X][Ly+NOff.Y]); // B di increment sebanyak jumlah tetangga yang bernilai bit 1
end;
if (B < 2) or (B > 6) then Continue; // jika B bernilai 2 sampai 6 maka lanjutkan
// kriteria 2
// menghitung A
// A adalah jumlah transisi bit 0->1 hanya boleh berjumlah 1 [A(p1)=1]
A := 0;
for N := 2 to 9 do begin
NOff := Tetangga(N);
if Image[Lx+NOff.X][Ly+NOff.Y] = 0 then begin
A-8
if Image[Lx+NOff.X][Ly+NOff.Y] = 1 then Inc(A);
end;
if A > 1 then Break; // bila A sudah melebihi 1 maka (p) tersebut tidak melanjutkan program ke kriteria selanjutnya
end;
if A <> 1 then Continue; // bila A sama dengan dengan 1 maka lanjut ke kriteria berikutnya
// kriteria 3
// Menghitung nilai A untuk p2
AN2 := 0;
for N := 2 to 9 do begin
NOff := Tetangga(N);
if Image[Lx+NOff.X][Ly+NOff.Y-1] = 0 then begin
NOff := Tetangga(N+1);
if Image[Lx+NOff.X][Ly+NOff.Y-1] = 1 then Inc(AN2);
end;
end;
if (Image[Lx][Ly-1] * Image[Lx+1][Ly] * Image[Lx-1][Ly]=0) or // p2.p4.p8 = 0 atau p2 != 1
(AN2 <> 1) then Continue;
// kriteria 4
A-9
AN4 := 0;
for N := 2 to 9 do begin
NOff := Tetangga(N);
if Image[Lx+NOff.X+1][Ly+NOff.Y] = 0 then begin
NOff := Tetangga(N+1);
if Image[Lx+NOff.X+1][Ly+NOff.Y] = 1 then Inc(AN4);
end;
end;
if (Image[Lx][Ly-1] * Image[Lx+1][Ly] * Image[Lx][Ly+1] = 0) or // p2.p4.p6 = 0 atau p4 != 1
(AN4 <> 1) then begin
Hapus[index] := True;
Ubah := True;
end;
end;
// menghapus point yang telah diberi tanda pada array hapus
if Ubah then begin
index := 0;
while index < length(Points) do begin
if Hapus[index] then begin
// penghapusan array Hapus yang sudah diberi tanda
A-10
SetLength(Hapus, High(Hapus));
Points[index] := Points[High(Points)];
SetLength(Points, High(Points));
Image[Points[index].X+1][Points[index].Y+1] := 0;
end
else Inc(index);
end;
end;
end;
end;
// program penganimasian
procedure TForm1.SkeletonizeAnimate(var Points : TPoints ;
ALebar, ATinggi : integer);
Var
Lx, Ly, index : integer;
B, A, N, AN2, AN4 : byte;
NOff : TPoint;
Ubah : boolean;
Hapus : array of boolean;
Image : array of array of byte;
begin
SetLength(Image, ALebar+2);
for Lx := 0 to ALebar + 1 do begin
A-11
for Ly := 0 to ATinggi + 1 do begin
Image[Lx][Ly] := 0;
end;
end;
for index := 0 to High(Points) do
Image[Points[index].X+1][Points[index].Y+1] := 1;
SetLength(Hapus, length(Points));
Ubah := true;
while Ubah do begin
Ubah := false;
for index := 0 to High(Points) do begin
Hapus[index] := False;
Lx := Points[index].X +1;
Ly := Points[index].Y +1;
B := 0;
for N := 2 to 9 do begin
NOff := Tetangga(N);
Inc(B, Image[Lx+NOff.X][Ly+NOff.Y]);
A-12
if (B < 2) or (B > 6) then Continue;
A := 0;
for N := 2 to 9 do begin
NOff := Tetangga(N);
if Image[Lx+NOff.X][Ly+NOff.Y] = 0 then begin
NOff := Tetangga(N+1);
if Image[Lx+NOff.X][Ly+NOff.Y] = 1 then Inc(A);
end;
if A > 1 then Break;
end;
if A <> 1 then Continue;
AN2 := 0;
for N := 2 to 9 do begin
NOff := Tetangga(N);
if Image[Lx+NOff.X][Ly+NOff.Y+1] = 0 then begin
NOff := Tetangga(N+1);
if Image[Lx+NOff.X][Ly+NOff.Y+1] = 1 then Inc(AN2);
end;
end;
A-13
(AN2 = 1) then Continue;
AN4 := 0;
for N := 2 to 9 do begin
NOff := Tetangga(N);
if Image[Lx+NOff.X+1][Ly+NOff.Y] = 0 then begin
NOff := Tetangga(N+1);
if Image[Lx+NOff.X+1][Ly+NOff.Y] = 1 then Inc(AN4);
end;
end;
if (Image[Lx][Ly-1] * Image[Lx+1][Ly] * Image[Lx][Ly+1] = 0) or
(AN4 <> 1) then begin
Hapus[index] := True;
Ubah := True;
end;
end;
if Ubah then begin
index := 0;
while index < length(Points) do begin
if Hapus[index] then begin
A-14
Points[index] := Points[High(Points)];
SetLength(Points, High(Points));
Hapus[index] := Hapus[High(Hapus)];
SetLength(Hapus, High(Hapus));
end
else Inc(index);
end;
end;
Image1.Canvas.FillRect(Image1.ClientRect);
for Ly := 0 to High(Points) do begin
Image1.Canvas.Pixels[Points[Ly].X, Points[Ly].Y] := clblack;
end;
Image1.Refresh;
Sleep(200);
end;
end;
procedure TForm1.Button1Click(Sender: TObject);
var
Scan : PRGBTripleArray;
Lx, Ly : integer;
Points : TPoints;
A-15
UndoBitmap.Lebar := Image1.Lebar;
UndoBitmap.Tinggi := Image1.Tinggi;
UndoBitmap.Canvas.Draw(0, 0, Image1.Picture.Bitmap);
Button2.Enabled := True;
Button1.Enabled := False;
//mengambil array Points dari image
SetLength(Points, 0);
for Ly := 0 to Image1.Tinggi -1 do begin
Scan := Image1.Picture.Bitmap.ScanLine[Ly];
for Lx := 0 to Image1.Lebar -1 do begin
if Scan[Lx].rgbtgreen = 0 then begin
SetLength(Points, length(Points)+1 );
Points[High(Points)] := Point(Lx, Ly);
end;
end;
end;
if Animate1.Checked then
SkeletonizeAnimate(Points, Image1.Lebar, Image1.Tinggi) else
Skeletonize(Points, Image1.Lebar, Image1.Tinggi);
Image1.Canvas.FillRect(Image1.ClientRect);
for Lx := 0 to High(Points) do begin
A-16
end;
end;
1
Universitas Kristen Maranatha
BAB I
PENDAHULUAN
1.1 Latar Belakang
Seiring dengan perkembangan zaman yang semakin pesat, kebutuhan
akan efektifitas dan efisiensi sangat diutamakan dalam berbagai bidang. Hal
tersebut telah mendorong manusia untuk semakin berkreasi dan berinovasi
dalam bidang teknologi untuk dapat melakukan berbagai pekerjaan secara
otomatis.
Salah satu contoh pekerjaan tersebut adalah pencatatan plat nomor
secara otomatis. Dalam sistem ini terdapat 3 tahapan dalam pengerjaannya
yaitu penangkapan citra plat nomor oleh kamera, pemrosesan citra tersebut,
dan pembacaan oleh jaringan saraf tiruan.
Namun pada proses pembacaan oleh jaringan saraf tiruan seringkali
terjadi kesalahan dalam pembacaannya karena huruf dan angka pada plat
nomor tersebut terlalu tebal. Oleh karena itulah dipilih sebuah topik dengan
judul PEMBUATAN APLIKASI PENIPISAN CITRA TULISAN DENGAN
METODA HILDITCH sebagai topik tugas akhir.
1.2Rumusan Masalah
Berdasarkan latar belakang tersebut maka dirumuskanlah sebuah
permasalahan yang ada yaitu :
Bagaimana pembuatan aplikasi penipisan citra tulisan dengan metoda
hilditch ?
1.3 Tujuan
Tujuan dari tugas akhir ini adalah membuat aplikasi penipisan citra tulisan
2
Universitas Kristen Maranatha 1.4 Pembatasan Masalah
Pembatasan masalah dalam Tugas Akhir ini meliputi:
Menggunakan program Delphi 7 untuk membuat software penipisan citra.
Citra tulisan yang ditipiskan menggunakan algoritma Hilditch.
Jenis font terbatas pada font yang tidak menggunakan tipografi yang rumit.
Ekstensi file yang dapat digunakan hanya .BMP ( bitmap )
1.5 Sistematika Penulisan
Sistematika penulisan laporan ini disusun menjadi lima bab, yaitu
sebagai berikut:
BAB 1 : PENDAHULUAN
Bab ini membahas tentang latar belakang, perumusan masalah,
tujuan, pembatasan masalah, dan sistematika penulisan.
BAB 2 : LANDASAN TEORI
Bab ini membahas tentang dasar – dasar teori yang digunakan dalam
pembuatan dan perancangan tugas akhir ini.
BAB 3 : PERANCANGAN & PEMODELAN
Bab ini membahas tentang perancangan pada pembuatan aplikasi
penipisan citra tulisan dengan metoda Hilditch. Mulai dari
komponen – komponen yang digunakan dan program instruksi yang
digunakan.
BAB 4 : PEMBAHASAN MASALAH
Bab ini membahas tentang analisis dan pengujian keluaran –
keluaran dari aplikasi penipisan citra tulisan yang berupa huruf dan
angka yang telah ditipiskan.
BAB 5 : KESIMPULAN DAN SARAN
Bab ini membahas tentang kesimpulan yang diperoleh setelah
melaksanakan tugas akhir beserta masukan dan saran yang dapat
42
Universitas Kristen Maranatha
BAB V
KESIMPULAN DAN SARAN
Bab ini berisi kesimpulan dari Tugas Akhir dan saran-saran yang perlu
dilakukan untuk perbaikan yang akan dilakukan pada masa yang akan datang.
5.1 Kesimpulan
Kesimpulan yang didapat dari pembuatan aplikasi penipisan citra
tulisan dengan metoda hilditch adalah sebagai berikut :
1. Pembuatan aplikasi penipisan citra tulisan dengan metoda hilditch
sudah berhasil dibuat
2. Sering terjadi kendala karena citra bitmap yang didapat tidak
sempurna
3. Perlu adanya suatu program pendukung seperti noise removal atau
sharpning mask agar citra bitmap yang akan diproses dapat
ditipiskan dengan sempurna.
5.2 Saran
Saran untuk program aplikasi penipisan citra tulisan dengam
metoda hilditch adalah sebagai berikut :
1. Untuk perkembangan ke depannya aplikasi ini sebaiknya dapat
lebih baik lagi.
2. Dalam hal interface tampilannya dapat dibuat lebih menarik lagi.
3. Dapat ditambahkan fitur-fitur tambahan lainnya contohnya seperti
pengkonversian citra .JPEG ke citra .BITMAP, dan juga
43
Universitas Kristen Maranatha
DAFTAR PUSTAKA
Benley, Jon Louis, 1999, “Programming Pearls 2ndedition”
C Y Suen, dan P S P Wang. 1994. Thinning Methodologies for Pattern
recognition USA: World Scientific Publishing Co.Pte.Ltd.
Jason Rupard. “Skeletonization (part 1)”.
http://www.rupj.net/portfolio/docs/skeletonization.pdf. Diakses tanggal 7
september 2012.
H.E.Burdick, dan Mc Graw Hill. 1997. Morphological Operations.
Http://ppsc.pme.nthu.edu.tw/.../Chapter%209%20Morphological%20operatio
ns.pdf. Diakses tanggal 7 september 2012
S, Riyanto dkk. 2005. Step by Step Pengolahan Citra Digital. Yogyakarta:
Andi.
Supardi, Y. 2000. Pascal dan Flowchart lewat Praktek. Jakarta:Dinastindo.
http://id.wikipedia.org/wiki/Citra, November 2012
http://id.wikipedia.org/wiki/Borland_Delphi, November 2012
http://en.wikipedia.org/wiki/Digital_image, November 2012
http://en.wikipedia.org/wiki/Image_processing, November 2012