Algoritma K-Means PROGRAM K-MEANS SELENGKAPNYA ADALAH SEBAGAI BERIKUT

Gambar 13.8 Stret True 9. Dengan cara yang sama tambahkan image2 di sebelah kanan image1 kemudian ubah stretchnya ke true dan auto sizenya true. Gambar 13.9 Penambahan Image 2

10. Tambahkan button ke form, dengan cara pilih menu standart, button, lalu

klik ke form. Gambar 13.10 Menu Button 11. Pada oject inspector rubah properti captionnya dengan nama Open, kemudian namenya dengan nama btOpen. Gambar 13.11 Button Open 12. Tambahkan OpenPictureDialog ke form, dengan cara pilih menu dialog, OpenPictureDialog, lalu klik ke form. Gambar 13.12 Menu OpenPictureDialog 13. Hasilnya sebagai berikut. Gambar 13.13 Hasil OpenPictureDialog

14. Doble klik button open kemudian ketik program yang di hurup tebal

berikut. var FormKMean: TFormKMean; FileNameImg: string; implementation {R .dfm} procedure TFormKMean.btOpenClickSender: TObject; begin if OpenPictureDialog1.Execute then begin FileNameImg := OpenPictureDialog1.FileName; Caption := K-Mean : + OpenPictureDialog1.FileName; Image1.Picture.LoadFromFile OpenPictureDialog1.FileName; Image2.Visible := False; end; end; 15. Tambahkan button pada form, pada object inspector rubah properties captionnya dengan nama KMean dan Namenya dengan nama btKMean. Gambar 13.14 Button K-Mean 16. Tambahkan Label pada form. Gambar 13.15 Menu Label 17. Tulis captionnya dengan K = Gambar 13.16 Label K 18. Tambahkan Edit pada form. Gambar 13.17 Menu Edit 19. Ubah namenya dengan nama EditCluster dan tulis textnya dengan angka 10. Gambar 3.18 EditCluster 20. Tambahkan label ke form, ganti captionnya dengan tulisan Clr Weight. Gambar 13.19 Label Weight 21. Tambahkan edit ke form, ganti namenya dengan nama EditClrWeight dan textnya tulis angka 40. Gambar 13.20 Clr Wight 40 22. Tambahkan ProgressBar ke form dengan cara, pilih menu Win32, ProgressBar. Lalu klik ke form. Gambar 13.21 Menu ProgressBar 23. Hasilnya sebagai berikut. Gambar 13.22 Hasil ProgressBar 24. Tambahkan unit baru, dengan cara file, new unit. Gambar 13.23 Menu New Unit

25. Simpan unitnya dengan cara save as.

Gambar 13.24 Menu Save As

26. Berinama unitnya dengan nama UnitImageProses.

Gambar 13.25 Save UnitImageProses 27. Hasilnya sebagai berikut. Gambar 13.26 Hasil UnitImageProses

28. Ketik program berikut ke dalam UnitImageProses.

