Senin, 06 Juli 2009

Laporan Resmi 5

Analisa :

* Latihan 1





Source code untuk brightness :
Nilai warna pada setiap pixel akan diambil rata-rata red, green dan bluenya kemudian nilai rata-rata itu akan ditambahkan dengan nilai brightness yang didapat dari textbox, nilai warna akan dibatasi dari 0 sampai dengan 255,kemudian semua titik akan diberikan nilai warna baru tersebut.

* Latihan 2





Source code untuk contrass :



Sama dengan proses brightness pada gambar RGB tetapi nilai k tidak ditambahkan dengan rata-rata nilai red, green bluenya melainkan dikalikan

* Latihan 3

Source code untuk autolevel :


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 :
- Brightness adalah proses penambahan kecerahan dari nilai derajat keabuan. Proses brightness ini dilakukan dengan menambahkan nilai derajat keabuan dengan suatu nilai penambah.
- Mengubah kontras dari suatu citra adalah proses pengaturan nilai range interval pada setiap nilai derajat keabuan

Laporan Resmi Praktikum7

Analisa :

1. 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

2. Tugas 2

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

3. Tugas 3

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

4. 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)

5. 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 6

Analisa :

1. Latihan 1

a. Transformasi citra negative

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 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

2. 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

TUGAS 7

Deteksi Warna Kulit

Satu 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 pembagian
yang sama.


TUGAS 4

Source codex :
bool CxImage::Jitter(long radius)
{
// check if the image is valid, this should be always the first line in
// the function
if (!pDib) return false;

// local variables
long nx,ny;

// temporary image to store the partial results of the algorithm
CxImage 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 direction
for(long y=ymin; y

// monitor the progress of the loops
info.nProgress = (long)(100*y/head.biHeight);

// let the application a way to exit quickly
if (info.nEscape) break;

// main loop : scan the image in horizontal direction
for(long x=xmin; x

// if the feature is enabled, process only the pixels inside the
// selected region
#if CXIMAGE_SUPPORT_SELECTION
if (SelectionIsInside(x,y))
#endif //CXIMAGE_SUPPORT_SELECTION
{
// main algorithm
nx=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 faster
if (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_ALPHA
tmp.AlphaSet(x,y,AlphaGet(nx,ny));
#endif //CXIMAGE_SUPPORT_ALPHA

}
}

}

// save the result and exit
Transfer(tmp);
return tru
e;
}



TUGAS 6

/ searching for vertical lines

short[,] 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 lines

short[,] 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 sequence
AForge.Imaging.Filters.FiltersSequence filterSequence =
new AForge.Imaging.Filters.FiltersSequence();
// add 8 thinning filters with different structuring elements
filterSequence.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 iterations
AForge.Imaging.Filters.FilterIterator filter =
new AForge.Imaging.Filters.FilterIterator(filterSequence, 10);

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.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

Y|OFN_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

E|LR_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_LOADFROMFILE|L

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_LOADFROMFILE|LR_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_HIDEREADONLY|OFN_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_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);

//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_LOADFROMFILE|LR_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_LOADFROMFILE|LR_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).