okaii to the point ae yo.. yang dibahas di sini adalah pemakaian dari rumusnya Kittler Illingworth (g mau disebut org yg g ada etika, asal nempel rumus org lain). Kittler-Illingworth sendiri merupakan proses pencarian Threshold (Threshold Selection) yang berbasis pada Minimum Error Rate yang dicari.. Untuk lebih detailnya silahkan dicari di internet mengenai penjelasan tertulisnya.. Kalo ada source Delphi e yang takcantumkan di posting ini, itu semua hasil kerja e tim ku low, jd nda njiplak sana sini ^^.. tp kyk e ya nda semua source code sih, ada yg cuma pseudocode aja ^^ o ya, post kali ini sangat teknis, maka bagi yang nda suka liat source, jangan diterusin deh hehehe bukan bermaksud ngusir sihhh drpd komplain2 nanti e :p

nah, dari rumus Kittler, ada bbrp hal yang perlu dicari.. O ya harap diingat juga bahwa image yg diproses adalah image Grayscale (8 bit).

1 : frekuensi pixel -> hal ini perlu untuk menghitung peluang pixel itu muncul nantinya. cara ndapetin no 1 ini gampang banget, tinggal dibaca pixel nya (pake getRGB value ataupun scanline), lalu dimasukkin ke dalam array (0-255, soalnya warna yang dites juga warna 0-255) yang bersesuaian dengan warna nya. misalkan sebuah titik warna nya 127, maka tambahkan array[127] (anggepan e anggota array ke 127 bertambah satu gr2 pixel itu) dan begitu seterusnya sampe semua pixel dimasukkin ke array. Jika total array 0-255 digabung, jumlahnya harus sama dengan jumlah pixel yang ada (width * height nya image)..

for y:=0 to Image.Picture.Height-1 do begin
buffer :=Image.Picture.Bitmap.ScanLine[y];
for x:=0 to Image.Picture.Width-1 do begin
r:=buffer[x]; // cr dapetin warna e
inc(arrFrequency[r]); // masukin ke array yang bersesuaian ma warna e
end;

kurang lebih kayak di atas gitu lah cara scanline e.. scanline itu suatu sintax delphi buat ngambil deretan byte dalam satu baris dari suatu image.. ingat itu adalah cr scanline 8 bit / 1 byte.. hohoho.. kalo diterapkan ke 24 bit / 3 byte, berarti baca e harus buffer[x*3] ..

2. Untuk iterasi kedua, kita bisa menghitung peluang kemunculan dari tiap T -> p(T) -> dapet e dari f(T) / jumlah pixel, terus peluang kumulatif nya P(T) -> dapet e dari p(T) + P(T-1), lalu g * p(g) [ g adalah nilai 0-255 ne dikalikan ama peluang muncul e di kondisi = g ]. Lalu kita nyari juga Mf(T) yang merupakan kumulatif/sigma dari g*p(g) mulai g = 0 sampe T..

for i:=1 to 256 do begin
pKecil:=frekuensi[i]/totalfrekuensi(ato jumlah pixel);
// kolom 2 : p
StringGrid1.Cells[2,i]:=floattostr(pKecil);

// kolom 3 : P(T)
StringGrid1.Cells[3,i]:=floattostr(pBesar[i-1] + pKecil);
// kolom 4 : g * p(g)
gp:=pKecil*(i-1);
sigmaGP:=sigmaGP+gp; //ngitung jumlah total g.p(g)
StringGrid1.Cells[4,i]:=floattostr(gp);
// kolom 5 : Mf(T)  -> i = T di iterasi ini
mf:=gp+mf0;
Mf(i):=floattostr(mf); mf0:=mf;
end;

3. Iterasi ke 3, kita nyari varian kuadrat F (tao kuadrat F).. cara ne yaitu njumlahin sigma dari (g – Mf(T))^2 * p(g) dengan g = 0 sampai T (nilai T saat itu).. Jangan lupa index yg sebenarnya itu dari 0-255, bukan 1 -256.. tapi saya yakin jika yg membaca ini pasti dgn mudah tau lah hehehe .. hanya mengingatkan..
source e :

for i:=1 to 256 do
begin
//kalau bukan baris pertama
if (i>1) then
begin
for j:=1 to i do
begin
VarianF := varianF + ( sqr( j-1 – Mf(i) ) * p(j-1) ) ; // j = g kalo di rumus yg dikasi dosen e, i = T
end;
end
else
begin
VarianF = 0;
end;

4. iterasi ke 4 nyari Mb(T).. Mb(T) = sigma g*p(g) [ dari g = 0 – 255 ] – Mf(T)..

for i:=1 to 256 do begin
// kolom 6 : Mb(T)
Mb(i)=floattostr( SigmaGP – Mf(i-1) );
end;

5. Menghitung varian B, cara iterasi e sama ma Varian F, cuma kan kalo varian F sigma e dari g=0 ampe T, ini dari g=T+1 ampe 255

//ngitungi Varian B
for i:=1 to 256 do
begin
VarianB := 0;
if (i<256) then
for j:=i+1 to 256 do
VarianB := VarianB + ( sqr( j-1 – Mb(i) ) * p(j-1) ) ;
else
VarianB := 0;

6. Ini rumus ulti ne bwat ngitungi Error rate e ^^ Rumus E = P(T)Log(Akar kuadrat varianF(T) + (1-P(T))Log(Akar kuadrat varianB(T)) – P(T) log P(T) – (1 – P(T) ) Log ( 1 – P(T))..

for i:=1 to 256 do begin
// kolom 11 : E
Err:=P(i-1) Log ( akar kuadrat VarianF(i-1) + (1-P(i-1) )Log( akar kuadrat varianB ) – P(i-1)Log(P(i-1) ) – (1- P(i-1) ) log (1-P(i-1) )
end;

naaahhhh

akhir e jadi deh kittler ku yg lmyn apikkkk… kapan hari salah e di varianF dan varianB ne itu…

wes nda pelit loo silll.. hehehehe..

o ya, untuk temen2 satu tim ku (yg biasa e jg baca blog ku), kalo kalian mmg keberatan ak bagi2 source e kita, akan tak ganti jadi pseudocode deh nti.. tp ini lagi buru2 hehehe. jadi ya copy paste dari delphi ne kita.. tp menurut pembaca sendiri, etis g sih ak mbahas rumus e org laen di sini ? wew.. soal e ak emoh disebut plagiat dsb.. hikz..

bagi yang kurang jelas ato pengen nanya, email aja di creandivity_10@hotmail.com, ato bg yang kenal saya, sms ae langsung nda papa.. hehehe.. bagi yang merasa le rumus ku salah (jgn liat syntax e, itu semi pseudocode jg soal e) dari segi matematis, tolong juga kastaw yaaa demi kemajuan bersama wkakaka.. thx…