Implementasi Metode Edge Linking untuk Mendeteksi Garis Tepi pada Citra Digital, Setyo Nugroho

14

Click here to load reader

description

Implementasi Metode Edge Linking untuk Mendeteksi Garis Tepi pada Citra Digital, Setyo Nugroho.Laporan Penelitian Jurusan Teknik Informatika STIKOM Balikpapan, 2005.Proses edge detection yang dilanjutkan dengan edge linking dapat digunakan untukmelakukan segmentasi citra, yaitu memisahkan citra menjadi bagian-bagian atau objek-objeknyasehingga dapat dianalisa lebih lanjut. Sampai sejauh mana pembagian tersebut dilakukantergantung pada masalah yang dihadapi. Idealnya, langkah segmentasi tersebut dihentikan padasaat objek yang diinginkan sudah berhasil dipisahkan.Secara umum segmentasi adalah salah satu pekerjaan yang sulit dalam pengolahan citra.Namun dengan menggunakan teknik segmentasi yang tepat dan efektif, dapat diperoleh hasil yangmemuaskan.

Transcript of Implementasi Metode Edge Linking untuk Mendeteksi Garis Tepi pada Citra Digital, Setyo Nugroho

Page 1: Implementasi Metode Edge Linking untuk Mendeteksi Garis Tepi pada Citra Digital, Setyo Nugroho

LAPORAN PENELITIAN

JURUSAN TEKNIK INFORMATIKA

STIKOM BALIKPAPAN

IMPLEMENTASI METODE EDGE LINKING

UNTUK MENDETEKSI GARIS TEPI

PADA CITRA DIGITAL

oleh

Setyo Nugroho

Jurusan Teknik Informatika

STIKOM Balikpapan

2005

Page 2: Implementasi Metode Edge Linking untuk Mendeteksi Garis Tepi pada Citra Digital, Setyo Nugroho

1

DAFTAR ISI

LANDASAN TEORI ........................................................................................................ 2 Segmentasi Citra................................................................................................................. 2

Deteksi Diskontinuitas........................................................................................................ 2

Point Detection ................................................................................................................... 3

Line Detection .................................................................................................................... 3

Edge Detection.................................................................................................................... 4

Edge Linking ...................................................................................................................... 5

CARA PENELITIAN....................................................................................................... 6 File citra digital dengan format BMP ................................................................................. 6

Proses Edge Linking ........................................................................................................... 7

HASIL DAN PEMBAHASAN......................................................................................... 8

PENUTUP ......................................................................................................................... 9

DAFTAR PUSTAKA........................................................................................................ 9

LAMPIRAN .................................................................................................................... 10

Page 3: Implementasi Metode Edge Linking untuk Mendeteksi Garis Tepi pada Citra Digital, Setyo Nugroho

2

LANDASAN TEORI

Segmentasi Citra

Segmentasi citra (image segmentation) merupakan langkah awal pada proses analisa citra

yang bertujuan untuk mengambil informasi yang terdapat di dalam suatu citra. Segmentasi citra

membagi suatu citra ke dalam bagian-bagian atau objek-objek. Sampai sejauh mana pembagian

tersebut dilakukan tergantung pada masalah yang dihadapi. Idealnya, langkah segmentasi tersebut

dihentikan pada saat objek yang diinginkan sudah berhasil dipisahkan.

Pada umumnya segmentasi secara otomatis adalah salah satu pekerjaan yang sulit dalam

pengolahan citra. Langkah ini akan menentukan berhasil atau tidaknya proses analisa citra. Namun

dengan segmentasi yang efektif, kemungkinan besar akan didapatkan hasil yang baik.

Algoritma segmentasi untuk citra monochrome biasanya berdasarkan pada satu dari dua

sifat nilai gray-level: diskontinuitas dan similaritas. Pada diskontinuitas, pendekatan yang

dilakukan adalah memisahkan citra berdasarkan terjadinya perubahan nilai graylevel yang drastis.

Sedangkan pada similaritas, pendekatan dilakukan berdasarkan thresholding, region growing,

region splitting, dan merging.

Deteksi Diskontinuitas

Ada tiga jenis diskontinuitas pada citra digital, yaitu: point (titik), line (garis), dan edge

(batas). Dalam prakteknya, cara yang paling umum digunakan untuk menemukan diskontinuitas

pada citra adalah dengan menggunakan mask yang dioperasikan ke seluruh pixel yang ada di

