Sabtu, 28 Maret 2009

Image Thresholding / Pengambangan Citra

Dua nilai tingkat keabuan yaitu hitam dan putih. Secara umum proses pengambangan citra grayscale untuk menghasilkan citra biner adalah sebagai berikut.


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;
Related Post:

7 komentar:

free css templates mengatakan...

Hey you got a wonderful covering interesting article written in simple understanding language. I have bookmarked your blog for my future use.

Poetra Mahardika mengatakan...

Wuuiiiihh si Bro ahli bgt dalam rumus2 niehh.. Mantaaaap bro, aku udah lupa semua rumus2 waktu kuliah.. Hehehehe..

picas mengatakan...

Itu sudah ada algoritmanya.. sebenarnya tinggal ngikut aja...

abhan creative mengatakan...

bingung juga yach rumusnya...!!!
ngak sanggup dach.

picas mengatakan...

aq cmn ngikut2 algoritmanya aja..itu sudah dipatenkan dengan nama OTSU Thresholding

msd mengatakan...

metode otsu dalam delphi
kalau dengan visual basic bagaimana???

picas mengatakan...

bisa kalau bisa konversi source code itu..yg di delphi itu jg saya konversi dari c++

kyknya cm perlu dicoba saja..pasti bisa..