6. Berinama Projectnya dengan nama ProjectGlobalThresolding.
Gambar 4.6 Save Project Global Thresolding
7. Doble clik button open, lalu keting program berikut:
var GlobalThreshold: TGlobalThreshold;
FileNameImg: string; implementation
{R .dfm} procedure TGlobalThreshold.btOpenClickSender: TObject;
begin if OpenPictureDialog1.Execute then
begin FileNameImg := OpenPictureDialog1.FileName;
Caption := Mammo Analisys : + OpenPictureDialog1.FileName; Image1.Picture.LoadFromFile OpenPictureDialog1.FileName;
Image2.Visible := False; end;
end; end.
8. Tambahkan button ke form, beri nama captionnya dengan Global Thresolding dan namenya dengan btGlobalThresholding dan tambahkan
juga ProgresBar kedalam form.
Gambar 4.7 Button Thresolding
9. Tambahkan unit dengan cara file new unit.
Gambar 4.8 New Unit
10. Simpan unitnya dengan cara file save as, beri nama dengan ImageProses.
Gambar 4.9 Save Image Proses
11. Kemudian ketik program berikut pada unit imageproses:
unit ImageProses; 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 ImgGlobalThresholding var Image:TImage; var thres: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 ImgGlobalThresholding var Image:TImage; var thres:real; var ProgressBar1: TProgressBar;
var x,y,counter:integer; m1,m2,n1,n2:real; Clr:TColor; ClrGray:byte;
thresOld:real; begin
ProgressBar1.Max := 5; ProgressBar1.Position := 0;
counter := 0; repeat
thresOld := thres; m1:=0; m2:=0; n1:=0; n2:=0;
for x:=0 to Image.Width-1 do for y:=0 to Image.Height-1 do
begin ClrGray := ImgGetGray Image,x,y;
if ClrGraythres then begin
m1 := m1 + ClrGray; n1 := n1 + 1;
end else
begin m2 := m2 + ClrGray;
n2 := n2 + 1; end;
end; if n1=0 then n1:=1;
if n2=0 then n2:=1; m1 := m1n1;
m2 := m2n2; thres := m1+m2 2;
Inc counter; ProgressBar1.Position := counter;
until AbsthresOld-thres=3orcounter=5; { tuliskan pixel baru }
for x:=0 to Image.Width-1 do begin
for y:=0 to Image.Height-1 do begin
ClrGray := ImgGetGray Image,x,y; if ClrGraythres then
Image.Canvas.Pixels[x,y] := RGB 0,0,0; Image.Canvas.Pixels[x,y] := clWhite;
end; end;
ProgressBar1.Position := ProgressBar1.Max; end;
end.
12. Tambahkan Label1, Label2, Label3 kemudian ganti captionnya dengan nama masing-masing THRESHOLD, AWAL, AKHIR. Kemudian tambahkan
Edit ada pada Standard ke form beri namenya dengan EditThreshold dan Text = 12. Seperti berikut ini.
Gambar 4.10 Edit Thresolding
13. Tambahkan program berikut ke UnitGlobalThressolding.
implementation {R .dfm}
uses ImageProses;
14. Doble klik button Global Thresolding lalu ketik program berikut
procedure TGlobalThreshold.btGlobalThresoldingClickSender: TObject; var thres:real;
begin Image2.Visible := True;
Image2.Picture.Graphic := Image1.Picture.Graphic; thres := StrToFloatDef EditThreshold.Text,5;
ImgGlobalThresholding Image2,thres,ProgressBar1; EditThreshold.Text := IntToStrRoundthres;
end;
15. Tambahkan button ke dalam form lalu captionnya diganti dengan Exit, namenya diberinama btExit.
Gambar 4.11 Button Exit
16. Doble klik button exit kemudin ketik program berikut.
procedure TFormGlobalThreshold.btExitClickSender: TObject; begin
FormGlobalThreshold.Close; end;
17. Simpan program dengan save all, kemudian jalankan progran dengan cara compile kemudian run. Hasilnya sebagai berikut.
Gambar 4.12 Hasil Program Thresolding
18. Tutup program tekan button exit.
4.3 PROGRAM GLOBAL THRESOLDING SELENGKAPNYA ADALAH SEBAGAI BERIKUT:
unit UnitGlobalThresolding; interface
uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls, ExtCtrls, ExtDlgs, ComCtrls; type
TFormGlobalThreshold = classTForm Image1: TImage;
Image2: TImage; btOpen: TButton;
OpenPictureDialog1: TOpenPictureDialog; btGlobalThresolding: TButton;
ProgressBar1: TProgressBar; EditThreshold: TEdit;
Label1: TLabel; Label2: TLabel;
Label3: TLabel; btExit: TButton;
procedure btOpenClickSender: TObject; procedure btGlobalThresoldingClickSender: TObject;
procedure btExitClickSender: TObject; private
{ Private declarations } public
{ Public declarations } end;
var FormGlobalThreshold: TFormGlobalThreshold;
FileNameImg: string; implementation
{R .dfm} uses
ImageProses;
procedure TFormGlobalThreshold.btOpenClickSender: TObject; begin
if OpenPictureDialog1.Execute then begin
FileNameImg := OpenPictureDialog1.FileName; Caption := Mammo Analisys : + OpenPictureDialog1.FileName;
Image1.Picture.LoadFromFile OpenPictureDialog1.FileName; Image2.Visible := False;
end; end;
procedure TFormGlobalThreshold.btGlobalThresoldingClickSender: TObject; var thres:real;
begin Image2.Visible := True;
Image2.Picture.Graphic := Image1.Picture.Graphic; thres := StrToFloatDef EditThreshold.Text,5;
ImgGlobalThresholding Image2,thres,ProgressBar1; EditThreshold.Text := IntToStrRoundthres;
end; procedure TFormGlobalThreshold.btExitClickSender: TObject;
begin FormGlobalThreshold.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 ImgGlobalThresholding var Image:TImage; var thres: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 ImgGlobalThresholding var Image:TImage; var thres:real; var
ProgressBar1: TProgressBar; var
x,y,counter:integer; m1,m2,n1,n2:real; Clr:TColor; ClrGray:byte;
thresOld:real; begin
ProgressBar1.Max := 5; ProgressBar1.Position := 0;
counter := 0; repeat
thresOld := thres; m1:=0; m2:=0; n1:=0; n2:=0;
for x:=0 to Image.Width-1 do for y:=0 to Image.Height-1 do
begin ClrGray := ImgGetGray Image,x,y;
if ClrGraythres then begin
m1 := m1 + ClrGray; n1 := n1 + 1;
end else
begin m2 := m2 + ClrGray;
n2 := n2 + 1; end;
end; if n1=0 then n1:=1;
if n2=0 then n2:=1; m1 := m1n1;
m2 := m2n2; thres := m1+m2 2;
Inc counter; ProgressBar1.Position := counter;
until AbsthresOld-thres=3orcounter=5; { tuliskan pixel baru }
for x:=0 to Image.Width-1 do begin
for y:=0 to Image.Height-1 do begin
ClrGray := ImgGetGray Image,x,y; if ClrGraythres then
Image.Canvas.Pixels[x,y] := clWhite; end;
end; ProgressBar1.Position := ProgressBar1.Max;
end; end.
BAB 5 HISTOGRAM CUT
5.1 DASAR TEORI HISTOGRAM CUT
Histogram Cut digunakan untuk mencerahkan enlightmen image berdasarkan distribusi frekuensi citra.
Algoritma Histogram Cut
1. Masukkan nilai black_thres = 2. 2. Hitung frekuensi kemunculan nilai gray
3. Hitung frekuansi total dari gray imgsize awal 4. Bila nilai gray black_thres, maka tidak ikut diperhitungkan, karena dianggap
benar-benar background. 5. Hitung imgsizebaru = imgsize awal – frekkuensi yang tidak diperhitungkan.
6. Cari nilai gray maksimum 7. Cari nilai threshold dengan cara menghitung frekuensi kumulatif dimulai dari
gray tertinggi. 8. Threshold ditentukan berdasarkan nilai gray dimana ditemukan frekuensi
kumulatif imgsizebaru2. 9. Bila nilai gray thresodl maka nilai grayBaru = 0.
10. Lakukan transformasi linear grayBaru = clrGray clrGrayMax 20 karena skala maksimum 20,pada program sebenarnya 255.
11. Sehingga didapat image yang lebih kontras. 12. Ulangi langkah 2 sampai langkah 10 sampai didapat image dengan kontras
yang diinginkan.
Cara kerja Histogram Thresholding Histogram Cut. 1.Misalkan skala keabuan antara 0-20, dan didapatkan distribusi frekuensi sbb.
Gray frek
Keterangan
10 Misalkan Black_Thres=2, maka nilai gray = 2 tidak ikut di
perhitungkan dianggap benar-benar background 1
20 2
5 ß batas Black thres
3 8
Proses dilanjutkan dengan menghitung imgSize berdasarkan kasus ini imgSize = 116-10-20-5 = 81
4 7
5 11
6 10
Pada saat yang sama juga dicari nilai maksimum, pada kasus ini ditemukan clrGrayMax = 11
7 20
8 5
9 5
10 7
11
8 çclrGrayMax artinya nilai intensitas pixel maksimum
adalah 11 12
13 14
15 16
17 18
19 20
Total 116 2.Proses berikutnya mencari threshold dengan cara mencari frekuensi kumulatif
dimulai dari gray tertinggi. Threshold ditentukan berdasarkan nilai gray dimana frekuensi kumulatif imgSize 2 dalam hal ini 812 = 40,5.
Gray Frek Frek
Kum Keterangan
10 1
20 2
5 3
8 81
Frek kum = 73 + 8 = 81 4
7 73
Frek kum = 66 + 7 = 73 5
11 66
Frek kum = 55 + 11 = 66 6
10 55
Frek kum = 45 + 10 = 55
7 20
45 Frek kum = 25 + 20 = 45 pada titik ini pertama
kali ditemukan frek kumulatif = imgSize2= 40,5.
Maka nilai threshold yang baru = 7.
8 5
25 Frek kum = 20 + 5 = 25
9 5
20 Frek kum = 15 + 5 = 20
10 7
15 Gray 10, frek 7, frek kum = 8+7=15
11 8
8 Frek kumulatif mulai dari sini gray 11, frek 8,
frek kum = 8 12
13 14
15 16
17 18
19 20
Total 116 3.Kemudian dilakukan transformasi linier grayBaru = clrGray clrGrayMax 20
karena skala maksimum 20, pada program sebenarnya 255. Sementara nilai gray threshold dijadikan 0.
Gray Frek Gray Baru Keterangan
10 1
20 2
5 3
8 4
7 5
11 Perubahan nilai gray, lebih kecil dari threshold
maka lebih gelap 6
10 6 7 maka gray baru = 0
7 20
13 Gray baru = 711 20 =12,7 = 13
8 5
15 Gray baru = 811 20 =14,5 = 15
9 5
16 Perubahan nilay gray, yang lebih besar dari
threshold maka lebih cerah 10
7 18
11 8
20 12
13 14
15 16
17 18
19 20
Total 116 4.Akhirnya dihasilkan image yang lebih kontras dengan distribusi frekuensi sebagai
berikut:
Gray Frek lama
Frek baru keterangan
10 71
Background 1
20 2
5 Kosong artinya o
3 8
4 7
5 11
6 10
7 20
8 5
9 5
10 7
11 8
12 13
20 Hasil perhitungan piksel baru diatas
14