Senin, 06 Juli 2009

Tugas 7

Deteksi Warna KulitSatu fungsi image adalah satu penyajian matematis dari satu image, antara lain: f ( x) = f ( x,y ) intensitas cahaya atau daya pada posisi x. Satu dapat tulis: f ( x) = i( x). r ( x) dengan i (x ) iluminasi dan r (x ) pemantulan. Keduanya adalah terbatas: MEMASUKI<= i( x) <= dan memasuki<= r ( x) <= 1, sesuai dengan total pemantulan batas serapan dan penjumlahan. Pentingnya r (x ) dalam hal ini, tapi dengan cahaya struktur dan bentuk dari menaungi i(x ) permainan satu peran penting. Dengan tampilan hitam dan putih , f ( x) adalah satu nilai skalar; di image spektral multi f (x ) adalah satu nilai vektor. Image yang punya f 3 dimensi: f ( x) = { fred (x ), fgreen (x ), fblue (x )}. Pencitraan image diambil dari satelit atau pesawat udara, menghasilkan satu image yang mana dapat bisa berada pada dimensi 30 sampai dimensi 256 . Untuk 3 - D menggambar satu x= penggunaan {x,y,x }, dan untuk satu gugus berkala image: f ( x,t ). Satu model pendigitan dideskripsikan pada koordinat digtal ruang dan waktu, memanggil sampling, dan nilai intensitas tersebut, disebut dengan kuantisasi. Kamera CCD dan scanner sering mempergunakan persegi untuk melakukan sampling; pancaran pemasukan kemudian adalah terintegrasi berlalu area atau bagian dari ini. Untuk menggambar image yang mana harus diperlihatkan pada televisi, segiempat memiliki sisi dengan rasio 4:3 ( rasio aspek) atau 16:9 untuk layar lebar paling baru standar TV. Format lain digunakan juga pada kamera CCD percobaan seperti titik bersudut enam. Ini mempunyai keuntungan pada satu titik yang punya memiliki jenis sesuatu dari titik berdekatan. Ketika memilih satu sistem kamera lensa zoom, pastikan bahwa resolusinya cukup tinggi jadi saat itu resolusi paling kecil punya satu luas permukan dari paling tidak pada suatu titik tertentu. Banyaknya pixel yang diperlukan tergantung pada kebutuhan yang diukur dan dengan akurasi yang dihitung. Lebih tinggi daya pisah, makin banyak tempat yang diperlukan untuk penyimpanan ini. Waktu kalkulasi untuk algoritma juga bertambah, misal seperti n.ln (n ), n2 atau n3, n menjadi beberapa titik. Itulah sebabnya mengapa daya pisah piramida dipergunakan: antara lain dari satu 512*512 memperoleh image, kita hitung pertama 256*256, 128*128, 64*64, dsb. image. Menemukan objek dapat terjadi pada 64*64 gambar. Menentukan permukaan dari satu objek kemudian lebih tepat pada 512*512 gambar. Tentu, waktu yang ada harus dibebani siap sedia dibutuhkan ke bangun piramida seperti halnya ingatan ekstra memerlukan simpan image. Bagaimanapun, sejumlah titik pada image ekstra tidak akan pernah lebih dari sejumlah titik pada image asli (melihat bab 7.1.1). Sejumlah bytes memerlukan untuk menyimpan data intermediate, seperti itu tepi dari objek, dapat kurang

Pengenalan Angka dan Huruf
Aplikasi pengenalan angka dan huruf menggunakan Jaringan Syaraf Buatan (JSB)Secara umum dan sederhana, citra dapatdidefinisikan sebagai representasi visual dari suatu objek. Lebih jauh citra juga dapat diartikan sebagai gambaran yang representatif mengenai suatu objek sedemikian sehingga citra tersebut dapat memberikan kesan yang mendalam mengenai objek yang dimaksud. Jika ingin mendefinisikannya lebih bebas lagi, citra dapat didefinisikan sebagai bentuk visual yang dapat diterima secara baik oleh indera penglihatan, apapun bentuknya. Dalam bidang komputer, citra atau disebut juga image merupakan representasi visual dari suatu objek setelah mengalami berbagai transformasi data dari berbagai bentuk rangkaian numerik.Untuk mendapatkan data yang akurat dan konsisten dari setiap sampel, digunakan suatu metode sederhana yaitu dengan cara menghitung jumlah pixel aktif yang terdapat pada bagian-bagian dari sampel. Adapun algoritma umum dari pengekstrakan data numerik dari setiap sampel adalah sebagai berikut :1. Setiap sampel yang diamati, dibagi menjadi beberapa area, misalnya 4 kolom dan 5 baris,sehingga akan terdapat 20 area pengamatan; 2. jumlah pixel yang aktif dari setiap area yang ada dihitung secara akurat;3. dihasilkan sejumlah 20 data numerik dengan atribut kolom dan baris yang diharapkan dapat mewakili data ciri dari sampel yang diamati. Setelah melalui tahapan normalisasi, data-data numerik tadi akan menjadi data input pada JSB. Dengan demikian jumlah area yang ada pada setiap sampel akan bersesuaian dengan jumlah neuron input JSB yang akan digunakan. Agar dapat dihasilkan kumpulan data yang seragam, maka setiap sampel yang akan diamati haruslah memiliki jumlah area pembagianyang sama.

Image Retrieval
Ada dua cara yang dapat dilakukan dalam pengambilan kembali suatu image atau image retrievala. context-based adalah pengambilan data dengan merujuk pada kandungan semantik berkaitan dengan image, biasanya berhubungan dengan deskripsi image misalnya keyword dari image.b. content-based adalah pengambilan data dengan merujuk pada fitur image seperti warna, tekstur, bentuk, atau kombinasi atau yang biasa desebut dengan Content Based Image Retrieval (CBIR).Pada perkembangannya teknik context based menjadi tidak praktis dikarenakan adanya ukuran basis data yang besar dan penilaian subjektif dalam mengartikan image dengan text. Untuk menghindari teknik ini, maka digunakan pendekatan lain dalam image retrieval yaitu content based.CBIR adalah salah satu metodologi untuk pemanggilan kembali data image berdasarkan content sebuah image. Teknik CBIR yang banyak digunakan adalah teknik warna, teknik tekstur, dan teknik bentuk. Pada sistem CBIR, content visual dari image akan diekstraksi dan diuraikan menggunakan metode pengekstrakan ciri. Untuk mendapatkan kembali image, user menginputkan query image. Kemudian sistem akan mengekstrak image tersebut sehingga menghasilkan fitur ciri image. Fitur ciri image query dan image dalam database akan dicari similaritynya. Image yang memiliki nilai similarity yang paling tinggi akan muncul diurutan teratas. Gambar dibawah ini memperlihatkan bentuk umum sistem CBIR. Pada image tersebut terdapat dua jalur utama yaitu query dan database. Pada kedua lajur tersebut terdapat visual content description yang akan digunakan untuk proses similarity comparison, indexing dan retrieval.

Tugas 5

Pengenalan Angka
· Buat aplikasi AppWizard dan beri nama project dengan Lat17
· Buat disain dialog seperti pada gambar berikut dengan 6 buah control picture dan 7 buah button.



·
Ubah properti control dan tambahkan class variabel control tipe dan membernya seperti pada tabel berikut:
· Tambahkan program untuk melakukan konversi dari data pixel ke RGB dan dari data RGB ke data Pixel. Seperti berikut.

