Anda di halaman 1dari 14

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
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

1
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

2
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 -1 -1 2 -1 2 -1 2 -1 -1
2 2 2 -1 2 -1 -1 2 -1 -1 2 -1

-1 -1 -1 2 -1 -1 -1 2 -1 -1 -1 2

Horisontal +45° Vertikal -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.

3
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

 ∂f 
G x   ∂x 
∇f =   =  ∂f 
G y   
 ∂y 

Dalam edge detection nilai yang penting di sini adalah magnitude dari vektor, yang
biasanya hany disebut dengan gradien dan dituliskan dengan ∇f , dimana:

∇f = mag (∇f ) = [G 2
x + G y2 ]
Pada umumnya digunakan pendekatan nilai gradien tersebut dengan nilai absolut:

∇f ≈ G x + G y

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:

 Gx 
α ( x, y ) = tan −1  

G
 y

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 -1 0 1
0 0 0 -2 0 2

1 2 1 -1 0 1

Mask untuk menghitung Gx Mask untuk menghitung Gy

4
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:

∇f ( x , y ) − ∇f ( x ' , y ' ) ≤ T

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:

α ( x, y ) − α ( x ' , y ' ) < A

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.

5
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.

6
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

∇f ≈ G x + G y

Sedangkan besar sudut gradien diperoleh dengan rumus

 Gx 
α ( x, y ) = tan −1  

G
 y

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.

7
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.

8
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.

9
LAMPIRAN

Listing Program

program PCD1; ViewHistogram1: TMenuItem;


View1: TMenuItem;
uses MaskProcessingFiltering1: TMenuItem;
Forms, Exit1: TMenuItem;
PCDUnit1 in 'PCDUnit1.pas' {Form1}, EdgeLinking1: TMenuItem;
PCDAbout in 'PCDAbout.pas' {AboutBox}, SaveResultAs1: TMenuItem;
PCDUnit2 in 'PCDUnit2.pas' {frmStat}, SaveDialog1: TSaveDialog;
Histo in 'Histo.pas' {frmHisto}, N1: TMenuItem;
PCDContrast in 'PCDContrast.pas' {frmContrast}, N2: TMenuItem;
Un_Mask in 'Un_Mask.pas' {frmMask}, N3: TMenuItem;
Un_EdgeLinking in 'Un_EdgeLinking.pas' procedure Open1Click(Sender: TObject);
{frmEdgeLinking}; procedure ContrastStretching1Click(Sender: TObject);
procedure About1Click(Sender: TObject);
{$R *.RES} procedure Statistik1Click(Sender: TObject);
procedure FormCreate(Sender: TObject);
begin procedure Exit2Click(Sender: TObject);
Application.Initialize; procedure ViewHistogram1Click(Sender: TObject);
Application.CreateForm(TForm1, Form1); procedure MaskProcessingFiltering1Click(Sender:
Application.CreateForm(TAboutBox, AboutBox); TObject);
Application.CreateForm(TfrmStat, frmStat); procedure Exit1Click(Sender: TObject);
Application.CreateForm(TfrmHisto, frmHisto); procedure SaveResultAs1Click(Sender: TObject);
Application.CreateForm(TfrmContrast, frmContrast); procedure EdgeLinking1Click(Sender: TObject);
Application.CreateForm(TfrmMask, frmMask); private
Application.CreateForm(TfrmEdgeLinking, { Private declarations }
frmEdgeLinking); public
Application.Run; { Public declarations }
end. end;

{ var
Pengolahan citra digital. Form1: TForm1;

Input: { variabel global }


- File citra dg format BMP, ukuran 256x256 pixel, 256 level arCitra1 : array[1..256, 1..256] of byte;
grayscale arCitra2 : array[1..256, 1..256] of byte;
arHistogram1 : array[0..255] of longint;
Output: arHistogram2 : array[0..255] of longint;
- Tampilan citra sebelum diproses. nmfile : string;
- Tampilan citra setelah diproses dengan contrast stretching. c1, c2, d1, d2 : integer; { parameter utk contrast stretching
- Statistik pixel citra. }
- Histogram citra. arMask : array[1..9] of integer;
} faktorPembagiMask : real;

