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;