Postingan saya saat ini aka mencoba menjabarkan sedikit codingan yang udah saya buat menggunakan library CImg. Dua fungsi yang akan dibahas yaitu graythresh dan im2bw. Nama kedua fungsi tersebut sama dengan nama fungsi yang ada di Matlab. Fungsinya juga dibuat persis dengan yang ada di Matlab. Seperti namanya im2bw adalah fungsi untuk mengubah image dari grayscale ke dalam bentuk biner dengan threshold tertentu. Threshold bisa ditentukan sesuka kita ataupun bisa ditentukan dengan menggunakan fungsi graythresh.
Algoritme untuk im2bw cukup sederhana yaitu jika nilai piksel (x,y) melebihi nilai threshold yang diberikan maka nilai piksel akan diubah menjadi 1, namu jika kurang dari/sama dengan threshold makan nilai piksel tersebut akan diset 0. Hasil dari im2bw ini merupakan image dengan format biner/logika. Tentunya jika kita men-display gambar hasil dari im2bw ini cuma akan terlihat gambar hitam-putih saja. Fungsi im2bw dengan bahasa C++ (CImg) kira-kira seperti berikut:
CImg<bool> Form1::im2bw(CImg<double> img, double thresh){
double temp=255*thresh;
cimg_forXY(img,x,y){
if (img(x,y)>temp)
img(x,y)=1;
else
img(x,y)=0;
}
}
Parameter masukannya ada 2, yaitu:
1. CImg <double> img , ini adalah image yang mau kita ubah. Jika format image berupa float atau selain double, tinggal ganti aja formatnya didalam “<…>”.
2. thresh, ini threshold yang kita masukkan.
Parameter keluaranya tentu saja image dengan format biner. Tapi ga harus dengan format biner (bool), bisa juga format double atau float atau int.
Algoritme graythresh jika kita baca pada Help-nya Matlab, penentuan threshold-nya menggunakan metode Otsu. Threshold yang dihasilkan memiliki range 0-1. Fungsi graythresh dengan C++ yang saya buat kira-kira sebagai berikut: (ini saya otak-atik langsung dari fungsi graythresh di Matlab)
double Form1::graythresh(CImg<double> img){
//deklarasi variable
CImg<double> hist(256);
double mu_t,nMax,nMean=0,level;int i;
array<double>^ p=gcnew array <double>(256);
array<double>^ q=gcnew array <double>(256);
array<double>^ mu=gcnew array <double>(256);
array<double>^ temp1=gcnew array <double>(256);
array<double>^ omega=gcnew array <double>(256);
array<double>^ temp2=gcnew array <double>(256);
array<double>^ sigma=gcnew array <double>(256);//fungsi dari CImg untuk mendapatkan histogram dari image
hist=img.get_histogram (256,0,255);
for (i=0;i<256;i++){
p[i]=hist(i)/hist.sum();
}
for (i=0;i<256;i++){
q[i]=p[i]*(i+1);
}
omega[0]=p[0]; mu[0]=q[0];
for (i=1;i<256;i++){
omega[i]=p[i]+omega[i-1];
mu[i]=q[i]+mu[i-1];
}
mu_t=mu[255];
for (i=0;i<256;i++){
temp1[i]=square(omega[i]*mu_t-mu[i]);
temp2[i]=omega[i]*(1-omega[i]);
sigma[i]=temp1[i]/temp2[i];
}
array<double>^ posMax=gcnew array <double>(256);
nMax=cariMax(sigma,256); //Fungsi cariMax -> mendapatkan nilai Max dari array.
int k=0;
for (i=0;i<256;i++){
if (sigma[i]==nMax){
nMean+=(i+1);
k++;
}
}
nMean/=k;
level = (nMean-1)/255;
return level;
}
Parameter masukannya hanya image yang akan ditentukan global thresholdnya. Parameter keluarannya berupa sebuah angka yang merupakan threshold atau level yang bisa dipakai untuk mengkonversi image menjadi biner.
Implementasinya kira-kira sebagai berikut:
#include “stdafx.h”
#include “CImg.h”
#include “math.h”
int main(int argc,char **argv) {
CImg<double> img1(“1.jpg”), grayIm;
CImg<bool> imgBw;
grayIm = img1.norm().normalize(0,255); //image grayscale
double level;
level=graythresh(grayIm);
imgBw=im2bw(grayIm,level);
imgBw.display(); //menampilkan gambar biner
return 0;
}
Gambar aslinya kira-kira seperti ini:
Hasil konversi:
Untuk fungsi-fungsi dasar pada CImg seperti cimg_forXY, get_histogram(), dll dapat dipelajari pada CImg reference yang ada pada folder CImg yang sudah didownload.
Sekian sedikit info yang mudah-mudahan berguna bagi yang lainnya..

NURAFIFAH
July 13, 2010 at 7:46 am
thanks..
supriman
July 13, 2010 at 1:30 am
nice article…
jackysan
July 5, 2010 at 7:25 pm
Nice Posting…
Sukses ya…
Sering sering mampir…
Hehheee
kyo
July 4, 2010 at 5:50 am
gabung di web ku donk kk
tukar ilmu
http://www.ditusuk.in
NURAFIFAH
June 26, 2010 at 9:16 am
@Liza: silahkan!! Mudah-mudahan ga pusing
@freya:silahkan dicoba!! Kalau tertarik, trus mau nanya-nanya bisa tanya aja langsung. Terima Kasih.
freya
June 25, 2010 at 10:13 pm
kayaknya menarik. Kapan-kapan coba akh. Tapi ajarin yah, saya rada nga mudeng ama tulisannya wkakakakak
liza
June 23, 2010 at 8:33 pm
numpang baca