dalam citra tersebut. Dengan menggunakan mask berukuran 3 x 3 seperti pada gambar berikut,

akan didapatkan hasil:

R = w1z1 + w2z2 + … + w9z9

dimana zi adalah graylevel dari pixel yang bersesuaian dengan koefisien mask wi.

w1 w2 w3

w4 w5 w6

w7 w8 w9

Page 4: Implementasi Metode Edge Linking untuk Mendeteksi Garis Tepi pada Citra Digital, Setyo Nugroho

3

Point Detection

Cara mendeteksi titik (point) yang terisolasi adalah langsung menggunakan mask pada

gambar berikut.

-1 -1 -1

-1 8 -1

-1 -1 -1

Suatu titik dikatakan terdeteksi di lokasi pusat dari mask jika

|R| > T

dimana T adalah threshold positif, dan R adalah hasil perhitungan dari :

R = w1z1 + w2z2 + … + w9z9

dengan menggunakan mask tersebut di atas.

Pada dasarnya apa yang dilakukan di sini adalah mengukur besarnya perbedaan graylevel

antara titik tengah dengan titik-titik tetangganya (neighbor). Idenya adalah bahwa suatu titik yang

terisolasi akan memiliki perbedaan graylevel yang cukup besar dengan titik-titik tetangganya.

Line Detection

Tingkatan selanjutnya dalam deteksi diskontinuitas adalah pendeteksian garis. Untuk

mendeteksi adanya suatu garis, bisa digunakan mask berikut:

-1 -1 -1

2 2 2

-1 -1 -1

Horisontal

-1 -1 2

-1 2 -1

2 -1 -1

+45°

-1 2 -1

-1 2 -1

-1 2 -1

Vertikal

2 -1 -1

-1 2 -1

-1 -1 2

-45°

Mask yang pertama akan memberikan respon yang kuat pada garis yang memiliki arah

horisontal. Sedangkan mask-mask berikutnya dapat digunakan untuk mendeteksi garis yang

memiliki arah 45°, vertikal, dan -45°. Tampak bahwa arah garis yang dideteksi sesuai dengan arah

koefisien mask yang nilainya lebih besar dari yang lain, yaitu 2.

Jika R1, R2, R3, dan R4 adalah response dari keempat mask yang ada di gambar di atas, dan

keempatnya dijalankan pada pixel yang sama, maka nilai R yang tertinggi menunjukkan arah yang

paling mendekati arah pixel tersebut.

Page 5: Implementasi Metode Edge Linking untuk Mendeteksi Garis Tepi pada Citra Digital, Setyo Nugroho

4

Edge Detection

Edge detection adalah pendekatan yang paling umum digunakan untuk mendeteksi

diskontinuitas graylevel. Hal ini disebabkan karena titik ataupun garis yang terisolasi tidak terlalu

sering dijumpai dalam aplikasi praktis.

Suatu edge adalah batas antara dua region yang memiliki graylevel yang relatif berbeda.

Pada dasarnya ide yang ada di balik sebagian besar teknik edge-detection adalah menggunakan

perhitungan local derivative operator.

Gradien dari suatu citra f(x,y) pada lokasi (x,y) adalah vektor

Dalam edge detection nilai yang penting di sini adalah magnitude dari vektor, yang

biasanya hany disebut dengan gradien dan dituliskan dengan ∇f , dimana:

Pada umumnya digunakan pendekatan nilai gradien tersebut dengan nilai absolut:

Rumus tersebut lebih mudah diimplementasikan, khususnya jika menggunakan hardware

untuk pemrosesan.

Arah dari vektor gradien juga merupakan kuantitas yang penting. Jika α(x,y) menunjukkan

arah sudut vektor ∇f pada (x,y), maka dari analisa vektor:

di mana arah sudut diukur terhadap sumbu x.

Derivatif juga bisa diimplementasikan secara digital dengan menggunakan operator Sobel,

yaitu dengan menggunakan mask berikut

-1 -2 -1

0 0 0

1 2 1

Mask untuk menghitung Gx

-1 0 1

-2 0 2

-1 0 1

Mask untuk menghitung Gy

∂∂

=

=∇

y

fx

f

G

G

y

xf

