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 true; }
Percobaan 1 (Membuat Aplikasi Sederhana Untuk Proses Pengenalan Angka):
Pembuatan Aplikasi
·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 daridata pixelke RGBdan 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
·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
·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
·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
·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).
Analisa :
·Semakin kecil nilai error yang dihasilkan dari proses pengenalan angka,maka akan diperoleh hasil yang semakin valid & akurat.
·Dalam proses pengenalan angka ini dilakukan pembandingan dua macam obyek berdasarkan kesamaan bentuk dan nilai dari integral proyeksi horizontal & integral proyeksi verticalnya.