Anda di halaman 1dari 7

1

Penjelasan
Tujuan dari metode Otsu adalah membagi histogram citra gray level ke dalam dua daerah
yang berbeda secara otomatis tanpa membutuhkan bantuan user untuk memasukkan nilai
ambang.
Pendekatan yang dilakukan 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 membagi objek latardepan dan latarbelakang.
Misalkan
{ } 0,1, 2,..., 1 L adalah level beda intensitas L dari sebuah citra berukuran MN
piksel, dan menyatakan jumlah piksel pada level intensitas ke-i. Jumlah total piksel citra
adalah . Peluang setiap piksel pada level intensitas ke-i adalah:
i
i
n
p
MN
=

Misalkan dipilih nilai ambang ( ) , 0 1 T k k L = < , maka nilai ambang k, memaksimumkan
varian antar kelas (between-class variance)
2
( )
B
k o yang didefinisikan sebagai:
| |
| |
2
1 2
1 1
( ) ( )
( )
( ) 1 ( )
G
B
m p k m k
k
p k p k
o

=


dimana,

1
0
( )
k
i
i
P k p
=
=



0
( )
k
i
i
m k ip
=
=



1
0
L
G i
i
m ip

=
=


Jadi nilai ambang optimum adalah * k , yang memaksimumkan
2
( )
B
k o yaitu:
2 2
0 1
( *) max ( )
B B
k L
k k o o
s s
=

Setelah mendapat nilai ambang optimum, maka citra input ( , ) f x y akan terbagi menjadi :


1 if ( , ) *
( , )
0 if ( , ) *
f x y k
g x y
f x y k
>
=

s


dimana x = 0, 1, 2,, M 1 dan y = 0, 1, 2,, N-1.


2

Hasil dan Analisis



Gambar 1. Hasil simulasi pada citra 1
Dari hasil simulasi dari citra pertama pada Gambar 1 dapat dilihat bahwa nilai ambang optimum
adalah sebesar 167, dimana nilai ini diperoleh dari nilai maksimum dari varian antar kelas (between
class variance)
2
( )
B
k o

yang terjadi pada saat nilai k = 167. Nilai ambang optimum pada hasil simulasi
terhadap citra pertama adalah unik dimana nilai maksimum dari varian antar kelas (between-class
variance)
2
( )
B
k o hanya terjadi pada saat nilai k = 167, sehingga citra input ( , ) f x y terbagi menjadi :
1 if ( , ) 167
( , )
0 if ( , ) 167
f x y
g x y
f x y
>
=

s




nilai k* (k maksimum) : 167
3





Gambar 2. Hasil simulasi pada citra 2
Dari hasil simulasi dari citra kedua pada Gambar 2 dapat dilihat bahwa nilai ambang optimum adalah
sebesar 92, dimana nilai ini diperoleh dari rata-rata nilai maksimum dari varian antar kelas (between
class variance)
2
( )
B
k o

yang terjadi pada saat nilai k = 85 sampai k = 100. Karena nilai maksimum dari
varian antar kelas (between-class variance)
2
( )
B
k o tidak unik dimana terjadi pada range nilai k = 85 -
100, maka nilai ambang optimum ditentukan dengan mencari nilai rata-rata dari range maksimum
dari varian antar kelas (between-class variance)
2
( )
B
k o yang diperoleh :
k* = (85 + 100) / 2 = 92 (hasil pembulatan, karena harus bilangan bulat)
sehingga citra input ( , ) f x y terbagi menjadi :
1 if ( , ) 92
( , )
0 if ( , ) 92
f x y
g x y
f x y
>
=

s



range nilai k* (k maksimum) : 85 - 100
4




Gambar 3. Hasil simulasi pada citra 3
Dari hasil simulasi dari citra ketiga pada Gambar 3 dapat dilihat bahwa nilai ambang optimum adalah
sebesar 103 (hasil pembulatan), dimana nilai ini diperoleh dari rata-rata nilai maksimum dari varian
antar kelas (between class variance)
2
( )
B
k o

yang terjadi pada saat nilai k = 103 dan k = 104. Karena
nilai maksimum dari varian antar kelas (between-class variance)
2
( )
B
k o tidak unik dimana terjadi
pada range nilai k = 103 - 104, maka nilai ambang optimum ditentukan dengan mencari nilai rata-
rata dari range maksimum dari varian antar kelas (between-class variance)
2
( )
B
k o yang diperoleh :
k* = (103 + 104) / 2 = 103 (hasil pembulatan, karena harus bilangan bulat)
sehingga citra input ( , ) f x y terbagi menjadi :
1 if ( , ) 103
( , )
0 if ( , ) 103
f x y
g x y
f x y
>
=

s




range nilai k* (k maksimum) : 103 - 104
5

Lampiran
Listing Program

using System.Drawing;
using System.Drawing.Imaging;
using System.Windows.Forms;
using System;

