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.
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
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 |
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.
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 a(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
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 a(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.
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.
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.
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.
![]() |
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.
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};
{$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.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;
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);
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 }
procedure TampilkanHasil;
implementation
uses PCDAbout, PCDUnit2, Histo, PCDContrast;
{$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
{ 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;
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));
{ nmfile := 'fruit3.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;
end.
unit PCDUnit2;
interface
uses
Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
StdCtrls, PCDUnit1;
type
TfrmStat = class(TForm)
Memo1: TMemo;
Button1: TButton;
procedure Button1Click(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;
var
frmStat: TfrmStat;
implementation
{$R *.DFM}
procedure TfrmStat.Button1Click(Sender: TObject);
begin
frmStat.Close;
end;
end.
unit Histo;
interface
uses
Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
ExtCtrls, StdCtrls;
type
TfrmHisto = class(TForm)
Image1: TImage;
Image2: TImage;
Label3: TLabel;
Label4: TLabel;
Label5: TLabel;
Label6: TLabel;
Label1: TLabel;
Label2: TLabel;
Label7: TLabel;
Label8: TLabel;
procedure FormCreate(Sender: TObject);
procedure FormClose(Sender: TObject; var Action: TCloseAction);
procedure Image1MouseMove(Sender: TObject; Shift: TShiftState; X,
Y: Integer);
procedure FormMouseMove(Sender: TObject; Shift: TShiftState; X,
Y: Integer);
procedure Image2MouseMove(Sender: TObject; Shift: TShiftState; X,
Y: Integer);
private
{ Private declarations }
public
{ Public declarations }
end;
var
frmHisto: TfrmHisto;
procedure UpdateHistogram;
implementation
uses PCDUnit1;
{$R *.DFM}
{-------------------------------------------------------------------------}
procedure UpdateHistogram;
var i : integer;
ix, iy, n : integer;
warnab : byte;
maxHistogramValue1 : integer;
maxHistogramValue2 : integer;
skala1 : real;
skala2 : real;
r : TRect;
begin
{ inisialisasi }
for i:=0 to 255 do begin
arHistogram1[i] := 0;
arHistogram2[i] := 0;
end;
{ update data array histogram }
for ix:=1 to 256 do begin
for iy:=1 to 256 do begin
warnab := arCitra1[ix,iy];
inc(arHistogram1[warnab]);
warnab := arCitra2[ix,iy];
inc(arHistogram2[warnab]);
end;
end;
{ histogram scaling }
maxHistogramValue1 := 0;
maxHistogramValue2 := 0;
for i:=0 to 255 do begin
if arHistogram1[i] > maxHistogramValue1 then
maxHistogramValue1 := arHistogram1[i];
if arHistogram2[i] > maxHistogramValue2 then
maxHistogramValue2 := arHistogram2[i];
end;
skala1 := 100 / maxHistogramValue1;
skala2 := 100 / maxHistogramValue2;
{ inisialisasi gambar histogram }
r := Rect(0, 0, 256, 101);
frmHisto.Image1.Canvas.Brush.Color := clWhite;
frmHisto.Image1.Canvas.FillRect(r);
frmHisto.Image2.Canvas.Brush.Color := clWhite;
frmHisto.Image2.Canvas.FillRect(r);
frmHisto.Image1.Canvas.MoveTo(0,100);
frmHisto.Image1.Canvas.LineTo(256,100);
frmHisto.Image2.Canvas.MoveTo(0,100);
frmHisto.Image2.Canvas.LineTo(256,100);
{ mulai gambar histogram }
for i:=0 to 255 do begin
{ histogram citra 1 }
frmHisto.Image1.Canvas.MoveTo(i,100);
n := round( arHistogram1[i] * skala1 );
frmHisto.Image1.Canvas.LineTo(i,100-n);
{ histogram citra 2 }
frmHisto.Image2.Canvas.MoveTo(i,100);
n := round( arHistogram2[i] * skala2 );
frmHisto.Image2.Canvas.LineTo(i,100-n);
end;
end;
procedure TfrmHisto.FormCreate(Sender: TObject);
begin
UpdateHistogram;
end;
procedure TfrmHisto.FormClose(Sender: TObject; var Action: TCloseAction);
begin
Form1.ViewHistogram1.Checked := False;
end;
procedure TfrmHisto.Image1MouseMove(Sender: TObject; Shift: TShiftState; X,
Y: Integer);
begin
Label7.Caption := 'f[' + IntToStr(X) + '] = ' + IntToStr(arHistogram1[X]);
end;
procedure TfrmHisto.FormMouseMove(Sender: TObject; Shift: TShiftState; X,
Y: Integer);
begin
Label7.Caption := '';
Label8.Caption := '';
end;
procedure TfrmHisto.Image2MouseMove(Sender: TObject; Shift: TShiftState; X,
Y: Integer);
begin
Label8.Caption := 'f[' + IntToStr(X) + '] = ' + IntToStr(arHistogram2[X]);
end;
end.
unit PCDAbout;
interface
uses Windows, SysUtils, Classes, Graphics, Forms, Controls, StdCtrls,
Buttons, ExtCtrls;
type
TAboutBox = class(TForm)
Panel1: TPanel;
ProgramIcon: TImage;
ProductName: TLabel;
Version: TLabel;
Copyright: TLabel;
Comments: TLabel;
OKButton: TButton;
Label1: TLabel;
Label2: TLabel;
private
{ Private declarations }
public
{ Public declarations }
end;
var
AboutBox: TAboutBox;
implementation
{$R *.DFM}
end.
unit PCDContrast;
interface
uses
Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
StdCtrls, Spin, ExtCtrls;
type
TfrmContrast = class(TForm)
Image1: TImage;
Label1: TLabel;
Label2: TLabel;
Label3: TLabel;
Label4: TLabel;
Button1: TButton;
scbC1: TScrollBar;
lblC1: TLabel;
lblD1: TLabel;
scbD1: TScrollBar;
lblC2: TLabel;
scbC2: TScrollBar;
lblD2: TLabel;
scbD2: TScrollBar;
Button2: TButton;
procedure Button1Click(Sender: TObject);
procedure FormCreate(Sender: TObject);
procedure scbC1Change(Sender: TObject);
procedure scbD1Change(Sender: TObject);
procedure scbC2Change(Sender: TObject);
procedure scbD2Change(Sender: TObject);
procedure Button2Click(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;
var
frmContrast: TfrmContrast;
implementation
uses Histo, PCDUnit1;
{$R *.DFM}
{-----------------------------------------------------------}
procedure UpdateContrastSetting;
begin
c1 := frmContrast.scbC1.Position;
d1 := frmContrast.scbD1.Position;
c2 := frmContrast.scbC2.Position;
d2 := frmContrast.scbD2.Position;
{ inisialisasi image }
frmContrast.Image1.Canvas.Brush.Color := TColor($00AAAAAA);
frmContrast.Image1.Canvas.FillRect(Rect(0, 0, 256 div 2, 256 div 2));
{ update image }
frmContrast.Image1.Canvas.Pen.Color := clBlack;
frmContrast.Image1.Canvas.MoveTo(0,255 div 2);
frmContrast.Image1.Canvas.LineTo(c1 div 2,(255-d1) div 2);
frmContrast.Image1.Canvas.LineTo(c2 div 2,(255-d2) div 2);
frmContrast.Image1.Canvas.LineTo(255 div 2,0);
end;
{-------------------------------------------------------------------------}
procedure ContrastStretch;
var ix, iy : integer;
warna : longint;
warnab : byte;
warnab2 : byte;
begin
{----- proses citra }
{ contrast stretching }
for ix:=1 to 256 do begin
for iy:=1 to 256 do begin
warnab := arCitra1[ix,iy];
if warnab < c1 then {zone 1}
warnab2 := round( warnab * d1 / c1 )
else if warnab < (c2) then {zone 2}
warnab2 := d1 + round( (warnab-c1) * (d2-d1) / (c2-c1) )
else {zone 3}
warnab2 := d2 + round( (warnab-c2) * (255-d2) / (255-c2) );
arCitra2[ix,iy] := warnab2;
end;
end;
end;
procedure TfrmContrast.Button1Click(Sender: TObject);
begin
Button1.Enabled := False;
frmContrast.Cursor := crHourGlass;
ContrastStretch;
TampilkanHasil;
UpdateHistogram;
Button1.Enabled := True;
frmContrast.Cursor := crDefault;
end;
procedure TfrmContrast.FormCreate(Sender: TObject);
begin
lblC1.Caption := IntToStr(scbC1.Position);
lblD1.Caption := IntToStr(scbD1.Position);
lblC2.Caption := IntToStr(scbC2.Position);
lblD2.Caption := IntToStr(scbD2.Position);
UpdateContrastSetting;
end;
procedure TfrmContrast.scbC1Change(Sender: TObject);
begin
if scbC1.Position > scbC2.Position then
scbC1.Position := scbC2.Position;
lblC1.Caption := IntToStr(scbC1.Position);
UpdateContrastSetting;
end;
procedure TfrmContrast.scbD1Change(Sender: TObject);
begin
if scbD1.Position > scbD2.Position then
scbD1.Position := scbD2.Position;
lblD1.Caption := IntToStr(scbD1.Position);
UpdateContrastSetting;
end;
procedure TfrmContrast.scbC2Change(Sender: TObject);
begin
if scbC2.Position < scbC1.Position then
scbC2.Position := scbC1.Position;
lblC2.Caption := IntToStr(scbC2.Position);
UpdateContrastSetting;
end;
procedure TfrmContrast.scbD2Change(Sender: TObject);
begin
if scbD2.Position < scbD1.Position then
scbD2.Position := scbD1.Position;
lblD2.Caption := IntToStr(scbD2.Position);
UpdateContrastSetting;
end;
procedure TfrmContrast.Button2Click(Sender: TObject);
begin
Close;
end;
end.
Dokumen ini juga dapat didownload dalam format file pdf dari http://www.snpages.info/files/u1/RR-02-2005-STIKOM/RR-02-2005-STIKOM.pdf





Comments
mbt shoes outlet
Mbt shoes are on promotion now,Mbt sport shoes and Mbt ChapaMbt shoe are on sale.
aylkroy g giyjdfgnfdkt
aylkroy g giyjdfgnfdkt jretg. ......
one day i went shopping
one day i went shopping outside ,and in an ed hardy store,I found some kinds of ed hardy i love most。they are: ed hardy T-shirts on sale ed hardy T-shirts on sale ed hardy T-shirts sales ed hardy T-shirts sales cheap ed hardy T-shirts on sale cheap ed hardy T-shirts on sale cheap ed hardy T-shirts sale cheap ed hardy T-shirts sale ed hardy T-shirts for men on sale ed hardy T-shirts for men on sale disconnt ed hardy T-shirts for men on sale disconnt ed hardy T-shirts for men on sale ed hardy T-shirts online ed hardy T-shirts online discount ed hardy T-shirts discount ed hardy T-shirts discount ed hardy T-shirts on sale discount ed hardy T-shirts on sale
cjcshadow
MBT Shoes
MBT Barabara Womens Shoes
MBT Kisumu Black Suede
cjcshadow
Nike Air Force 1 Hot Sale
Nike High Top Shoes for Women
Nike Air Force 1 Shoes
cjcshadow
Cheap Ugg Boots
classic mini ugg boots
ugg classic short boots sale
cjcshadow
cheap ugg boots free shipping
ugg classic tall boots on sale
ugg ultra tall sale
Air jordan shoes
Thanks for your useful info, I think it’s a good topic. So would you like the info about the
jordan shoes
Air jordan shoes
cardy ugg boots
ugg bailey button boots
cheap jordan shoes
ugg boots uk
Michael jordan shoes
ugg london
ugg nightfall boots
ugg boots sale
classic ugg boots
sundance ugg boots
air jordan fusion 6
air jordan 6 rings
Tiffany Jewelry
jordan shoes for sale
Ed Hardy Clothing
Hope all the mothers healthy and happy forever!Ed HardyEd Hardy Clothing Ralph Lauren PoloJuicy Couture All people review this talk and their mothers will be healthy and happy forever.
العاب بنات
العاب بنات فقط
العاب بنات فقط
العاب بنات فقط
العاب بنات فقط
العاب بنات فقط
العاب بنات فقط
العاب بنات فقط
العاب بنات فقط
العاب بنات فقط
العاب بنات فقط
العاب بنات فقط
العاب بنات فقط
العاب بنات فقط
العاب بنات فقط
العاب بنات فقط
العاب بنات فقط
العاب بنات فقط
العاب بنات فقط
العاب بنات فقط
العاب بنات فقط
العاب بنات فقط
العاب بنات فقط
العاب بنات فقط
العاب بنات فقط
العاب بنات فقط
العاب بنات فقط
العاب بنات فقط
العاب بنات فقط
العاب بنات فقط
العاب بنات فقط
العاب بنات فقط
العاب بنات فقط
العاب بنات فقط
العاب بنات فقط
العاب بنات فقط
العاب بنات فقط
العاب بنات فقط
العاب بنات فقط
العاب بنات فقط
العاب بنات فقط
العاب بنات فقط
العاب بنات فقط
العاب بنات فقط
العاب بنات فقط
العاب بنات فقط
العاب بنات فقط
العاب بنات فقط
العاب بنات فقط
Post new comment