unit UnitImageProses; interface uses WINPROCS, Graphics, ExtCtrls, ComCtrls, Variants; type TFreqHist = array [0..255] of longint; TMatrixFilter = array [1..16,1..16] of real; function RgbToGray Clr:TColor : byte; function ImgGetGray var Image:TImage; x,y:integer : byte; procedure ImgConvertToGrayscale var Image1:TImage; var ProgressBar1: TProgressBar; procedure ImgGetHistogramFreq var Image:TImage; var Freq: TFreqHist; var MaxFreq:longint; procedure ImgClusteringKMeanROI var Image:TImage; k:integer; clrWeight:real; var ProgressBar1: TProgressBar; implementation const PercentR = 0.299; PercentG = 0.587; PercentB = 0.114; function ByteRange r:double : byte; begin if r0 then ByteRange:=0 else if r255 then ByteRange:=255 else ByteRange:=Roundr; end; function RgbToGray Clr:TColor : byte; var r,g,b:byte; begin r := GetRValueClr; g := GetGValueClr; b := GetBValueClr; RgbToGray := ByteRange rPercentR + gPercentG + bPercentB; end; function ImgGetGray var Image:TImage; x,y:integer : byte; begin Result := RgbToGray Image.Canvas.Pixels[x,y]; end; procedure ImgConvertToGrayscale var Image1:TImage; var ProgressBar1: TProgressBar; var x,y:integer; ClrGray:byte; begin ProgressBar1.Max := Image1.Width-1; ProgressBar1.Position := 0; for x:=0 to Image1.Width-1 do begin for y:=0 to Image1.Height-1 do begin ClrGray := ImgGetGray Image1,x,y; Image1.Canvas.Pixels[x,y] := RGB ClrGray,ClrGray,ClrGray; end; Image1.Repaint; ProgressBar1.Position := x; end; end; procedure ImgGetHistogramFreq var Image:TImage; var Freq: TFreqHist; var MaxFreq:longint; var x,y,i:integer; ClrGray:byte; begin { set Frek[i]=0 } for i:=0 to 255 do Freq[i]:=0; { hitung frekuensi tiap warna } for x:=0 to Image.Width-1 do for y:=0 to Image.Height-1 do begin ClrGray := ImgGetGray Image,x,y; Inc Freq[ClrGray]; end; MaxFreq := 0; for i:=0 to 255 do if Freq[i]MaxFreq then MaxFreq:=Freq[i]; end; procedure ImgClusteringKMeanROI var Image:TImage; k:integer; clrWeight:real; var ProgressBar1: TProgressBar; const BLACK_THRESHOLD=20; MAX_K = 50; MAX_counter=40; type TRecPoint = record x,y,clrGray:real; n:integer; end; var means: array [1..MAX_K] of TRecPoint; function GetGroup x,y,clrGray:real : byte; var distMin,dist:real; i:integer; g:byte; begin distMin := 1e8; g := 1; for i:=1 to k do begin dist := Sqrmeans[i].x-x + Sqrmeans[i].y-y + Sqrmeans[i].clrGray-clrGrayclrWeight; if distdistMin then begin distMin := dist; g := i; end; end; Result := g; end; procedure SetMeansZero; var i:integer; begin for i:=1 to k do begin means[i].x := 0; means[i].y := 0; means[i].clrGray := 0; means[i].n := 0; end; end; var x,y,i,counter: integer; clrGray,clrGrayMax,clrGrayMin,clrR,clrG,clrB: byte; pixelGroup: Variant; begin Randomize; ProgressBar1.Max := MAX_counter; ProgressBar1.Position := 0; pixelGroup := VarArrayCreate[0,Image.Width-1, 0,Image.Height-1], varByte; for i:=1 to k do begin means[i].x := RandomImage.Width; means[i].y := RandomImage.Height; means[i].clrGray := Random256; end; counter := 0; repeat for x:=0 to Image.Width-1 do for y:=0 to Image.Height-1 do begin clrGray := ImgGetGrayImage, x,y; if clrGrayBLACK_THRESHOLD then pixelGroup[x,y] := GetGroup x,y,clrGray else pixelGroup[x,y] := 0; end; SetMeansZero; for x:=0 to Image.Width-1 do for y:=0 to Image.Height-1 do begin i := pixelGroup[x,y]; if i0 then begin clrGray := ImgGetGray Image, x,y; means[i].x := means[i].x + x; means[i].y := means[i].y + y; means[i].clrGray := means[i].clrGray + clrGray; Inc means[i].n; end; end; for i:=1 to k do if means[i].n0 then begin means[i].x := means[i].xmeans[i].n; means[i].y := means[i].ymeans[i].n; means[i].clrGray := means[i].clrGraymeans[i].n; end; Inc counter; ProgressBar1.Position := counter; until counter=MAX_counter; clrGrayMax:=0; clrGrayMin:=255; for i:=1 to k do if means[i].n0 then begin if means[i].clrGrayclrGrayMax then clrGrayMax:=ByteRangemeans[i].clrGray; if means[i].clrGrayclrGrayMin then clrGrayMin:=ByteRangemeans[i].clrGray; end; clrR:=17; clrG:=230; clrB:=150; sembarang nilai for x:=0 to Image.Width-1 do for y:=0 to Image.Height-1 do if pixelGroup[x,y]0 then begin i := pixelGroup[x,y]; clrR:=clrR+30; clrG:=clrG-20; clrB:=clrB+70; Image.Canvas.Pixels[x,y] := RGB clrR,clrG,clrB; end; ProgressBar1.Position := MAX_counter; end; end.

29. Kembali ke FormKMean, caranya klik UnitKMean.