// merubah data pixel ke RGB
void WarnaToRGB(long
int warna,int *Red, int *Green, int *Blue)
{
*Red = warna & 0x000000FF;
*Green = (warna &
0x0000FF00) >> 8;
*Blue = (warna &
0x00FF0000) >> 16
;
}
//merubah RGB
ke data pixel
long int RGBToWarna(int Re
d, int Green, int Blue)
{
return(Red+(Green<<8)+(blue<<1
6));
}
· Tambahkan program pada button1 click seperti di bawah ini,yang berfungsi untuk melakukan load gambar angka1 (Load Angka [1]).
void
CLat17Dlg::OnButton
1()
{
// TODO: Add your control notification handler code here
static char BASED_CODE
szFilter[]="Bitmap Files
(*.bmp)*.bmp";
CFileDialog m_ldFile(TRUE, "*.bmp", name,
OFN_HIDEREADONL
YOFN_OVERWRITEP
ROMPT, szFilter);
if(m_ldFile.DoModal()==IDOK)
{
name=m_ldFile.GetP
athName();
}
CDC* p
DC = m_pic1.GetDC();//
mengarah kontrol picture
CDC dcMem; //mengarahkan obyek yg sdh dipilih pd
bitmap
CRect rect;//kotak di picture
BITMAP bm;//mendefinisikan
fungsi2 yg ada d bitmap
HBITMA
P hBitmap=(HBITMAP)::LoadImage(AfxGetInstanceHandle(),
name ,IMAGE_BITMAP,
0, 0, LR_LOADFROMFIL
ELR_CREATEDIBSECTION);
if(hBitmap)
{
if(m_bmpBitmap.Del
eteObject())
m_bmpBitmap.Detach
();
m_bmpBitmap.Attach(h
Bitmap);
}
m_pic1.GetClientRect(rect);
m_bmpBitmap.GetB
itmap(&bm);
dcMem.CreateCompati
bleDC(pDC);
//pDC->MoveTo(10,190);
//pDC->LineTo(300,190);
dcMem.SelectObje
ct(&m_bmpBitmap);
pDC->StretchBlt(0,0
,rect.Width(),rect.Height(),&dcMem,
0,0,bm.bmWidth,bm.bmHeight,SRCCOPY);
}
· Tambahkan program pada button2 click seperti di bawah ini,yang akan melakukan proses Integral Proyeksi Horizontal terhadap angka 1 (gambar1) dan menampilkannya pada Picture 5 (gambar 5).
void CLat17Dlg::OnButton
2()
{
// TODO: Add your control notification handler code here
int i,j;
int red,green,blue;
long int warna,warna1;
//float h[384];
CDC* pDC = m_pic1.GetDC();
CDC dcMem;
CRect rect; //kotak di
picture
BITMAP bm; //mendefinisikan fungsi2 yg ada d bitmap
HBITMAP hBitm
ap=(HBITMAP)::LoadImage(AfxGetInstanceHandle(),
name ,IMAGE_BIT
MAP, 0, 0, LR_LOADFROMFILEL
R_CREATEDIBSEC
TION);
m_pic1.GetClientRect(rect);
m_bmpBitmap.GetBit
map(&bm);
dcMem.CreateComp
atibleDC(pDC);

dcMem.SelectObject(&m_bmpBitmap);
for(j=0;j
{
hx[j]=0;
for(i=0;i
{
warna=dcMem.GetPixel(j,i);
WarnaToRGB(warna,&red,&green,&blue);
hx[j]+=(float)(255-red)/255;
}
hx[j]=hx[j]/2;
}
CDC* pDC1 = m_pic5.GetDC();
for(i=1;i
{
//1.3 nilai x atau lebar
pDC1->MoveTo(i*3.5,0);
pDC1->LineTo(i*3.5,hx[i]);
}
pDC->StretchBlt(0,0,rect.Width(),rect.Height(),&dcMem,
0,0,bm.bmWidth,bm.bmHeight,SRCCOPY);
}
· Tambahkan program pada button3 click seperti di bawah ini,yang akan melakukan proses Integral Proyeksi Vertical terhadap angka 1 (gambar1) dan menampilkannya pada Picture 2 (gambar 2).
void CLat17Dlg::OnButton3()
{
// TODO: Add your control notification handler code here
int i,j;
int red,green,blue;
long int warna,warna1;
//float h[384];
CDC* pDC = m_pic1.GetDC();
CDC dcMem;
CRect rect; //kotak di picture
BITMAP bm;//mendefinisikan fungsi2 yg ada d bitmap
HBITMAP hBitmap=(HBITMAP)::LoadImage(AfxGetInstanceHandle(),
name ,IMAGE_BITMAP, 0, 0, LR_LOADFROMFILELR_CREATEDIBSECTION);
m_pic1.GetClientRect(rect);
m_bmpBitmap.GetBitmap(&bm);
dcMem.CreateCompatibleDC(pDC);
dcMem.SelectObject(&m_bmpBitmap);
for(i=0;i
{
hy[i]=0;
for(j=0;j
{
warna=dcMem.GetPixel(j,i);
WarnaToRGB(warna,&red,&green,&blue);
hy[i]+=(float)(255-red)/255;
}
hy[i]=hy[i]/2;
}
CDC* pDC1 = m_pic2.GetDC();
for(i=1;i
{
//1.3 nilai x atau lebar
pDC1->MoveTo(0,i*2);
pDC1->LineTo(hy[i],i*2);
}
pDC->StretchBlt(0,0,rect.Width(),rect.Height(),&dcMem,
0,0,bm.bmWidth,bm.bmHeight,SRCCOPY);
}
· Tambahkan program pada button4 click seperti di bawah ini,yang berfungsi untuk melakukan load gambar angka2 (Load Angka [2]).
void CLat17Dlg::OnButton4()
{
// TODO: Add your control notification handler code here
static char BASED_CODE szFilter[]="Bitmap Files (*.bmp)*.bmp";
CFileDialog m_ldFile(TRUE, "*.bmp", name, OFN_HIDEREADONLYOFN_OVERWRITEPROMPT, szFilter);
if(m_ldFile.DoModal()==IDOK)
{
name=m_ldFile.GetPathName();
}
CDC* pDC = m_pic3.GetDC(); // mengarah kontrol picture
CDC dcMem; //mengarahkan obyek yg sdh dipilih pd bitmap
CRect rect; //kotak di picture
BITMAP bm; //mendefinisikan fungsi2 yg ada d bitmap
HBITMAP hBitmap=(HBITMAP)::LoadImage(AfxGetInstanceHandle(),
name ,IMAGE_BITMAP, 0, 0, LR_LOADFROMFILELR_CREATEDIBSECTION);
if(hBitmap)
{
if(m_bmpBitmap.DeleteObject())
m_bmpBitmap.Detach();
m_bmpBitmap.Attach(hBitmap);
}
m_pic3.GetClientRect(rect);
m_bmpBitmap.GetBitmap(&bm);
dcMem.CreateCompatibleDC(pDC);
//pDC->MoveTo(10,190);
//pDC->LineTo(300,190);
dcMem.SelectObject(&m_bmpBitmap);
pDC->StretchBlt(0,0,rect.Width(),rect.Height(),&dcMem,
0,0,bm.bmWidth,bm.bmHeight,SRCCOPY);
}
· Tambahkan program pada button5 click seperti di bawah ini,yang akan melakukan proses Integral Proyeksi Horizontal terhadap angka 2 (gambar3) dan menampilkannya pada Picture 6 (gambar 6).
void CLat17Dlg::OnButton5()
{
// TODO: Add your control notification handler code here
int i,j;
int red,green,blue;
long int warna,warna1;
//float h[384];
CDC* pDC = m_pic3.GetDC();
CDC dcMem;
CRect rect; //kotak di picture
BITMAP bm; //mendefinisikan fungsi2 yg ada d bitmap
HBITMAP hBitmap=(HBITMAP)::LoadImage(AfxGetInstanceHandle(),
name ,IMAGE_BITMAP, 0, 0, LR_LOADFROMFILELR_CREATEDIBSECTION);
m_pic3.GetClientRect(rect);
m_bmpBitmap.GetBitmap(&bm);
dcMem.CreateCompatibleDC(pDC);
dcMem.SelectObject(&m_bmpBitmap);
for(j=0;j
{
hx2[j]=0;
for(i=0;i
{
warna=dcMem.GetPixel(j,i);
WarnaToRGB(warna,&red,&green,&blue);
//penggunaan red, tidak terikat, bisa green atau blue
// digunakan 255- , supaya bisa masuk/mendapatkan warna hitam
hx2[j]+=(float)(255-red)/255;
}
hx2[j]=hx2[j]/2;
}
CDC* pDC1 = m_pic6.GetDC();
for(i=1;i
{
//1.3 nilai x atau lebar
// dimulai dari 0 ke atas, sehingga gambar histogramnya kebalik
pDC1->MoveTo(i*2,0);
pDC1->LineTo(i*2,hx2[i]);
}
pDC->StretchBlt(0,0,rect.Width(),rect.Height(),&dcMem,
0,0,bm.bmWidth,bm.bmHeight,SRCCOPY);
}
· Tambahkan program pada button6 click seperti di bawah ini,yang akan melakukan proses Integral Proyeksi Vertical terhadap angka 2 (gambar3) dan menampilkannya pada Picture 4 (gambar 4).
void CLat17Dlg::OnButton6()
{
// TODO: Add your control notification handler code here
int i,j;
int red,green,blue;
long int warna,warna1;
//float h[384];
CDC* pDC = m_pic3.GetDC();
CDC dcMem;
CRect rect; //kotak di picture
BITMAP bm; //mendefinisikan fungsi2 yg ada d bitmap
HBITMAP hBitmap=(HBITMAP)::LoadImage(AfxGetInstanceHandle(),
name ,IMAGE_BITMAP, 0, 0, LR_LOADFROMFILELR_CREATEDIBSECTION);
m_pic3.GetClientRect(rect);
m_bmpBitmap.GetBitmap(&bm);
dcMem.CreateCompatibleDC(pDC);
dcMem.SelectObject(&m_bmpBitmap);
for(i=0;i
{
hy2[i]=0;
for(j=0;j
{
warna=dcMem.GetPixel(j,i);
WarnaToRGB(warna,&red,&green,&blue);
hy2[i]+=(float)(255-red)/255;
}
hy2[i]=hy2[i]/2;
}
CDC* pDC1 = m_pic4.GetDC();
for(i=1;i
{
//1.3 nilai x atau lebar
pDC1->MoveTo(0,i*2);
pDC1->LineTo(hy2[i],i*2);
}
pDC->StretchBlt(0,0,rect.Width(),rect.Height(),&dcMem,
0,0,bm.bmWidth,bm.bmHeight,SRCCOPY);
}
· Tambahkan program pada button7 click seperti di bawah ini,yang berfungsi untuk melakukan load pencocokan antara angka1 dengan angka 2 dengan membandingkan perhitungan kedua integral proyeksinya,baik horizontal maupun vertical dari kedua gambar angka yang dibandingkan (Matching).
void CLat17Dlg::OnButton7()
{
// TODO: Add your control notification handler code here
CDC* pDC1 = GetDC();//
float dx=0,dy=0,d;
int i;
char str[5];
float jhx=0,jhy=0,jhx2=0,jhy2=0;
//digunakan untuk normalisasi angka1
for(i=0;i<50;i++)
jhx+=hx[i];
for(i=0;i<80;i++)
jhy+=hy[i];
for(i=0;i<50;i++)
hx[i]=hx[i]/jhx;
for(i=0;i<80;i++)
hy[i]=hy[i]/jhy;
//digunakan untuk normalisasi angka2
for(i=0;i<50;i++)
jhx2+=hx2[i];
for(i=0;i<80;i++)
jhy2+=hy2[i];
for(i=0;i<50;i++)
hx2[i]=hx2[i]/jhx2;
for(i=0;i<80;i++)
hy2[i]=hy2[i]/jhy2;
//hitung jarak
for(i=0;i<50;i++)
dx=dx+fabs (hx[i]-hx2[i]);
for(i=0;i<80;i++)
dy=dy+fabs (hy[i]-hy2[i]);
d=dx/50+dy/80;
sprintf(str,"%f",d);
pDC1->TextOut(60,320,str);
}
2. Menambah header file
· Buka file Lat17Dlg.h
· Tambahkan program seperti dibawah ini
public:
CLat17Dlg(CWnd* pParent = NULL); // standard constructor
CBitmap m_bmpBitmap;
CBitmap m_bmpBitmap2;
CString name;
float hx[300],hy[300];
float hx2[300],hy2[300];
3. Cara menjalankan program (Running Program)
· Pilih menu : Build->Execute (!)
· Click button1(Load Angka1 ): picture 1 akan menampilkan gambar angka1
· Click button2 (Integral Proyeksi Horizontal [1]): picture 5 akan menampilkan hasil integral proyeksi dari gambar angka1.
· Click button3 (Integral Proyeksi Vertical [1]): picture 2 akan menampilkan hasil integral proyeksi dari gambar angka1.
· Click button4(Load Angka2 ): picture 3 akan menampilkan gambar angka2
· Click button5 (Integral Proyeksi Horizontal [2]): picture 6 akan menampilkan hasil integral proyeksi dari gambar angka2.
· Click button6 (Integral Proyeksi Vertical [2]): picture 4 akan menampilkan hasil integral proyeksi dari gambar angka2.
· Click button7 (Matching): Akan dilakukan perhitungan kemiripan antara angka1 dengan angka2 berdasarkan bentuk integral proyeksi horizontal & integral proyeksi verticalnya.
· Hasil Running Aplikasi tampak seperti pada gambar berikut:
Tampilan Hasil Exsekusi program:

Pada Tampilan diatas dilakukan proses pembandingan antara angka 0 dan angka 6 berdasarkan integral proyeksi horizontal & integral proyeksi vertikalnya.dan diperoleh nilai error 0.012879. Semakin kecil nilai errornya (semakin mendekati 0) maka dua macam obyek akan semakin memiliki tingkat kemiripan yang tinggi.
Pada tampilan diatas dilakukan pengenalan angka terhadap obyek yang sama yaitu,angka 0 dan diperoleh hasil nilai error = 0.000000 (kedua obyek sama).

Diposkan oleh A. Fikri Akbar Hofa (013) di 08:26 0 komentar

Tugas 6
// searching for vertical linesshort[,] vse = new short[3, 3] {{ 0, 1, 0 },{ 0, 1, 0 },{ 0, 1, 0 }};AForge.Imaging.Filters.HitAndMiss vFilter =new AForge.Imaging.Filters.HitAndMiss( vse );System.Drawing.Bitmap vImage = vFilter.Apply( image );// searching for horizontal linesshort[,] hse = new short[3, 3] {{ 0, 0, 0 },{ 1, 1, 1 },{ 0, 0, 0 }};AForge.Imaging.Filters.HitAndMiss hFilter =new AForge.Imaging.Filters.HitAndMiss( hse );System.Drawing.Bitmap hImage = hFilter.Apply( image );source code 2// create filter sequenceAForge.Imaging.Filters.FiltersSequence filterSequence =new AForge.Imaging.Filters.FiltersSequence();// add 8 thinning filters with different structuring elementsfilterSequence.Add(new AForge.Imaging.Filters.HitAndMiss(new short [,] {{0, 0, 0}, {-1, 1, -1}, {1, 1, 1}}, HitAndMissMode.Thinning ));filterSequence.Add(new AForge.Imaging.Filters.HitAndMiss(new short [,] {{-1, 0, 0}, {1, 1, 0}, {-1, 1, -1}}, HitAndMissMode.Thinning ));filterSequence.Add(new AForge.Imaging.Filters.HitAndMiss(new short [,] {{1, -1, 0}, {1, 1, 0}, {1, -1, 0}}, HitAndMissMode.Thinning ));filterSequence.Add(new AForge.Imaging.Filters.HitAndMiss(new short [,] {{-1, 1, -1}, {1, 1, 0}, {-1, 0, 0}}, HitAndMissMode.Thinning ));filterSequence.Add(new AForge.Imaging.Filters.HitAndMiss(new short [,] {{1, 1, 1}, {-1, 1, -1}, {0, 0, 0}}, HitAndMissMode.Thinning ));filterSequence.Add(new AForge.Imaging.Filters.HitAndMiss(new short [,] {{-1, 1, -1}, {0, 1, 1}, {0, 0, -1}}, HitAndMissMode.Thinning ));filterSequence.Add(new AForge.Imaging.Filters.HitAndMiss(new short [,] {{0, -1, 1}, {0, 1, 1}, {0, -1, 1}}, HitAndMissMode.Thinning ));filterSequence.Add(new AForge.Imaging.Filters.HitAndMiss(new short [,] {{0, 0, -1}, {0, 1, 1}, {-1, 1, -1}}, HitAndMissMode.Thinning ));// create filter iterator for 10 iterationsAForge.Imaging.Filters.FilterIterator filter =new AForge.Imaging.Filters.FilterIterator(filterSequence, 10);

Tugas 6

// searching for vertical linesshort[,] vse = new short[3, 3] {{ 0, 1, 0 },{ 0, 1, 0 },{ 0, 1, 0 }};AForge.Imaging.Filters.HitAndMiss vFilter =new AForge.Imaging.Filters.HitAndMiss( vse );System.Drawing.Bitmap vImage = vFilter.Apply( image );// searching for horizontal linesshort[,] hse = new short[3, 3] {{ 0, 0, 0 },{ 1, 1, 1 },{ 0, 0, 0 }};AForge.Imaging.Filters.HitAndMiss hFilter =new AForge.Imaging.Filters.HitAndMiss( hse );System.Drawing.Bitmap hImage = hFilter.Apply( image );source code 2// create filter sequenceAForge.Imaging.Filters.FiltersSequence filterSequence = new AForge.Imaging.Filters.FiltersSequence();// add 8 thinning filters with different structuring elementsfilterSequence.Add(new AForge.Imaging.Filters.HitAndMiss(new short [,] {{0, 0, 0}, {-1, 1, -1}, {1, 1, 1}}, HitAndMissMode.Thinning ));filterSequence.Add(new AForge.Imaging.Filters.HitAndMiss(new short [,] {{-1, 0, 0}, {1, 1, 0}, {-1, 1, -1}}, HitAndMissMode.Thinning ));filterSequence.Add(new AForge.Imaging.Filters.HitAndMiss(new short [,] {{1, -1, 0}, {1, 1, 0}, {1, -1, 0}}, HitAndMissMode.Thinning ));filterSequence.Add(new AForge.Imaging.Filters.HitAndMiss(new short [,] {{-1, 1, -1}, {1, 1, 0}, {-1, 0, 0}}, HitAndMissMode.Thinning ));filterSequence.Add(new AForge.Imaging.Filters.HitAndMiss(new short [,] {{1, 1, 1}, {-1, 1, -1}, {0, 0, 0}}, HitAndMissMode.Thinning ));filterSequence.Add(new AForge.Imaging.Filters.HitAndMiss(new short [,] {{-1, 1, -1}, {0, 1, 1}, {0, 0, -1}}, HitAndMissMode.Thinning ));filterSequence.Add(new AForge.Imaging.Filters.HitAndMiss(new short [,] {{0, -1, 1}, {0, 1, 1}, {0, -1, 1}}, HitAndMissMode.Thinning ));filterSequence.Add(new AForge.Imaging.Filters.HitAndMiss(new short [,] {{0, 0, -1}, {0, 1, 1}, {-1, 1, -1}}, HitAndMissMode.Thinning ));// create filter iterator for 10 iterationsAForge.Imaging.Filters.FilterIterator filter =new AForge.Imaging.Filters.FilterIterator(filterSequence, 10);

Tugas 4

Source codex :bool CxImage::Jitter(long radius){// check if the image is valid, this should be always the first line in// the functionif (!pDib) return false;// local variableslong nx,ny;// temporary image to store the partial results of the algorithmCxImage tmp(*this,pSelection!=0,true,true);// limit the effects of the functions only in the smallest rectangle that// holds the selected region (defined with the Selection...() functions ),// this will speed up the loops.long xmin,xmax,ymin,ymax;if (pSelection){xmin = info.rSelectionBox.left; xmax = info.rSelectionBox.right;ymin = info.rSelectionBox.bottom; ymax = info.rSelectionBox.top;} else {xmin = ymin = 0;xmax = head.biWidth; ymax=head.biHeight;}// main loop : scan the image in vertical directionfor(long y=ymin; y // monitor the progress of the loopsinfo.nProgress = (long)(100*y/head.biHeight);// let the application a way to exit quicklyif (info.nEscape) break;// main loop : scan the image in horizontal directionfor(long x=xmin; x// if the feature is enabled, process only the pixels inside the// selected region#if CXIMAGE_SUPPORT_SELECTIONif (SelectionIsInside(x,y))#endif //CXIMAGE_SUPPORT_SELECTION{// main algorithmnx=x+(long)((rand()/(float)RAND_MAX - 0.5)*(radius*2));ny=y+(long)((rand()/(float)RAND_MAX - 0.5)*(radius*2));if (!IsInside(nx,ny)) {nx=x;ny=y;}// save the result in the temporary image.// if you can, use PixelColor only for 24 bpp images,// and PixelIndex for 8, 4 and 1 bpp images : it's fasterif (head.biClrUsed==0){tmp.SetPixelColor(x,y,GetPixelColor(nx,ny));} else {tmp.SetPixelIndex(x,y,GetPixelIndex(nx,ny));}// if the feature is enabled, process also the pixels// in the alpha layer#if CXIMAGE_SUPPORT_ALPHAtmp.AlphaSet(x,y,AlphaGet(nx,ny));#endif //CXIMAGE_SUPPORT_ALPHA}}}// save the result and exitTransfer(tmp);return true;}

Laporan Resmi Praktikum 2










Pada percobaan kedua memahami maksud dari percobaan ini. Yaitu bagaimana kita memproses gambar dengan mengambil warna RGB (red,green,blue)Tampilan awal adalah pada saat penekanan tombol merah warna yang keluar adalah merah. Begitu juga sama halnya untuk warna hijau dan biru. dan menamplikan semua warna langsung yaitu Red, Green, dan Blue





tugas 2


terdapat ketidaksempurnaan pada gambar di samping, yaitu adanya gambar lain yang masuk pada tampilan warna blue, namun untuk hasil output pada kombinasi warna RGB masing-masing bernilai 255, 255, 255 adalah warna putih hal ini sudah termasuk memenuhi kriteria.

Laporan Resmi Praktikum 7

Analisa
Tugas 1
a. Histogram citra gray scale : grafik yang menggambarkan hubungan antara suatu nilai dan banyaknya nilai itu muncul pada sebuah data
b. Kumulatif histogram citra gray scale : banyaknya kemunculan suatu nilai pada sebuah data
c. Histogram equalisasi citra gray scale : suatu proses perataan histogram, dimana distribusi nilai derajat keabuan pada suatu citra dibuat rata

Tugas 2
Citra yang dihasilkan menggunakan metode penambahan contrass menjadi lebih terang dari citra aslinya. Namun citra yang dihasilkan tidak teralu baik (terlalu terang).

Tugas 3
Citra yang dihasilkan menggunakan metode penambahan brightness menjadi lebih terang dari citra aslinya. Namun citra yang dihasilkan tidak terlalu baik (kabur)

Tugas 4

Hasil dari hequalization ternyata sesuai dengan yang terdapat pada teori yaitu naik secara linier. Hal tersebut dikarenakan Hequalization (perataan histogram) adalah suatu proses dimana histogram diratakan berdasarkan suatu fungsi linier (garis lurus)
1. Tugas 5
Citra yang didapatkan melalui proses perbaikan citra (enhancement) menggunakan histogram equalisasi ternyata memang lebih baik (jelas) dibandingkan dengan citra aslinya.

Kesimpulan :
1. Metode histogram equalisasi (perataan citra) memang baik digunakan untuk proses enhancement. Citra yang dihasilkan menjadi lebih baik (jelas)
2. Histogram equalization dilakukan dengan cara meratakan distribusi nilai derajat keabuan dari suatu citra.

Laporan Resmi Praktikum 6

Analisa
Latihan 1.

a. Transformasi Citra Negatif
Inversi citra adalah proses negatif pada citra, dimana setiap nilai citra dibalik dengan acuan threshold yang diberikan. Gambar yang dihasilkan baru sedikit terlihat ketika slider dimaksimalkan. Untuk citra dengan derajat keabuan 256, proses inversi citra didefinisikan dengan: xn = 255 – x

b. Transformasi Citra dengan fungsi LOG
Transformasi menggunakan fungsi LOG akan mempengaruhi contras dari suatu citra, citra yang ditransformasi menggunakan metode ini akan terlihat lebih terang.

c. Transformasi Citra dengan Fungsi Inverse LOG
Transformasi menggunakan fungsi inverse LOG akan mempengaruhi contras dari suatu citra, citra yang ditransformasi menggunakan metode ini akan terlihat lebih gelap.

d. Transformasi Citra Nth Power
Transformasi citra Nth power menghasilkan citra yang menyerupai grayscale.

e. Transformasi Citra Nth Root Power
Transformasi citra Nth root power menghasilkan citra yang lebih contras menyerupai transformasi menggunakan fungsi LOG



Latihan 2
· Negative : Semakin besar input gray level yang diberikan maka semakin kecil nilai output gray level yang dihasilkan. Nilai output yang didapatkan linier.
· LOG : Mula-mula nilai output gray level yang didapatkan mengalami peningkatan yang cukup besar seiring bertambahnya nilai input. Namun saat mencapai nilai input tertentu, peningkatan nilai output menjadi menurun hingga mendekati kondisi steady.
· Inverse LOG : Mula-mula nilai gray level yang didapatkan mengalami peningkatan yang kecil seiring bertambahnya nilai output. Namun saat mencapai nilai input tertentu, nilai output mengalami peningkatan yang cukup besar hingga mendekati kondisi steady
· Nth power : Karakteristiknya hamper sama seperti inverse LOG, namun lebih mendekati linier.
· Nth power root : Karakteristiknya hamper sama seperti LOG, namun lebih mendekati linier


Kesimpulan

Transformasi citra dapat dilakukan dengan berbagai cara, diantaranya dengan inverse (negative), proses logaritmik (LOG dan inverse LOG) , dan power law (Nth power dan Nth power root).
Untuk transformasi inverse diperlukan nilai maksimum yang didapatkan dari slider. Untuk transformasi LOG dan inverse LOG diperlukan nilai C yang diinputkan melalui text box. Sedangkan untuk transformasi power law dibutuhkan nilai C dan Y yang diinputkan melalui text box

Laporan Resmi Praktikum 5

Analisa.
1. Source code untuk brightness :

int k=GetDlgItemInt(IDC_EDIT1);
for(i=0;i255)gray=255;
if(gray<0)gray=0; warnagray="RGBToWarna(gray,gray,gray);">2. Source code untuk contrass :

int k=GetDlgItemInt(IDC_EDIT1);
for(i=0;i255)gray=255;
warnagray=RGBToWarna(gray,gray,gray);
dcMem1.SetPixel(j,i,warnagray);
}
Sama dengan proses brightness pada gambar RGB tetapi nilai k tidak ditambahakan dengan rata-rata nilai red, green bluenya melainkan dikalikan

3.Source code untuk autolevel :

int xmax=300,xmin=0,d;
for(i=0;ixmin)xmin=gray;
}
d=xmin-xmax;
for(i=0;ifor(j=0;j{
warna=dcMem1.GetPixel(j,i);
WarnaToRGB(warna,&red,&green,&blue);
gray=int(red+green+blue)/3;
gray=int(float(255/d)*(gray-xmax));
warna=RGBToWarna(gray,gray,gray);
dcMem1.SetPixel(j,i,warna);
}
Auto level akan mengatur brightness dan contrass gambar secara otomatis, dengan cara mencari nilai terbesar dan terkecil rata-rata red green blue tiap-tiap pixel, setelah itu akan dicari jarak antara nilai terkcil dan terbesar yang akan dijadikan sebagai nilai untuk memperbaiki citra, dalam hal ini citra akan diubah ke format grayscale.

Kesimpulan :
1. Brightness adalah proses penambahan kecerahan dari nilai derajat keabuan. Proses brightness ini dilakukan dengan menambahkan nilai derajat keabuan dengan suatu nilai penambah.
2. Mengubah kontras dari suatu citra adalah proses pengaturan nilai range interval pada setiap nilai derajat keabuan

Kamis, 02 Juli 2009

Laporan Resmi praktikum 4

Analisa :

1. Latihan 1

- Pada pengubahan sebuah gambar menjadi grayscale dapat dilakukan dengan cara mengambil semua pixel pada gambar kemudian warna tiap pixel akan diambil informasi mengenai 3 warna dasar yaitu merah, biru dan hijau (melalui fungsi warnatoRGB), ketiga warna dasar ini akan dijumlahkan kemudian dibagi tiga sehingga didapat nilai rata-rata. Nilai rata-rata inilah yang akan dipakai untuk memberikan warna pada pixel gambar sehingga warna menjadi grayscale, tiga warna dasar dari sebuah pixel akan diset menjadi nilai rata-rata (melalui fungsi RGBtowarna)

- Proses dari rumus keduanya hampir sama, bedanya pada rumus pertama warna pada setiap pixel yang telah dirata-rata akan dikalikan dengan nilai derajat keabuan (th), sehingga terjadi pengelompokan warna menjadi beberapa kelompok sesuai dengan nilai kuantisasinya.

2.Latihan 2

a. Untuk rumus x = 0.2r + 0.2g + 0.5b


b. Untuk rumus x = 0.5r + 0.5g + 0b

c. Untuk rumus x = 0.5r + 0g + 0.5b


Gambar yang paling terang diperoleh pada saat menggunakan rumus ke-2 (x = 0.5r + 0.5g + 0b). Sedangkan gambar paling tidak terang diperoleh saat menggunakan rumus ke-1 (x = 0.2r + 0.2g + 0.5b).

3. Latihan 3

- Thresholding digunakan untuk mengatur jumlah derajat keabuan yang ada pada citra. Dengan menggunakan thresholding maka derajat keabuan bisa diubah sesuai keinginan, misalkan diinginkan menggunakan derajat keabuan 16, maka tinggal membagi nilai derajat keabuan dengan 16. Proses thresholding ini pada dasarnya adalah proses pengubahan kuantisasi pada citra, sehingga untuk melakukan thresholding dengan derajat keabuan dapat digunakan rumus:

x=b.int(w/b)

dimana :

w adalah nilai derajat keabuan sebelum thresholding

x adalah nilai derajat keabuan setelah thresholding

- Hubungan thresholding dengan kuantisasi citra yaitu kuantisasi citra dapat diperoleh berdasarkan derajat keabuan yang dimasukkan dalam rumus thresholding.



Ternyata gambar yang dihasilkan dengan nilai thresholding 2 dan gambar hasil konversi citra ke citra biner tidak sama. Untuk gambar yang pertama digunakan metode thresholding dengan nilai derajad keabuan sebesar 2.

Kesimpulan :

  1. Pada proses thresholding, kuantisasi citra yang bervariasi dapat diperoleh dengan mengubah nilai derajat keabuan pada rumus thresholding.
  2. Proses kuantisasi hampir sama dengan grayscale, bedanya warna pada setiap pixel yang telah dirata-rata akan dikalikan dengan nilai derajat keabuan (th), sehingga terjadi pengelompokan warna mejadi beberapa kelompok sesuai dengan nilai kuantisasinya



Rabu, 27 Mei 2009

JAWABAN TUGAS 1

1. Tombol 1 digunakan untuk Load Gambar
void CPrak10_1Dlg::OnButton1()
{
// TODO: Add your control notification handler code here
static char BASED_CODE szFilter[]="Bitmap Files (*.bmp)|*.bmp||";
CFileDialog m_ldFile(TRUE, "*.bmp", name, OFN_HIDEREADONLY|OFN_OVERWRITEPROMPT, szFilter);
if(m_ldFile.DoModal()==IDOK)
{
name=m_ldFile.GetPathName();
}
CDC* pDC = m_pic1.GetDC();// mengarah kontrol picture
dcMem; //mengarahkan obyek yg sdh dipilih pd bitmap
CRect rect;//kotak di picture
BITMAP bm;//mendefinisikan fungsi2 yg ada d bitmap
HBITMAP hBitmap=(HBITMAP)::LoadImage(AfxGetInstanceHandle(),
name ,IMAGE_BITMAP, 0, 0, LR_LOADFROMFILE|LR_CREATEDIBSECTION);
if(hBitmap)
{
if(m_bmpBitmap.DeleteObject())
m_bmpBitmap.Detach();
m_bmpBitmap.Attach(hBitmap);
}
m_pic1.GetClientRect(rect);//
m_bmpBitmap.GetBitmap(&bm);//
dcMem.CreateCompatibleDC(pDC);
//pDC->MoveTo(10,190);
//pDC->LineTo(300,190);
dcMem.SelectObject(&m_bmpBitmap);
pDC->StretchBlt(0,0,rect.Width(),rect.Height(),&dcMem,
0,0,bm.bmWidth,bm.bmHeight,SRCCOPY);
}


2. Tombol 2 digunakan untuk Static Detection
void CPrak10_1Dlg::OnButton2()
{
// TODO: Add your control notification handler code here
int i,j;
int red,green,blue,gray;
long int warna, warna1;
CDC* pDC = m_pic2.GetDC();// mengarah kontrol picture
CDC dcMem; //mengarahkan obyek yg sdh dipilih pd bitmap
CRect rect;//kotak di picture
BITMAP bm;//mendefinisikan fungsi2 yg ada d bitmap
HBITMAP hBitmap=(HBITMAP)::LoadImage(AfxGetInstanceHandle(),
name,IMAGE_BITMAP, 0, 0, LR_LOADFROMFILE|LR_CREATEDIBSECTION);
if(hBitmap)
{
if(m_bmpBitmap.DeleteObject())
m_bmpBitmap.Detach();
m_bmpBitmap.Attach(hBitmap);
}
m_pic2.GetClientRect(rect);//
m_bmpBitmap.GetBitmap(&bm);//
dcMem.CreateCompatibleDC(pDC);
dcMem.SelectObject(&m_bmpBitmap);
for(i=0;i for(j=0;j {
warna=dcMem.GetPixel(j,i);
WarnaToRGB(warna,&red,&green,&blue);
// 102-215, 20-158, 0-179 trafic merah
//102-160, 70-100, 0-65fitur warna kulit
if(((red>102)&&(red<160))&&((green>70)&&(green<100))&&((blue>0)&&(blue>65)))
warna1=warna;
else
warna1=RGBToWarna(0,0,0);
dcMem.SetPixel(j,i,warna1);
}
pDC->StretchBlt(0,0,rect.Width(),rect.Height(),&dcMem,
0,0,bm.bmWidth,bm.bmHeight,SRCCOPY);
}


3. Tambahan Fungsi untuk merubah dari RGB ke data pixel
// merubah data pixel ke RGB
void WarnaToRGB(long int warna,int *Red, int *Green, int *Blue)
{
*Red = warna & 0x000000FF;
*Green = (warna & 0x0000FF00) >> 8;
*Blue = (warna & 0x00FF0000) >> 16;
}

//merubah RGB ke data pixel
long int RGBToWarna(int Red, int Green, int Blue)
{
return(Red+(Green<<8)+(Blue<<16));
}


4. Tombol 3 digunakan untuk Distance Detection
void CPrak10_1Dlg::OnButton3()
{
// TODO: Add your control notification handler code here
//int r=120, g=70, b=90; //untuk traffic merah
int r=144, g=89, b=65;
int k,j,red,green,blue,gray;
long int warna, warnagray;
double d;
CDC* pDC = m_pic3.GetDC();// mengarah kontrol picture
CDC dcMem; //mengarahkan obyek yg sdh dipilih pd bitmap
CRect rect;//kotak di picture
BITMAP bm;//mendefinisikan fungsi2 yg ada d bitmap
HBITMAP hBitmap=(HBITMAP)::LoadImage(AfxGetInstanceHandle(),
name,IMAGE_BITMAP, 0, 0, LR_LOADFROMFILE|LR_CREATEDIBSECTION);
if(hBitmap)
{
if(m_bmpBitmap.DeleteObject())
m_bmpBitmap.Detach();
m_bmpBitmap.Attach(hBitmap);
}
m_pic3.GetClientRect(rect);//
m_bmpBitmap.GetBitmap(&bm);//

dcMem.CreateCompatibleDC(pDC);
dcMem.SelectObject(&m_bmpBitmap);

for(j=0;j for(k=0;k {
warna=dcMem.GetPixel(k,j);
WarnaToRGB(warna,&red,&green,&blue);
//d=fabs(red-147)+fabs(green-44)+fabs(blue-48);
d=fabs(red-r)+fabs(green-g)+fabs(blue-b);
if(d<85)
warna=RGBToWarna(red,green,blue);
else
warna=RGBToWarna(0,0,0);
dcMem.SetPixel(k,j,warna);
}
pDC->StretchBlt(0,0,rect.Width(),rect.Height(),&dcMem,
0,0,bm.bmWidth,bm.bmHeight,SRCCOPY);
}

Senin, 25 Mei 2009

Analisa Laporan Praktikum 1

ANALISA PRAKTIKUM

Setelah menyelesaikan praktikum pertama, dapat dianalisa bahwa untuk mengerjakan praktikum tersebut pertama-tama kita membuat suatu projek baru yaitu berupa Multiple document, bukan Dialog based seperti pada percobaan sebelumnya. Projek tersebut diberi nama Test. Kemudian kita membuat menu-menu yang dibutuhkan berikut submenunya. Menu yang saya buat hanya dua yaitu Menu dan Bantuan. Untuk Menu ada empat submenu yang saya buat yaitu ‘Satu’, ‘Dua’, ‘Tiga’, ’Empat’, dan ‘Lima’. Sedangkan untuk ‘Bantuan’ hanya ada satu submenu yaitu Tentang Test. Listing programnya adalah :

void CTestView::OnSatu()

{

// TODO: Add your command handler code here

MessageBox("Selamat Belajar Pengolahan Citra");

}

void CTestView::OnDua()

{

// TODO: Add your command handler code here

CDC* pDC = GetDC();

pDC->TextOut(10,10,"Ini adalah Teks");

}

void CTestView::OnTiga()

{

// TODO: Add your command handler code here

CDC* pDC = GetDC();

pDC->MoveTo(50,20);

pDC->LineTo(50,200);

pDC->TextOut(30,5,"y");

pDC->MoveTo(50,200);

pDC->LineTo(250,200);

pDC->TextOut(260,200,"x");

}

void CTestView::OnEmpat()

{

// TODO: Add your command handler code here

}

void CTestView::OnLima()

{

// TODO: Add your command handler code here

}

Pada latihan no. 1, kita diminta untuk membuat suatu program untuk menampilkan messagebox dengan tulisan ‘Selamat Belajar Pengolahan Citra’ apabila salah satu submenu dipilih. Untuk menampilkan messagebox tersebut, menu yang dipilih adalah ‘Menu’ sedangkan submenu yang dipilih adalah ‘Satu

Pada latihan no. 2, kita diminta untuk membuat program yang bisa menampilkan tulisan ‘Ini adalah teks’ apabila salah satu submenu dipilih. Untuk menampilkan tulisan tersebut, menu yang dipilih adalah ‘Menu’, sedangkan submenu yang dipilih adalah ‘Dua’


Pada latihan no. 3, kita diminta untuk membuat program yang bisa menampilkan sumbu x dan y apabila salah satu submenu dipilih. Untuk menampilkan tulisan tersebut, menu yang dipilih adalah ‘Menu’, sedangkan submenu yang dipilih adalah ‘Tiga’

KESIMPULAN

*

MFC dapat digunakan untuk membuat program yang bisa menampilkan dan memroses suatu gambar.
*

Untuk membuat program yang menghasilkan tampilan seperti pada percobaan awal, jenis projek yang dipilih yaitu ‘Dialog based’. Sedangkan untuk membuat program yang menghasilkan tampilan seperti pada latihan, jenis projek yang dipilih yaitu ‘Multiple document’.

JAWABAN TUGAS 2

1. Tombol pertama untuk Load Gambar
void CPrak11_1Dlg::OnButton1()
{
// TODO: Add your control notification handler code here
static char BASED_CODE szFilter[]="Bitmap Files (*.bmp)|*.bmp||";
CFileDialog m_ldFile(TRUE, "*.bmp", name,
OFN_HIDEREADONLY|OFN_OVERWRITEPROMPT, szFilter);
if(m_ldFile.DoModal()==IDOK)
{
name=m_ldFile.GetPathName();
}
CDC* pDC = m_pic1.GetDC();// mengarah kontrol picture
CDC dcMem; //mengarahkan obyek yg sdh dipilih pd bitmap
CRect rect;//kotak di picture
BITMAP bm;//mendefinisikan fungsi2 yg ada d bitmap
HBITMAP hBitmap=(HBITMAP)::LoadImage(AfxGetInstanceHandle(),
name ,IMAGE_BITMAP, 0, 0, LR_LOADFROMFILE|LR_CREATEDIBSECTION);
if(hBitmap)
{
if(m_bmpBitmap.DeleteObject())
m_bmpBitmap.Detach();
m_bmpBitmap.Attach(hBitmap);
}
m_pic1.GetClientRect(rect);//
m_bmpBitmap.GetBitmap(&bm);//
dcMem.CreateCompatibleDC(pDC);
//pDC->MoveTo(10,190);
//pDC->LineTo(300,190);
dcMem.SelectObject(&m_bmpBitmap);
pDC->StretchBlt(0,0,rect.Width(),rect.Height(),&dcMem,
0,0,bm.bmWidth,bm.bmHeight,SRCCOPY);
}

2. Tombol 2 untuk menampilkan histogram untuk warna Red
void CPrak11_1Dlg::OnButton2()
{
// TODO: Add your control notification handler code here
int i,j,red,green,blue;
long int warna;
CDC* pDC = m_pic1.GetDC();// mengarah kontrol picture
CDC dcMem1; //mengarahkan obyek yg sdh dipilih pd bitmap
CRect rect;//kotak di picture
BITMAP bm;//mendefinisikan fungsi2 yg ada d bitmap
int hr[256];
HBITMAP hBitmap=(HBITMAP)::LoadImage(AfxGetInstanceHandle(),
name,IMAGE_BITMAP, 0, 0, LR_LOADFROMFILE|LR_CREATEDIBSECTION);
if(hBitmap)
{
if(m_bmpBitmap.DeleteObject())
m_bmpBitmap.Detach();
m_bmpBitmap.Attach(hBitmap);
}
m_pic1.GetClientRect(rect);//
m_bmpBitmap.GetBitmap(&bm);//

dcMem1.CreateCompatibleDC(pDC);
dcMem1.SelectObject(&m_bmpBitmap);

for(i=0;i<256;i++)
hr[i]=0;
for(i=0;i for(j=0;j {
warna=dcMem1.GetPixel(j,i);
WarnaToRGB(warna,&red,&green,&blue);
hr[red]=hr[red]+1;
}
float hmax=hr[0];
for(i=1;i<256;i++)
{
if(hr[i]>hmax)
hmax=hr[i];
}
for(i=0;i<256;i++)
hr[i]=120*hr[i]/hmax;

CDC* pDC1=m_pic2.GetDC();
pDC1->MoveTo(0,100);
pDC1->LineTo(550,100); //sb x
pDC1->MoveTo(0,100-(int)hr[0]); //ttk h[0]
for(i=1;i<256;i++)
{
pDC1->MoveTo(i*2,100);
pDC1->LineTo(i*2,100-(int)hr[i]);
}
}

Kamis, 12 Maret 2009

Praktikum (1) Pengenalan MFC

Dalam praktikum Pengolahan Citra Digital yang pertama yang akan dipraktikumkan mengenai perkenalan MFC. Tujuan dari praktikum perkenalan MFC adalah

* Dapat membuat program pengolahan citra menggunakan Visual C++dengan MFC.
* Dapat membuat dialog menggunakan Visual C++ dengan MFC.

Microsoft Foundation Classes atau MFC adalah sebuah library bagian dari Windows API dalam kelas C++.Dalam praktikum perkenalan MFC menggunakan IDE (Integrated Development Environtment). Komponen yang ada pada IDE antara lain:

* Toolbox=> berisi Bermacam-macam control yang dapat digunakan di project Visual C++ (pada prak Citra yang biasa dipakai : picture,textbox, button,slider dsb).
* Dialog Editor (MFC) =>merupakan area tempat membuat atau mengedit tampilan dialog box bukan form window.
* Solution Explorer=> berfungsi menampilkan organisasi project yang dibuat
* Class View=> berfungsi menampilkan simbol code project seperti : namespaces, classes, methods, dan functions.
* Resource View=> berfungsi menampilkan resource file dari project.
* Properties Window=> merupakan window yang dapat dipakai untuk mengedit atau merubah sifat control pada waktu disain.

Bila kita mendengar pengolahan citra digital pasti dipikiran kita akan terpikir bagaimana kita dapat merekayasa dari sebuah gambar, akan tetapi bila menurut pengertian yang lebih ilmiah pengolahan citra digital adalah suatu proses merubah dari gambar asli menjadi gambar lain yang sesuai dengan keinginan kita.

Bila kita buat blok diagramnya maka pengolahan citra digital seperti gambar dibawah:

Cara menjalankan Visual C++ dengan MFC:

1. Pertama kali yang dilakukan adalah membuka aplikasiVisual C++ 6.0 dengan cara Pilih menu : Start->Programs->Microsoft Visual Studio 6.0->Microsoft Visual C++ 6.0
2. Setelah Visual C++ telah terbuka langkah selanjutnya adalah memberi nama program. dengan caraPilih menu : File->New->Projects->MFC AppWizard(exe) Isi Project name dan terakhir tekan tombol OK.
3. Kemudian kita akan memilih isi dari program yang akan kita buat. Dengan cara : • Step 1 :(aplikasi apa yang ingin dibuat) pilih dialog based untuk membuat aplikasi memakai dialog. Tekan tombol Next.
• Step 2 :
1.(fitur apa saja yang akan dimasukkan) pilih About box dan 3D controls untuk pilihan standar.
2.(mendukung aplikasi apa ?) pilih ActiveX controls untuk pilihan standar.
3. apakah kamu ingin memasukkan WOSA ? Window Sockets tidak dipilih untuk pilihan standard.
4.Kemudian masukkan judul pada dialaog, Title sudah berisi text sama dengan nama project untuk pilihan standard, Tekan tombol Next.
• Step 3 :
1. Bentuk Project yang diinginkan ?
Pilihan standard dan yang aktif hanya MFC Standard.
2. Apakah kamu ingin mengenerate source file coment ? pilihan standard Yes, Please
3. Apakah kamu ingin menggunakan MFC Library ? pilihan standard As a shared DLL,
• Step 4 : AppWizard creates the following classes for you
4. Cara menjalankan program• Pilih menu : Build->Execute (!) Tekan tombol Yes, untuk menutup aplikasi.

Cara mendisain dialog

1. Cara membuat dialog • Buat aplikasi AppWizard seperti pada praktikum 1 dan beri nama project dengan Dialog
• Pilih ResourceView pada workspace
• Pilih folder paling atas dengan cara klik pada tanda +
• Pilih folder dialog dengan cara klik pada tanda +
• Klik 2 kali IDD_DIALOG_DIALOG
2. Menghapus dan menambah kontrol pada dialog • Untuk menghapus control : aktifkan control dengan cara klik pada area control lanjutkan dengan menekan tombol delete. Cobalah untuk menghapus control : text TODO, button OK dan Cancel. • Untuk menambah control: (button) pilih icon button control pada toolbox drag drop ke editor dialog.
(static text) pilih icon control pada toolbox drag drop ke editor dialog. • Tambahkan control (dua button, 1 static text, 1 picture) pada dialog editor
3. Mengaktifkan Control • Pilih control button1, double clik, pada dialog Add Member Function klik • Atau klik kanan, pilih klik ClassWizard, pada MFC Class Wizard Dialog messages aktifkan BN_CLICKED, double clik, pada dialog Add Member Function klik OK.
4. Rubah terlebih dahulu ID dari static text = ID_label dan ID dari picture = ID_pic1, dengan cara aktifkan control dan klik kanan pilih properti.
5. Pada dialog MFC classwizard,Member Variabels edit type dan member dari control
6. Menulis fungsi pada button1 clik • Tambahkan program untuk menampilkan pesan pada static text seperti
dibawah ini
void CDialogDlg::OnButton1()
{
// TODO: Add your control notification handler code here
SetDlgItemText(IDC_label,"Belajar Prak Citra dgn VC++ dan MFC");
}
Jalankan program dengan memilih menu Build->Execute (!)
7. Tambahkan deklarasi kelas CBitmap pada File View – Header Files – dialogDlg.h
// Construction
public:
CDialogDlg(CWnd* pParent = NULL); // standard constructor
CBitmap m_bmpBitmap;
//
8. Menulis fungsi pada button2 clik
void CDialogDlg::OnButton2()
{
// TODO: Add your control notification handler code here
CDC* pDC = m_pic1.GetDC();//
CDC dcMem1;
CRect rect;//kotak di picture
BITMAP bm;//
HBITMAP
hBitmap=(HBITMAP)::LoadImage(AfxGetInstanceHandle(),
"pens.bmp",IMAGE_BITMAP, 0, 0,
LR_LOADFROMFILE|LR_CREATEDIBSECTION);
if(hBitmap)
{
if(m_bmpBitmap.DeleteObject())
m_bmpBitmap.Detach();
m_bmpBitmap.Attach(hBitmap);
}
m_pic1.GetClientRect(rect);//
m_bmpBitmap.GetBitmap(&bm);//
dcMem1.CreateCompatibleDC(pDC);
dcMem1.SelectObject(&m_bmpBitmap);
pDC->StretchBlt(0,0,rect.Width(),rect.Height(),&dcMem1,
0,0,bm.bmWidth,bm.bmHeight,SRCCOPY);//
}
Jalankan program dengan memilih menu Build->Execute (!)