unit PCDUnit1; procedure TampilkanHasil;

interface implementation

uses uses PCDAbout, PCDUnit2, Histo, PCDContrast, Un_Mask,


Windows, Messages, SysUtils, Classes, Graphics, Math, Un_EdgeLinking;
Controls, Forms, Dialogs,
Menus, ExtCtrls, StdCtrls, Buttons, ComCtrls; {$R *.DFM}

type {-------------------------------------------------------------------------}
TForm1 = class(TForm) procedure BukaFileCitra;
Image1: TImage; { syarat: file citra berformat BMP, berukuran 256x256,
Image2: TImage; 256 level grayscale }
Label1: TLabel; var
Label2: TLabel; i, ix, iy : integer;
OpenDialog1: TOpenDialog; warna : longint;
MainMenu1: TMainMenu; warnab : byte;
File1: TMenuItem; bfh : TBitmapFileHeader;
Open1: TMenuItem; bih : TBitmapInfoHeader;
Proses1: TMenuItem; colorTbl : array[0..255] of TRGBQuad;
Statistik1: TMenuItem; mst : TMemoryStream;
ContrastStretching1: TMenuItem; b : byte;
About1: TMenuItem; numColor : integer;
Bevel1: TBevel; syarat : boolean;
Help1: TMenuItem; bm : TBitmap;
Exit2: TMenuItem; begin

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

11
procedure btnApplyClick(Sender: TObject);
procedure TForm1.FormCreate(Sender: TObject); procedure btnCloseClick(Sender: TObject);
begin procedure btnGXClick(Sender: TObject);
{ bersihkan image1 & image2 } procedure btnGYClick(Sender: TObject);
form1.Image1.Canvas.Brush.Color := clBlack; private
form1.Image1.Canvas.FillRect(Rect(0, 0, 256, 256)); { Private declarations }
form1.Image2.Canvas.Brush.Color := clBlack; public
form1.Image2.Canvas.FillRect(Rect(0, 0, 256, 256)); { Public declarations }
//temp: end;
nmfile := 'cameraman.bmp';
BukaFileCitra; var
end; frmEdgeLinking: TfrmEdgeLinking;

procedure TForm1.Exit2Click(Sender: TObject); implementation


begin
form1.close; uses PCDUnit1, Histo, Math;
end;
{$R *.DFM}
procedure TForm1.ViewHistogram1Click(Sender: TObject);
begin {-------------------------------------------------------------------------}
ViewHistogram1.Checked := not procedure HitungKomponenGX;
ViewHistogram1.Checked; var ix, iy : integer;
frmHisto.Visible := ViewHistogram1.Checked; GX : single;
end; begin
for ix:=1 to 256 do begin
procedure TForm1.MaskProcessingFiltering1Click(Sender: for iy:=1 to 256 do begin
TObject); if (ix > 1) and (ix < 256)
begin and (iy > 1) and (iy < 256) then begin
frmMask.Show; GX :=
end; (-1 * arCitra1[ix-1,iy-1]) +
(-2 * arCitra1[ix,iy-1]) +
procedure TForm1.Exit1Click(Sender: TObject); (-1 * arCitra1[ix+1,iy-1]) +
begin (1 * arCitra1[ix-1,iy+1]) +
form1.close; (2 * arCitra1[ix,iy+1]) +
end; (1 * arCitra1[ix+1,iy+1]);
if GX < 0 then GX := 0;
procedure TForm1.SaveResultAs1Click(Sender: TObject); if GX > 255 then GX := 255;
var arCitra2[ix,iy] := Round(GX);
nmfile2 : string; end else
begin arCitra2[ix,iy] := arCitra1[ix,iy];
SaveDialog1.Execute; end;
if SaveDialog1.FileName <> '' Then begin end;
nmfile2 := Form1.SaveDialog1.FileName; end;
Form1.Image2.Picture.Bitmap.PixelFormat := pf8bit;
Form1.Image2.Picture.Bitmap.SaveToFile(nmfile2); {-------------------------------------------------------------------------}
end; procedure HitungKomponenGY;
end; var ix, iy : integer;
GY : single;
procedure TForm1.EdgeLinking1Click(Sender: TObject); begin
begin for ix:=1 to 256 do begin
frmEdgeLinking.Show; for iy:=1 to 256 do begin
end; if (ix > 1) and (ix < 256)
and (iy > 1) and (iy < 256) then begin
end. GY :=
(-1 * arCitra1[ix-1,iy-1]) +
unit Un_EdgeLinking; (1 * arCitra1[ix+1,iy-1]) +
(-2 * arCitra1[ix-1,iy]) +
interface (2 * arCitra1[ix+1,iy]) +
(-1 * arCitra1[ix-1,iy+1]) +
uses (1 * arCitra1[ix+1,iy+1]);
Windows, Messages, SysUtils, Classes, Graphics, if GY < 0 then GY := 0;
Controls, Forms, Dialogs, if GY > 255 then GY := 255;
StdCtrls, Spin; arCitra2[ix,iy] := Round(GY);
end else
type arCitra2[ix,iy] := arCitra1[ix,iy];
TfrmEdgeLinking = class(TForm) end;
btnApply: TButton; end;
btnClose: TButton; end;
SpinEdit1: TSpinEdit;
Label1: TLabel; {-------------------------------------------------------------------------}
Label2: TLabel; procedure EdgeLinking;
SpinEdit2: TSpinEdit; var ix, iy : integer;
btnGX: TButton; arGradient : array[1..256, 1..256] of byte;
btnGY: TButton; arAngle : array[1..256, 1..256] of single;