Gambar 13.27 Kembali ke FormKMean

30. Lalu klik toggle form.

Gambar 13.28 Toggle

31. Doble klik button KMean.

Gambar 13.29 Button K-Mean

32. Lalu ketik program berikut yang tercetak huruf tebal.

procedure TFormKMean.btKMeanClickSender: TObject; var

k:integer; clrWeight:real; begin

Image2.Visible := True; Image2.Picture.Graphic := Image1.Picture.Graphic; k := StrToIntDefEditCluster.Text,5; clrWeight := StrToFloatDefEditClrWeight.Text,5; ImgClusteringKMeanROI Image2, k,clrWeight,ProgressBar1; end;

33. Dibawah implementasi ketik program yang tertulis huruf tebal berikut.

implementation {R .dfm} uses UnitImageProses; 34. Tambahkan button ke form, lalu pada object inspector rubah properties captionnya dengan nama Exit dan namenya dengan nama btExit. Gambar 13.30 Button Exit 35. Doble klik button Exit lalu ketik program berikut. procedure TFormKMean.btExitClickSender: TObject; begin FormKMean.Close; end;

36. Simpan program dengan cara file save all.

37. Compiler progran dengan cara pilih menu Project, Compile ProjectKMean. Gambar 13.31 Compiler ProjectKMean 38. Lalu jalankan progran dengan cara pilih menu Run, Run. Gambar 13.32 Menu Run 39. Hasil sebagai berikut. Gambar 13.33 Hasil Program K-Mean 40. Keluar dari program klik button Exit.

13.3 PROGRAM K-MEANS SELENGKAPNYA ADALAH SEBAGAI BERIKUT

unit UnitKMean; interface uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, ExtDlgs, StdCtrls, ExtCtrls, ComCtrls; type TFormKMean = classTForm Image1: TImage; Image2: TImage; btOpen: TButton; OpenPictureDialog1: TOpenPictureDialog; btKMean: TButton; ProgressBar1: TProgressBar; Label1: TLabel; EditCluster: TEdit; Label2: TLabel; EditClrWeight: TEdit; btExit: TButton; procedure btOpenClickSender: TObject; procedure btKMeanClickSender: TObject; procedure btExitClickSender: TObject; private { Private declarations } public { Public declarations } end; var FormKMean: TFormKMean; FileNameImg: string; implementation {R .dfm} uses UnitImageProses; procedure TFormKMean.btOpenClickSender: TObject; begin if OpenPictureDialog1.Execute then begin FileNameImg := OpenPictureDialog1.FileName; Caption := K-Mean : + OpenPictureDialog1.FileName; Image1.Picture.LoadFromFile OpenPictureDialog1.FileName; Image2.Visible := False; end; end; procedure TFormKMean.btKMeanClickSender: TObject; var

k:integer; clrWeight:real; begin

