g(x,y) adalah citra biner dari citra grayscale
f(x,y), dan T menyatakan nilai ambang. Nilai T memegang peranan yang sangat penting dalam proses pengambangan. Kualitas hasil citra biner sangat tergantung pada nilai T yang digunakan.
Metode Otsu
Metode Otsu menghitung nilai ambang T secara otomatis berdasarkan citra masukan. Pendekatan yang digunakan oleh metode Otsu adalah dengan melakukan analisis diskriminan yaitu menentukan suatu variabel yang dapat membedakan antara dua atau lebih kelompok yang muncul secara alami. Analisis Diskriminan akan memaksimumkan variabel tersebut agar dapat memisahkan objek dengan latar belakang.
Misalkan nilai ambang yang akan dicari dinyatakan dengan k. Nilai k berkisar antara 1 sampai dengan L, dengan L = 255. Probabilitas untuk piksel i dinyatakan dengan :
dengan ni menyatakan jumlah piksel dengan tingkat keabuan I, dan N menyatakan banyaknya piksel pada citra.
Nilai momen kumulatif ke-nol, momen kumulatif ke-satu, dan nilai rata-rata
berturut-turut dapat dinyatakan sebagai berikut :
Nilai ambang k dapat ditentukan dengan memaksimumkan persamaan:
dengan
Berikut Source Code Delphi Thresholding Otsu :
procedure TEnrollForm.Threshold(Image:TBitmap);
const level=255;
var
histogram: array[0..255] of integer;
PH: PByteArray;
TotalMean, Variance, maxVariance, zerothCumuMoment, firstCumuMoment : real;
i,j,k: integer;
p: PByteArray;
threshold:byte;
area: Word;
begin
for i:=0 to level do
begin
histogram[i]:=0;
end;
for i:=0 to Image.Height-1 do
begin
PH:=Image.ScanLine[i];
for j:= 0 to Image.Width-1 do
begin
inc(histogram[PH[3*j]]);
end;
end;
//compute otsu method
threshold:=0;
totalMean := 0;
maxVariance := 0;
firstCumuMoment := 0;
zerothCumuMoment := 0;
area := Image.Height * Image.Width;
for k:= 0 to level do
TotalMean := TotalMean + (k * histogram[k] / area);
for k:= 0 to level do
begin
zerothCumuMoment := zerothCumuMoment + histogram[k] / area;
firstCumuMoment := firstCumuMoment + (k * histogram[k] / area);
variance := totalMean * zerothCumuMoment - firstCumuMoment;
variance := variance * variance;
if ((zerothCumuMoment <> 0) and (zerothCumuMoment <> 1)) then
begin
variance := variance /(zerothCumuMoment * (1 - zerothCumuMoment));
if (maxVariance < variance) then
begin
maxVariance := variance;
threshold := k;
end;
end;
end;
for i:=0 to Image.Height-1 do begin
p:= Image.ScanLine[i];
for j:=0 to Image.Width-1 do begin
for k:=0 to 2 do
if (p[3*j])and (p[3*j+1]) and (p[3*j+2])>threshold then
p[3*j+k]:= 255
else
p[3*j+k]:= 0;
end;
end;
ImgThres.Picture.Bitmap:=Image;
end;
7 komentar:
Hey you got a wonderful covering interesting article written in simple understanding language. I have bookmarked your blog for my future use.
Wuuiiiihh si Bro ahli bgt dalam rumus2 niehh.. Mantaaaap bro, aku udah lupa semua rumus2 waktu kuliah.. Hehehehe..
Itu sudah ada algoritmanya.. sebenarnya tinggal ngikut aja...
bingung juga yach rumusnya...!!!
ngak sanggup dach.
aq cmn ngikut2 algoritmanya aja..itu sudah dipatenkan dengan nama OTSU Thresholding
metode otsu dalam delphi
kalau dengan visual basic bagaimana???
bisa kalau bisa konversi source code itu..yg di delphi itu jg saya konversi dari c++
kyknya cm perlu dicoba saja..pasti bisa..
Posting Komentar