12
warna : longint; end else
warnab : byte; arCitra2[ix,iy] := arCitra1[ix,iy];
warnab2 : byte; end;
GX, GY, G, Angle : single; end;
thres_T, thres_A : single; end;
thres_graylevel : byte;
begin procedure TfrmEdgeLinking.btnApplyClick(Sender:
// isi array gradient dan angle TObject);
for ix:=1 to 256 do begin begin
for iy:=1 to 256 do begin btnApply.Enabled := False;
if (ix > 1) and (ix < 256) Screen.Cursor := crHourGlass;
and (iy > 1) and (iy < 256) then begin EdgeLinking;
GX := TampilkanHasil;
(-1 * arCitra1[ix-1,iy-1]) + UpdateHistogram;
(-2 * arCitra1[ix,iy-1]) + btnApply.Enabled := True;
(-1 * arCitra1[ix+1,iy-1]) + Screen.Cursor := crDefault;
(1 * arCitra1[ix-1,iy+1]) + end;
(2 * arCitra1[ix,iy+1]) +
(1 * arCitra1[ix+1,iy+1]); procedure TfrmEdgeLinking.btnCloseClick(Sender:
GY := TObject);
(-1 * arCitra1[ix-1,iy-1]) + begin
(1 * arCitra1[ix+1,iy-1]) + Close;
(-2 * arCitra1[ix-1,iy]) + end;
(2 * arCitra1[ix+1,iy]) +
(-1 * arCitra1[ix-1,iy+1]) + procedure TfrmEdgeLinking.btnGXClick(Sender: TObject);
(1 * arCitra1[ix+1,iy+1]); begin
G := Abs(GX) + Abs(GY); Screen.Cursor := crHourGlass;
if GX <> 0 Then HitungKomponenGX;
Angle := ArcTan2(GY, GX) TampilkanHasil;
else UpdateHistogram;
Angle := Pi/2; Screen.Cursor := crDefault;
if G > 255 then G := 255; end;
arGradient[ix,iy] := round(G);
arAngle[ix,iy] := Angle; procedure TfrmEdgeLinking.btnGYClick(Sender: TObject);
end; begin
end; Screen.Cursor := crHourGlass;
end; HitungKomponenGY;
// inisialisasi TampilkanHasil;
for ix:=1 to 256 do begin UpdateHistogram;
for iy:=1 to 256 do begin Screen.Cursor := crDefault;
arCitra2[ix,iy] := 0; end;
end;
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;

13

Anda mungkin juga menyukai