Image2.Visible := True; Image2.Picture.Graphic := Image1.Picture.Graphic; k := StrToIntDefEditCluster.Text,5; clrWeight := StrToFloatDefEditClrWeight.Text,5; ImgClusteringKMeanROI Image2, k,clrWeight,ProgressBar1; end; procedure TFormKMean.btExitClickSender: TObject; begin FormKMean.Close; end; end. unit UnitImageProses; interface uses WINPROCS, Graphics, ExtCtrls, ComCtrls, Variants; type TFreqHist = array [0..255] of longint; TMatrixFilter = array [1..16,1..16] of real; function RgbToGray Clr:TColor : byte; function ImgGetGray var Image:TImage; x,y:integer : byte; procedure ImgConvertToGrayscale var Image1:TImage; var ProgressBar1: TProgressBar; procedure ImgGetHistogramFreq var Image:TImage; var Freq: TFreqHist; var MaxFreq:longint; procedure ImgClusteringKMeanROI var Image:TImage; k:integer; clrWeight:real; var ProgressBar1: TProgressBar; implementation const PercentR = 0.299; PercentG = 0.587; PercentB = 0.114; function ByteRange r:double : byte; begin if r0 then ByteRange:=0 else if r255 then ByteRange:=255 else ByteRange:=Roundr; end; function RgbToGray Clr:TColor : byte; var r,g,b:byte; begin r := GetRValueClr; g := GetGValueClr; b := GetBValueClr; RgbToGray := ByteRange rPercentR + gPercentG + bPercentB; end; function ImgGetGray var Image:TImage; x,y:integer : byte; begin Result := RgbToGray Image.Canvas.Pixels[x,y]; end; procedure ImgConvertToGrayscale var Image1:TImage; var ProgressBar1: TProgressBar; var x,y:integer; ClrGray:byte; begin ProgressBar1.Max := Image1.Width-1; ProgressBar1.Position := 0; for x:=0 to Image1.Width-1 do begin for y:=0 to Image1.Height-1 do begin ClrGray := ImgGetGray Image1,x,y; Image1.Canvas.Pixels[x,y] := RGB ClrGray,ClrGray,ClrGray; end; Image1.Repaint; ProgressBar1.Position := x; end; end; procedure ImgGetHistogramFreq var Image:TImage; var Freq: TFreqHist; var MaxFreq:longint; var x,y,i:integer; ClrGray:byte; begin { set Frek[i]=0 } for i:=0 to 255 do Freq[i]:=0; { hitung frekuensi tiap warna } for x:=0 to Image.Width-1 do for y:=0 to Image.Height-1 do begin ClrGray := ImgGetGray Image,x,y; Inc Freq[ClrGray]; end; MaxFreq := 0; for i:=0 to 255 do if Freq[i]MaxFreq then MaxFreq:=Freq[i]; end; procedure ImgClusteringKMeanROI var Image:TImage; k:integer; clrWeight:real; var ProgressBar1: TProgressBar; const BLACK_THRESHOLD=20; MAX_K = 50; MAX_counter=40; type TRecPoint = record x,y,clrGray:real; n:integer; end; var means: array [1..MAX_K] of TRecPoint; function GetGroup x,y,clrGray:real : byte; var distMin,dist:real; i:integer; g:byte; begin distMin := 1e8; g := 1; for i:=1 to k do begin dist := Sqrmeans[i].x-x + Sqrmeans[i].y-y + Sqrmeans[i].clrGray-clrGrayclrWeight; if distdistMin then begin distMin := dist; g := i; end; end; Result := g; end; procedure SetMeansZero; var i:integer; begin for i:=1 to k do begin means[i].x := 0; means[i].y := 0; means[i].clrGray := 0; means[i].n := 0; end; end; var x,y,i,counter: integer; clrGray,clrGrayMax,clrGrayMin,clrR,clrG,clrB: byte; pixelGroup: Variant; begin Randomize; ProgressBar1.Max := MAX_counter; ProgressBar1.Position := 0; pixelGroup := VarArrayCreate[0,Image.Width-1, 0,Image.Height-1], varByte; for i:=1 to k do begin means[i].x := RandomImage.Width; means[i].y := RandomImage.Height; means[i].clrGray := Random256; end; counter := 0; repeat for x:=0 to Image.Width-1 do for y:=0 to Image.Height-1 do begin clrGray := ImgGetGrayImage, x,y; if clrGrayBLACK_THRESHOLD then pixelGroup[x,y] := GetGroup x,y,clrGray else pixelGroup[x,y] := 0; end; SetMeansZero; for x:=0 to Image.Width-1 do for y:=0 to Image.Height-1 do begin i := pixelGroup[x,y]; if i0 then begin clrGray := ImgGetGray Image, x,y; means[i].x := means[i].x + x; means[i].y := means[i].y + y; means[i].clrGray := means[i].clrGray + clrGray; Inc means[i].n; end; end; for i:=1 to k do if means[i].n0 then begin means[i].x := means[i].xmeans[i].n; means[i].y := means[i].ymeans[i].n; means[i].clrGray := means[i].clrGraymeans[i].n; end; Inc counter; ProgressBar1.Position := counter; until counter=MAX_counter; clrGrayMax:=0; clrGrayMin:=255; for i:=1 to k do if means[i].n0 then begin if means[i].clrGrayclrGrayMax then clrGrayMax:=ByteRangemeans[i].clrGray; if means[i].clrGrayclrGrayMin then clrGrayMin:=ByteRangemeans[i].clrGray; end; clrR:=17; clrG:=230; clrB:=150; sembarang nilai for x:=0 to Image.Width-1 do for y:=0 to Image.Height-1 do if pixelGroup[x,y]0 then begin i := pixelGroup[x,y]; clrR:=clrR+30; clrG:=clrG-20; clrB:=clrB+70; Image.Canvas.Pixels[x,y] := RGB clrR,clrG,clrB; end; ProgressBar1.Position := MAX_counter; end; end.