[ ]22)( yx GGmagf +=∇=∇ f

yx GGf +≈∇

= −

y

x

G

Gyx

1tan),(α

Page 6: Implementasi Metode Edge Linking untuk Mendeteksi Garis Tepi pada Citra Digital, Setyo Nugroho

5

Edge Linking

Secara ideal, teknik yang digunakan untuk mendeteksi diskontinuitas seharusnya hanya

menghasilkan pixel-pixel yang berada pada batas region. Namun dalam prakteknya hal ini jarang

terjadi karena adanya noise, batas yang terpisah karena pencahayaan yang tidak merata, dan efek

lain yang mengakibatkan variasi intensitas. Untuk itu algoritma edge-detection biasanya

dilanjutkan dengan prosedur edge-linking untuk merangkai pixel-pixel tersebut menjadi satu

kesatuan sehingga memberikan suatu informasi yang berarti.

Salah satu teknik yang dapat digunakan untuk edge-linking adalah local processing, yaitu

dengan menganalisa karakteristik pixel-pixel di dalam suatu neighborhood (3 x 3 atau 5 x 5) pada

semua titik (x,y) di dalam citra yang telah mengalami edge-detection. Selanjutnya semua titik yang

sejenis dihubungkan sehingga membentuk kumpulan pixel yang memiliki sifat-sifat yang sama.

Dua sifat utama yang digunakan untuk menentukan kesamaan edge pixel dalam analisa ini

adalah:

1. Besarnya respon gradient operator yang digunakan

2. Arah gradient

Sifat yang pertama dinyatakan dengan nilai ∇f yang telah dibahas sebelumnya. Jadi suatu

edge pixel dengan koordinat (x’,y’) dan bertetangga dengan (x,y), dikatakan memiliki magnitude

sama dengan pixel di (x,y) jika:

dimana T adalah threshold positif.

Sedangkan arah vektor gradient dinyatakan dengan α(x,y) yang juga telah dibahas

sebelumnya. Suatu edge pixel dengan koordinat (x’,y’) dan bertetangga dengan (x,y), dikatakan

memiliki sudut yang sama dengan pixel di (x,y) jika:

dimana A adalah threshold sudut.

Suatu titik yang menjadi tetangga dari (x,y) dihubungkan dengan titik (x,y) jika memenuhi

kedua kriteria di atas, baik magnitude maupun sudutnya. Proses linking ini diulang untuk seluruh

lokasi titik yang ada di dalam citra.

Tyxfyxf ≤∇−∇ )','(),(

Ayxyx <− )','(),( αα

Page 7: Implementasi Metode Edge Linking untuk Mendeteksi Garis Tepi pada Citra Digital, Setyo Nugroho

6

CARA PENELITIAN

Untuk mengimplementasikan proses contrast stretching pada komputer, penulis membuat

program yang memiliki kemampuan untuk:

• membuka file yang berisi citra digital

• menampilkan citra digital tersebut di layar

• melakukan pemrosesan edge linking

• menampilkan citra digital hasil proses

Adapun batasan dari program ini adalah:

• file citra yang digunakan harus berformat BMP, berukuran 256x256 pixel, dengan

256 gray-level

File citra digital dengan format BMP

File citra dengan format BMP adalah salah satu format standar yang digunakan dalam

sistem operasi Windows. File ini biasanya disimpan dengan ekstensi .BMP. Struktur dari file BMP

adalah sebagai berikut:

BITMAPFILEHEADER

BITMAPINFOHEADER

Array RGBQUAD

Array warna

Struktur BITMAPFILEHEADER menunjukkan jenis file dan ukuran file. Struktur

BITMAPINFOHEADER menunjukkan ukuran (lebar dan tinggi) dari citra, format warna citra,

dan banyaknya warna yang digunakan di dalam citra. Struktur RGBQUAD berisi nilai intensitas

warna yang dibagi menjadi komponen R, G, dan B (red, green, dan blue). Sedangkan array warna

berisi informasi mengenai isi citra itu sendiri, yaitu pixel-pixel yang membentuk citra tersebut.

Untuk mempercepat proses pengolahan citra digital, maka pixel-pixel yang ada di dalam

file BMP dicopykan ke dalam variabel array. Dengan demikian pada proses selanjutnya tidak perlu

dilakukan pembacaan file secara berulang-ulang. Deklarasi array untuk menyimpan citra tersebut

adalah:

arCitra1 : array[1..256, 1..256] of byte;

arCitra2 : array[1..256, 1..256] of byte;

Secara lengkap, proses peng-copy-an pixel ini dapat dilihat pada procedure BukaFileCitra

di listing program terlampir. Untuk menampilkan citra ke layar, digunakan component TImage

dari Delphi.

Page 8: Implementasi Metode Edge Linking untuk Mendeteksi Garis Tepi pada Citra Digital, Setyo Nugroho

7

Proses Edge Linking

Setelah semua pixel tersimpan di dalam variabel array, dilakukan perhitungan komponen

Gx dan komponen Gy dari gradien. Proses ini terdapat di dalam procedure HitungKomponenGX

dan HitungKomponenGY di dalam program. Data hasil perhitungan ini kemudian disimpan ke

dalam array tersendiri dan dapat ditampilkan ke layar. Untuk menghasilkan komponen Gx dan Gy

ini digunakan operator Sobel.

Berikut ini kutipan perintah di dalam program untuk menghitung komponen Gx dan Gy

dengan menggunakan operator Sobel:

GX :=

(-1 * arCitra1[ix-1,iy-1]) +

(-2 * arCitra1[ix,iy-1]) +

(-1 * arCitra1[ix+1,iy-1]) +

(1 * arCitra1[ix-1,iy+1]) +

(2 * arCitra1[ix,iy+1]) +

(1 * arCitra1[ix+1,iy+1]);

GY :=

(-1 * arCitra1[ix-1,iy-1]) +

(1 * arCitra1[ix+1,iy-1]) +

(-2 * arCitra1[ix-1,iy]) +

(2 * arCitra1[ix+1,iy]) +

(-1 * arCitra1[ix-1,iy+1]) +

(1 * arCitra1[ix+1,iy+1]);

Implementasi selengkapnya dapat dilihat pada listing program terlampir.

Setelah perhitungan komponen gradien selesai, dilanjutkan dengan proses perhitungan

magnitude dari gradien dan besar sudut gradien dari masing-masing pixel. Magnitude dari gradien

dapat diperoleh dengan rumus pendekatan

Sedangkan besar sudut gradien diperoleh dengan rumus

Setelah diperoleh kedua informasi di atas, dilakukan proses edge linking dengan cara

memandingkan setiap pixel dengan pixel tetangganya. Jika perbedaan dari magnitude maupun

perbedaan dari sudut gradien antara suatu pixel dengan pixel tetangganya memenuhi kriteria yang

ditentukan, maka kedua pixel tersebut dianggap terhubung.

Penentuan nilai untuk kedua kriteria ini dapat dilakukan dengan memasukkan nilai

tersebut pada kotak dialog yang tersedia pada program.

yx GGf +≈∇

= −

y

x

G

Gyx

1tan),(α

Page 9: Implementasi Metode Edge Linking untuk Mendeteksi Garis Tepi pada Citra Digital, Setyo Nugroho

8

HASIL DAN PEMBAHASAN

Berikut ini contoh hasil ujicoba program pada suatu citra digital yang diproses dengan

menggunakan edge lingking.

Tampilan citra awal:

Tampilan komponen gradien Gx dan Gy dari citra:

Pada citra komponen Gx tampak bahwa batas yang terdeteksi adalah yang mendekati arah

horisontal, sedangkan pada komponen Gy batas yang terdeteksi adalah yang mendekati arah

vertikal.

Page 10: Implementasi Metode Edge Linking untuk Mendeteksi Garis Tepi pada Citra Digital, Setyo Nugroho

9

Tampilan citra hasil edge linking:

Pada citra hasil edge linking tampak bahwa bagian yang berwarna terang menunjukkan

adanya perubahan nilai intensitas yang besar pada citra asal.

Dari contoh kasus tersebut, terlihat bahwa dengan melakukan proses edge linking kita

dapat memperoleh citra baru yang menampilkan bagian-bagian atau objek-objek yang terdapat di

dalam citra tersebut sehingga dapat dilakukan analisa lebih lanjut.

PENUTUP

Proses edge detection yang dilanjutkan dengan edge linking dapat digunakan untuk

melakukan segmentasi citra, yaitu memisahkan citra menjadi bagian-bagian atau objek-objeknya

sehingga dapat dianalisa lebih lanjut. Sampai sejauh mana pembagian tersebut dilakukan

tergantung pada masalah yang dihadapi. Idealnya, langkah segmentasi tersebut dihentikan pada

saat objek yang diinginkan sudah berhasil dipisahkan.

Secara umum segmentasi adalah salah satu pekerjaan yang sulit dalam pengolahan citra.

Namun dengan menggunakan teknik segmentasi yang tepat dan efektif, dapat diperoleh hasil yang

memuaskan.

DAFTAR PUSTAKA

• Rafael C. Gonzalez, Richard E. Woods, 1993, Digital Image Processing, Addison-Wesley

Publishing Company Inc., USA.

• David Marshall, 1994, Vision Systems,

http://www.cs.cf.ac.uk/Dave/Vision_lecture/node1.html.

• Microsoft Corporation, 1996, Microsoft Win32 Programmer’s Reference, Microsoft

Corporation.

Page 11: Implementasi Metode Edge Linking untuk Mendeteksi Garis Tepi pada Citra Digital, Setyo Nugroho

10

LAMPIRAN

Listing Program program PCD1; uses Forms, PCDUnit1 in 'PCDUnit1.pas' {Form1}, PCDAbout in 'PCDAbout.pas' {AboutBox}, PCDUnit2 in 'PCDUnit2.pas' {frmStat}, Histo in 'Histo.pas' {frmHisto}, PCDContrast in 'PCDContrast.pas' {frmContrast}, Un_Mask in 'Un_Mask.pas' {frmMask}, Un_EdgeLinking in 'Un_EdgeLinking.pas' {frmEdgeLinking}; {$R *.RES} begin Application.Initialize; Application.CreateForm(TForm1, Form1); Application.CreateForm(TAboutBox, AboutBox); Application.CreateForm(TfrmStat, frmStat); Application.CreateForm(TfrmHisto, frmHisto); Application.CreateForm(TfrmContrast, frmContrast); Application.CreateForm(TfrmMask, frmMask); Application.CreateForm(TfrmEdgeLinking, frmEdgeLinking); Application.Run; end. { Pengolahan citra digital. Input: - File citra dg format BMP, ukuran 256x256 pixel, 256 level grayscale Output: - Tampilan citra sebelum diproses. - Tampilan citra setelah diproses dengan contrast stretching. - Statistik pixel citra. - Histogram citra. } unit PCDUnit1; interface uses Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs, Menus, ExtCtrls, StdCtrls, Buttons, ComCtrls; type TForm1 = class(TForm) Image1: TImage; Image2: TImage; Label1: TLabel; Label2: TLabel; OpenDialog1: TOpenDialog; MainMenu1: TMainMenu; File1: TMenuItem; Open1: TMenuItem; Proses1: TMenuItem; Statistik1: TMenuItem; ContrastStretching1: TMenuItem; About1: TMenuItem; Bevel1: TBevel; Help1: TMenuItem; Exit2: TMenuItem;

ViewHistogram1: TMenuItem; View1: TMenuItem; MaskProcessingFiltering1: TMenuItem; Exit1: TMenuItem; EdgeLinking1: TMenuItem; SaveResultAs1: TMenuItem; SaveDialog1: TSaveDialog; N1: TMenuItem; N2: TMenuItem; N3: TMenuItem; procedure Open1Click(Sender: TObject); procedure ContrastStretching1Click(Sender: TObject); procedure About1Click(Sender: TObject); procedure Statistik1Click(Sender: TObject); procedure FormCreate(Sender: TObject); procedure Exit2Click(Sender: TObject); procedure ViewHistogram1Click(Sender: TObject); procedure MaskProcessingFiltering1Click(Sender: TObject); procedure Exit1Click(Sender: TObject); procedure SaveResultAs1Click(Sender: TObject); procedure EdgeLinking1Click(Sender: TObject); private { Private declarations } public { Public declarations } end; var Form1: TForm1; { variabel global } arCitra1 : array[1..256, 1..256] of byte; arCitra2 : array[1..256, 1..256] of byte; arHistogram1 : array[0..255] of longint; arHistogram2 : array[0..255] of longint; nmfile : string; c1, c2, d1, d2 : integer; { parameter utk contrast stretching } arMask : array[1..9] of integer; faktorPembagiMask : real; procedure TampilkanHasil; implementation uses PCDAbout, PCDUnit2, Histo, PCDContrast, Un_Mask, Math, Un_EdgeLinking; {$R *.DFM} {-------------------------------------------------------------------------} procedure BukaFileCitra; { syarat: file citra berformat BMP, berukuran 256x256, 256 level grayscale } var i, ix, iy : integer; warna : longint; warnab : byte; bfh : TBitmapFileHeader; bih : TBitmapInfoHeader; colorTbl : array[0..255] of TRGBQuad; mst : TMemoryStream; b : byte; numColor : integer; syarat : boolean; bm : TBitmap; begin

Page 12: Implementasi Metode Edge Linking untuk Mendeteksi Garis Tepi pada Citra Digital, Setyo Nugroho

11

{ buka file citra, copykan semua pixel citra ke dalam array } mst := TMemoryStream.Create; mst.LoadFromFile(nmfile); mst.ReadBuffer(bfh, sizeof(bfh)); mst.ReadBuffer(bih, sizeof(bih)); if (bih.biWidth <> 256) or (bih.biHeight <> 256) or (bih.biBitCount <> 8) then begin MessageDlg('Format file salah! Hanya bisa membuka file BMP berukuran 256x256, 8 bit per pixel.', mtError, [mbOK], 0); mst.Free; exit; end; if bih.biClrUsed<256 then numColor:=bih.biClrUsed else numColor:=256; for i:=0 to numColor-1 do mst.ReadBuffer(colorTbl[i], 4); for iy:=256 downto 1 do begin for ix:=1 to 256 do begin mst.ReadBuffer(b, 1); warna := longint(colorTbl[b]); arCitra1[ix,iy] := (byte(warna) + byte(warna shr 8) + byte(warna shr 16)) div 3; arCitra2[ix,iy] := 0; end; end; mst.Free; { tampilkan file citra di image1 } form1.image1.Picture.LoadFromFile(nmfile); { bersihkan image2 } form1.Image2.Canvas.Brush.Color := clBlack; form1.Image2.Canvas.FillRect(Rect(0, 0, 256, 256)); end; {-------------------------------------------------------------------------} procedure TampilkanHasil; var ix, iy : integer; warna : longint; warnab : byte; begin { tampilkan citra setelah diproses } for ix:=1 to 256 do begin for iy:=1 to 256 do begin warnab := arCitra2[ix,iy]; warna := warnab or (longint(warnab) shl 8) or (longint(warnab) shl 16); form1.image2.Canvas.Pixels[ix-1,iy-1] := warna; end; end; end; {-------------------------------------------------------------------------} procedure HitungStatistikCitra; var ix, iy : integer; warnab : byte; tmp : longint; s : string; pix_rerata, pix_max, pix_min : byte; begin frmStat.Memo1.Text := ''; frmStat.Memo1.Lines.Add('Nama file citra: ' + nmfile); frmStat.Memo1.Lines.Add(''); { --- citra 1 ---} frmStat.Memo1.Lines.Add('Statistik citra sebelum diproses:'); { init variabel } pix_max := 0; pix_min := 255; tmp := 0; { Hitung nilai pixel rata-rata, tertinggi, terendah (dalam greyscale level)} for ix:=1 to 256 do begin for iy:=1 to 256 do begin

warnab := arCitra1[ix,iy]; if warnab > pix_max then pix_max := warnab; if warnab < pix_min then pix_min := warnab; tmp := tmp + warnab; end; end; pix_rerata := round( tmp / (256 * 256) ); Str(pix_min, s); frmStat.Memo1.Lines.Add(' Nilai pixel terendah : ' + s); Str(pix_max, s); frmStat.Memo1.Lines.Add(' Nilai pixel tertinggi : ' + s); Str(pix_rerata, s); frmStat.Memo1.Lines.Add(' Nilai pixel rata-rata : ' + s); { --- citra 2 ---} frmStat.Memo1.Lines.Add(''); frmStat.Memo1.Lines.Add('Statistik citra setelah diproses:'); { init variabel } pix_max := 0; pix_min := 255; tmp := 0; { Hitung nilai pixel rata-rata, tertinggi, terendah (dalam greyscale level)} for ix:=1 to 256 do begin for iy:=1 to 256 do begin warnab := arCitra2[ix,iy]; if warnab > pix_max then pix_max := warnab; if warnab < pix_min then pix_min := warnab; tmp := tmp + warnab; end; end; pix_rerata := round( tmp / (256 * 256) ); Str(pix_min, s); frmStat.Memo1.Lines.Add(' Nilai pixel terendah : ' + s); Str(pix_max, s); frmStat.Memo1.Lines.Add(' Nilai pixel tertinggi : ' + s); Str(pix_rerata, s); frmStat.Memo1.Lines.Add(' Nilai pixel rata-rata : ' + s); end; {=========================================================================} procedure TForm1.Open1Click(Sender: TObject); begin OpenDialog1.Execute; if OpenDialog1.FileName <> '' Then begin nmfile := Form1.OpenDialog1.FileName; BukaFileCitra; UpdateHistogram; end; end; procedure TForm1.ContrastStretching1Click(Sender: TObject); begin frmContrast.Show; end; procedure TForm1.About1Click(Sender: TObject); begin AboutBox.ShowModal; end; procedure TForm1.Statistik1Click(Sender: TObject); begin HitungStatistikCitra; frmStat.Show; end;

Page 13: Implementasi Metode Edge Linking untuk Mendeteksi Garis Tepi pada Citra Digital, Setyo Nugroho

12

procedure TForm1.FormCreate(Sender: TObject); begin { bersihkan image1 & image2 } form1.Image1.Canvas.Brush.Color := clBlack; form1.Image1.Canvas.FillRect(Rect(0, 0, 256, 256)); form1.Image2.Canvas.Brush.Color := clBlack; form1.Image2.Canvas.FillRect(Rect(0, 0, 256, 256)); //temp: nmfile := 'cameraman.bmp'; BukaFileCitra; end; procedure TForm1.Exit2Click(Sender: TObject); begin form1.close; end; procedure TForm1.ViewHistogram1Click(Sender: TObject); begin ViewHistogram1.Checked := not ViewHistogram1.Checked; frmHisto.Visible := ViewHistogram1.Checked; end; procedure TForm1.MaskProcessingFiltering1Click(Sender: TObject); begin frmMask.Show; end; procedure TForm1.Exit1Click(Sender: TObject); begin form1.close; end; procedure TForm1.SaveResultAs1Click(Sender: TObject); var nmfile2 : string; begin SaveDialog1.Execute; if SaveDialog1.FileName <> '' Then begin nmfile2 := Form1.SaveDialog1.FileName; Form1.Image2.Picture.Bitmap.PixelFormat := pf8bit; Form1.Image2.Picture.Bitmap.SaveToFile(nmfile2); end; end; procedure TForm1.EdgeLinking1Click(Sender: TObject); begin frmEdgeLinking.Show; end; end. unit Un_EdgeLinking; interface uses Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls, Spin; type TfrmEdgeLinking = class(TForm) btnApply: TButton; btnClose: TButton; SpinEdit1: TSpinEdit; Label1: TLabel; Label2: TLabel; SpinEdit2: TSpinEdit; btnGX: TButton; btnGY: TButton;

procedure btnApplyClick(Sender: TObject); procedure btnCloseClick(Sender: TObject); procedure btnGXClick(Sender: TObject); procedure btnGYClick(Sender: TObject); private { Private declarations } public { Public declarations } end; var frmEdgeLinking: TfrmEdgeLinking; implementation uses PCDUnit1, Histo, Math; {$R *.DFM} {-------------------------------------------------------------------------} procedure HitungKomponenGX; var ix, iy : integer; GX : single; begin for ix:=1 to 256 do begin for iy:=1 to 256 do begin if (ix > 1) and (ix < 256) and (iy > 1) and (iy < 256) then begin GX := (-1 * arCitra1[ix-1,iy-1]) + (-2 * arCitra1[ix,iy-1]) + (-1 * arCitra1[ix+1,iy-1]) + (1 * arCitra1[ix-1,iy+1]) + (2 * arCitra1[ix,iy+1]) + (1 * arCitra1[ix+1,iy+1]); if GX < 0 then GX := 0; if GX > 255 then GX := 255; arCitra2[ix,iy] := Round(GX); end else arCitra2[ix,iy] := arCitra1[ix,iy]; end; end; end; {-------------------------------------------------------------------------} procedure HitungKomponenGY; var ix, iy : integer; GY : single; begin for ix:=1 to 256 do begin for iy:=1 to 256 do begin if (ix > 1) and (ix < 256) and (iy > 1) and (iy < 256) then begin GY := (-1 * arCitra1[ix-1,iy-1]) + (1 * arCitra1[ix+1,iy-1]) + (-2 * arCitra1[ix-1,iy]) + (2 * arCitra1[ix+1,iy]) + (-1 * arCitra1[ix-1,iy+1]) + (1 * arCitra1[ix+1,iy+1]); if GY < 0 then GY := 0; if GY > 255 then GY := 255; arCitra2[ix,iy] := Round(GY); end else arCitra2[ix,iy] := arCitra1[ix,iy]; end; end; end; {-------------------------------------------------------------------------} procedure EdgeLinking; var ix, iy : integer; arGradient : array[1..256, 1..256] of byte; arAngle : array[1..256, 1..256] of single;

Page 14: Implementasi Metode Edge Linking untuk Mendeteksi Garis Tepi pada Citra Digital, Setyo Nugroho

13

warna : longint; warnab : byte; warnab2 : byte; GX, GY, G, Angle : single; thres_T, thres_A : single; thres_graylevel : byte; begin // isi array gradient dan angle for ix:=1 to 256 do begin for iy:=1 to 256 do begin if (ix > 1) and (ix < 256) and (iy > 1) and (iy < 256) then begin GX := (-1 * arCitra1[ix-1,iy-1]) + (-2 * arCitra1[ix,iy-1]) + (-1 * arCitra1[ix+1,iy-1]) + (1 * arCitra1[ix-1,iy+1]) + (2 * arCitra1[ix,iy+1]) + (1 * arCitra1[ix+1,iy+1]); GY := (-1 * arCitra1[ix-1,iy-1]) + (1 * arCitra1[ix+1,iy-1]) + (-2 * arCitra1[ix-1,iy]) + (2 * arCitra1[ix+1,iy]) + (-1 * arCitra1[ix-1,iy+1]) + (1 * arCitra1[ix+1,iy+1]); G := Abs(GX) + Abs(GY); if GX <> 0 Then Angle := ArcTan2(GY, GX) else Angle := Pi/2; if G > 255 then G := 255; arGradient[ix,iy] := round(G); arAngle[ix,iy] := Angle; end; end; end; // inisialisasi for ix:=1 to 256 do begin for iy:=1 to 256 do begin arCitra2[ix,iy] := 0; end; end; thres_T := frmEdgeLinking.SpinEdit1.Value; thres_A := frmEdgeLinking.SpinEdit2.Value * pi / 180; // konversi derajat ke radian thres_graylevel := 120; // proses edge linking for ix:=1 to 256 do begin for iy:=1 to 256 do begin if (ix > 1) and (ix < 256) and (iy > 1) and (iy < 256) then begin if (Abs(arGradient[ix+1,iy] - arGradient[ix,iy]) <= thres_T) and (Abs(arAngle[ix+1,iy] - arAngle[ix,iy]) < thres_A) then begin arCitra2[ix,iy] := Round(arGradient[ix,iy]); arCitra2[ix+1,iy] := Round(arGradient[ix+1,iy]); end; if (Abs(arGradient[ix,iy+1] - arGradient[ix,iy]) <= thres_T) and (Abs(arAngle[ix,iy+1] - arAngle[ix,iy]) < thres_A) then begin arCitra2[ix,iy] := Round(arGradient[ix,iy]); arCitra2[ix,iy+1] := Round(arGradient[ix,iy+1]); end; if (Abs(arGradient[ix+1,iy+1] - arGradient[ix,iy]) <= thres_T) and (Abs(arAngle[ix+1,iy+1] - arAngle[ix,iy]) < thres_A) then begin arCitra2[ix,iy] := Round(arGradient[ix,iy]); arCitra2[ix+1,iy+1] := Round(arGradient[ix+1,iy+1]); end;

end else arCitra2[ix,iy] := arCitra1[ix,iy]; end; end; end; procedure TfrmEdgeLinking.btnApplyClick(Sender: TObject); begin btnApply.Enabled := False; Screen.Cursor := crHourGlass; EdgeLinking; TampilkanHasil; UpdateHistogram; btnApply.Enabled := True; Screen.Cursor := crDefault; end; procedure TfrmEdgeLinking.btnCloseClick(Sender: TObject); begin Close; end; procedure TfrmEdgeLinking.btnGXClick(Sender: TObject); begin Screen.Cursor := crHourGlass; HitungKomponenGX; TampilkanHasil; UpdateHistogram; Screen.Cursor := crDefault; end; procedure TfrmEdgeLinking.btnGYClick(Sender: TObject); begin Screen.Cursor := crHourGlass; HitungKomponenGY; TampilkanHasil; UpdateHistogram; Screen.Cursor := crDefault; end; end.