namespace OtsuThreshold
{
class Otsu
{
// fungsi untuk menghitung nilai q
private float Px(int init, int end, int[] hist)
{
int sum = 0;
int i;
for (i = init; i <= end; i++)
sum += hist[i];

return (float)sum;
}

// fungsi untuk menghitung nilai rata-rata
private float Mx(int init, int end, int[] hist)
{
int sum = 0;
int i;
for (i = init; i <= end; i++)
sum += i * hist[i];

return (float)sum;
}

// Fungsi untuk mencari nilai rata-rata dari range nilai maks dari
'between class variance'
private int findMax(float[] vec, int n)
{
float maxVec = 0;
int idxStart = 0, idxEnd = 0;
int idx=0;
int i;

for (i = 1; i < n - 1; i++)
{
if (vec[i] > maxVec)
{
idxStart = i;
maxVec = vec[i];
}
if ((i >= idxStart) && (vec[i] == maxVec))
{
idxEnd = i;
maxVec = vec[i];
}
}

6

idx = (int)((idxStart + idxEnd) / 2.0f);
//MessageBox.Show(string.Format("awal : {0}, akhir : {1}, rata-
rata : {2}", idxStart, idxEnd, idx));
return idx;
}

// Menghitung histogram citra keabuan
unsafe private void getHistogram(byte* p, int w, int h, int ws,
int[] hist)
{
hist.Initialize();
for (int i = 0; i < h; i++)
{
for (int j = 0; j < w*3; j+=3)
{
int index=i*ws+j;
hist[p[index]]++;
}
}
}

// Mencari nilai Otsu Threshold
public int getOtsuThreshold(Bitmap bmp, ListBox listBox)
{
byte t=0;
float[] vet=new float[256];
int[] hist=new int[256];
vet.Initialize();

float p1,p2,p12;
int k;
listBox.Items.Clear();
BitmapData bmData = bmp.LockBits(new Rectangle(0, 0, bmp.Width,
bmp.Height),
ImageLockMode.ReadOnly, PixelFormat.Format24bppRgb);
unsafe
{
byte* p = (byte*)(void*)bmData.Scan0;

getHistogram(p,bmp.Width,bmp.Height,bmData.Stride, hist);

//iterasi terhadap semua kemungkianan nilai t dan maksimal
between class variance
for (k = 1; k != 255; k++)
{
p1 = Px(0, k, hist);
p2 = Px(k + 1, 255, hist);
p12 = p1 * p2;
if (p12 == 0)
p12 = 1;
float diff=(Mx(0, k, hist) * p2) - (Mx(k + 1, 255,
hist) * p1);
vet[k] = (float)diff * diff / p12;
listBox.Items.Add(string.Format("k = {0}, p1 = {1}, p2
= {2}, vbc[k] = {3}", k, p1, p2, vet[k])); //
//vet[k] = (float)Math.Pow((Mx(0, k, hist) * p2) -
(Mx(k + 1, 255, hist) * p1), 2) / p12;
}
}
bmp.UnlockBits(bmData);
t = (byte)findMax(vet, 256);
7

listBox.Items.Add("nilai maksimal adalah " + t);

return t;
}

// Fungsi untuk membuat citra Gray Scale
public void Convert2GrayScaleFast(Bitmap bmp)
{
BitmapData bmData = bmp.LockBits(new Rectangle(0, 0, bmp.Width,
bmp.Height),
ImageLockMode.ReadWrite, PixelFormat.Format24bppRgb);
unsafe
{
byte* p = (byte*)(void*)bmData.Scan0.ToPointer();
int stopAddress = (int)p + bmData.Stride * bmData.Height;
while ((int)p != stopAddress)
{
p[0] = (byte)(.299 * p[2] + .587 * p[1] + .114 * p[0]);
p[1] = p[0];
p[2] = p[0];
p += 3;
}
}
bmp.UnlockBits(bmData);
}

// prosedur untuk threshold citra
public void threshold(Bitmap bmp, int thresh)
{
BitmapData bmData = bmp.LockBits(new Rectangle(0, 0, bmp.Width,
bmp.Height),
ImageLockMode.ReadOnly, PixelFormat.Format24bppRgb);
unsafe
{
byte* p = (byte*)(void*)bmData.Scan0.ToPointer();
int h= bmp.Height;
int w = bmp.Width;
int ws = bmData.Stride;

for (int i = 0; i < h; i++)
{
byte *row=&p[i*ws];
for (int j = 0; j < w * 3; j += 3)
{
row[j] = (byte)((row[j] > (byte)thresh) ? 255 : 0);
row[j+1] = (byte)((row[j+1] > (byte)thresh) ? 255 :
0);
row[j + 2] = (byte)((row[j + 2] > (byte)thresh) ?
255 : 0);
}
}
}
bmp.UnlockBits(bmData);
}
}
}