BAB 14 MENAMPILKAN NILAI

INTENSITAS PIXEL

14.1 PENDAHULUAN

Menampilkan nilai intensitas pixel gunanya untuk mengetahui perubahan nilai intensitas pixel sebelum dan sesudah dilakukan analisis pengolahan citra digital.

14.2 CARA UNTUK MEMBUAT PROGRAM MENAMPILKAN NILAI INTENSITAS PIXEL

ADALAH SEBAGAI BERIKUT:

1. Buka kembali projek histogram cut, dengan cara buka Delphi kemudian open

projek histogram cut. Gambar 14.1 Menu Open Project Gambar 14.2 Open ProjectHistogramCut Gambar 14.3 Hasil OpenProjectHistogramCut

2. Kemudian tambahkan 2 Memo pada Form, kemudian properties ScrollBars pilih ssBoth.

Gambar 14.4 Menu Memo Gambar 14.5 Hasil Memo

3. Kemudian tambahkan MainMenu pada form

Gambar 14.6 MainMenu Gambar 14.7 Hasil Main Menu Pada Form 4. Double MainMenu tersebut kemudian akan keluar tampilan berikut. Gambar 14.8 Tampilan Main Menu 5. Tulis captionnya dengan tulisan File, kemudian tekan enter. Gambar 14.9 Tulisan Caption File Pada Main Menu 6. Klik file pada mainmenu, kemudian akan tampil keluaran sebagai berikut. Gambar 14.10 Hasil Tampilan Fle Main Menu 7. Klik kotak dibawah file kemudian Tulis captionnya dengan tulisan Menampilkan Nilai Intensitas Pixel Awal. Gambar 14.11 Menampilkan Tulisan Nilai Intensitas Pixel Awal 8. Klik kotak di bawah nilai intensitas pixel awal, lalu tulis captionnya dengan tulisan Menampilkan Nilai Intensitas Pixel Hasil, lalu tekan enter. Gambar 14.12 Menampilkan Nilai Intensitas Pixel Hasil 9. Kembali ke form histogram cut, pilih menu file, menampilkan nilai intensitas pixel awal, lalu ketik program berikut. Gambar 14.13 Kembali ke FormHistogramCut procedure TFormHistogramCut.MenampilkanNilaiIntensitasPixelAwal1Click Sender: TObject; var F : TextFile; AgungFile: String; temp : PByteArray; i,j : integer; gambar :TBitmap; begin AgungFile:=nilai intensitas pixel awal.txt; AssignFileF,AgungFile; gambar:=TBitmap.Create; gambar:=image1.Picture.Bitmap; rewriteF; writelnF,Matrik dirancang oleh Agung Gunawan; memo1.Clear; for j:=0 to gambar.Height-1 do begin temp:=gambar.ScanLine[j]; i:=0; repeat writeF,inttostrtemp[i]+ ; i:=i+1; until i =3gambar.Width-1; end; closeFileF; memo1.Lines.LoadFromFileAgungFile; image1.Picture.Bitmap:=gambar;end; 10. Kemudian dengan cara yang sama pilih menu file, Menampilkan Nilai Intensitas Pixel Hasil, lalu ketik program berikut. procedure TFormHistogramCut.MenampilkanNilaiIntensitasPixelHasil1Click Sender: TObject; var F2 : TextFile; AgungFile2: String; temp : PByteArray; i,j : integer; gambar2 :TBitmap; begin AgungFile2:=nilai intensitas pixel hasil.txt; AssignFileF2,AgungFile2; gambar2:=TBitmap.Create; gambar2:=image2.Picture.Bitmap; rewriteF2; writelnF2,Matrik dirancang oleh Agung BALI; memo2.Clear; for j:=0 to gambar2.Height-1 do begin temp:=gambar2.ScanLine[j]; i:=0; repeat writeF2,inttostrtemp[i]+ ; i:=i+1; until i =3gambar2.Width-1; end; closeFileF2; memo2.Lines.LoadFromFileAgungFile2; image2.Picture.Bitmap:=gambar2; end;