I. Tujuan 1. Mahasswa dapat membuat program untuk merubah ctra warna RGB men|ad Gray-Scae 2. Mahasswa dapat membuat program threshodng atau mengatur |umah dera|at keabuan yang ada pada ctra II. Dasar Teori II.1 Mengubah itra !er"arna Menja#i Gray$Scale Proses awa yang banyak dakukan daam image processing adaah mengubah ctra berwarna men|ad ctra gray-scae, ha n dgunakan untuk menyederhanakan mode ctra. Sepert teah d|easkan d depan, ctra berwarna terdr dar 3 ayer matrk yatu R-ayer, G-ayer dan B-ayer. Sehngga untuk meakukan proses-proses sean|utnya tetap dperhatkan tga ayer d atas. Ba setap proses perhtungan dakukan menggunakan tga ayer, berart dakukan tga perhtungan yang sama. Sehngga konsep tu dubah dengan mengubah 3 ayer d atas men|ad 1 ayer matrk gray-scae dan hasnya adaah ctra gray-scae. Daam ctra n tdak ada ag warna, yang ada adaah dera|at keabuan. Untuk mengubah ctra berwarna yang mempunya na matrk masng-masng r, g dan b men|ad ctra gray scae dengan na s, maka konvers dapat dakukan dengan mengamb rata-rata dar na r, g dan b sehngga dapat dtuskan men|ad: Untuk mencoba proses konvers ctra berwarna men|ad ctra gray-scae n dapat dbuat program sepert gambar 1 Gambar 1. Contoh form untuk menangkap ctra. II.% Threshol#ing Threshodng dgunakan untuk mengatur |umah dera|at keabuan yang ada pada ctra. Dengan menggunakan threshodng maka dera|at keabuan bsa dubah sesua kengnan, msakan dngnkan menggunakan dera|at keabuan 16, maka tngga membag na dera|at keabuan dengan 16. Proses threshodng n pada dasarnya adaah proses pengubahan kuantsas pada ctra, sehngga untuk meakukan threshodng dengan dera|at keabuan dapat dgunakan rumus: dmana : w adaah na dera|at keabuan sebeum threshodng x adaah na dera|at keabuan seteah threshodng Berkut n contoh threshodng mua d 256, 16, 4 dan 2. Gambar 3.3. Contoh threshodng Untuk mencoba meakukan proses threshodng, peru dbuat program untuk dapat mengubah-ubah na treshodng sesua kengnan. Sehngga peru dtampkan dua ctra, yatu ctra as (gray-scae) dan has threshodngnya dengan na threshodng yang dtentukan meau nput sepert terhat pada gambar 3.3. III. Percobaan III.1 Mengubah itra !er"arna Menja#i Gray$Scale 1. Cara mengubah ctra warna men|ad gray-scae Buat apkas AppWzard sepert pada praktkum 1 Buat Menu dengan desan sepert berkut: Member varabe Iskan program pada button oad gambar vod CLmaDg::OnButton1() { CDC* pDC = m_pc1.GetDC(); CDC dcMem1; CRect rect; BITMAP bm; HBITMAP hBtmap=(HBITMAP)::LoadImage(AfxGetInstanceHande(), "satu.bmp",IMAGE_BITMAP, 0, 0, LR_LOADFROMFILE| LR_CREATEDIBSECTION); f(hBtmap) { f(m_bmpBtmap.DeeteOb|ect()) m_bmpBtmap.Detach(); m_bmpBtmap.Attach(hBtmap); } m_pc1.GetCentRect(rect); m_bmpBtmap.GetBtmap(&bm); dcMem1.CreateCompatbeDC(pDC); dcMem1.SeectOb|ect(&m_bmpBtmap); pDC->StretchBt(0,0,rect.Wdth(),rect.Heght(),&dcMem1, 0,0,bm.bmWdth,bm.bmHeght,SRCCOPY); } Iskan Program pada button to grayScae vod CLmaDg::OnButton2() { nt ,|,red,green,bue,gray; ong nt warna,warnagray; CDC* pDC = m_pc2.GetDC(); CDC dcMem1; CRect rect; BITMAP bm; HBITMAP hBtmap=(HBITMAP)::LoadImage(AfxGetInstanceHande(), "satu.bmp",IMAGE_BITMAP, 0, 0, LR_LOADFROMFILE| LR_CREATEDIBSECTION); f(hBtmap) { f(m_bmpBtmap.DeeteOb|ect()) m_bmpBtmap.Detach(); m_bmpBtmap.Attach(hBtmap); } m_pc2.GetCentRect(rect); m_bmpBtmap.GetBtmap(&bm); dcMem1.CreateCompatbeDC(pDC); dcMem1.SeectOb|ect(&m_bmpBtmap); for(=0;<bm.bmHeght;++) for(|=0;|<bm.bmWdth;|++) { warna=dcMem1.GetPxe(|,); WarnaToRGB(warna,&red,&green,&bue); gray=nt(red+green+bue)/3; warnagray=RGBToWarna(gray,gray,gray); dcMem1.SetPxe(|,,warnagray); } pDC->StretchBt(0,0,rect.Wdth(),rect.Heght(),&dcMem1, 0,0,bm.bmWdth,bm.bmHeght,SRCCOPY);// } Iskan program pada button toBnner vod CmaDg::OnButton3() { nt ,|,red,green,bue,gray; ong nt warna,warnagray,ratagray; CDC* pDC = m_pc3.GetDC(); CDC dcMem1; CRect rect; BITMAP bm; HBITMAP hBtmap=(HBITMAP)::LoadImage(AfxGetInstanceHande(), "satu.bmp",IMAGE_BITMAP, 0, 0, LR_LOADFROMFILE| LR_CREATEDIBSECTION); f(hBtmap) { f(m_bmpBtmap.DeeteOb|ect()) m_bmpBtmap.Detach(); m_bmpBtmap.Attach(hBtmap); } m_pc3.GetCentRect(rect); m_bmpBtmap.GetBtmap(&bm); dcMem1.CreateCompatbeDC(pDC); dcMem1.SeectOb|ect(&m_bmpBtmap); for(=0;<bm.bmHeght;++) for(|=0;|<bm.bmWdth;|++) { warna=dcMem1.GetPxe(|,); WarnaToRGB(warna,&red,&green,&bue); gray=nt(red+green+bue)/3; ratagray+=gray; } ratagray=ratagray/(bm.bmHeght*bm.bmWdth); for(=0;<bm.bmHeght;++) for(|=0;|<bm.bmWdth;|++) { warna=dcMem1.GetPxe(|,); WarnaToRGB(warna,&red,&green,&bue); gray=nt(red+green+bue)/3; f(gray<128) gray=0; ese gray=255; warnagray=RGBToWarna(gray,gray,gray); dcMem1.SetPxe(|,,warnagray); } pDC->StretchBt(0,0,rect.Wdth(),rect.Heght(),&dcMem1, 0,0,bm.bmWdth,bm.bmHeght,SRCCOPY);// } Fungs mengubah warna ke rgb vod WarnaToRGB(ong nt warna,nt *Red, nt *Green, nt *Bue) { *Red = warna & 0x000000FF; *Green = (warna & 0x0000FF00) >> 8; *Bue = (warna & 0x00FF0000) >> 16; } Fungs mengubah rgb ke warna ong nt RGBToWarna(nt Red, nt Green, nt Bue) { return(Red+(Green<<8)+(Bue<<16)); } Tambahkan pada header e pubc: CBtmap m_bmpBtmap; III.% Threshol#ing 1. Cara Treeshodng gambar Buat apkas AppWzard Buat Menu dengan desan sebaga berkut Member varabe Iskan program pada button oad gambar (grayscae) vod CEnamDg::OnButton1() { nt ,|,red,green,bue,gray; ong nt warna,warnagray; CDC* pDC = m_pc1.GetDC(); CDC dcMem1; CRect rect; BITMAP bm; HBITMAP hBtmap=(HBITMAP)::LoadImage(AfxGetInstanceHande(), "pens.bmp",IMAGE_BITMAP, 0, 0, LR_LOADFROMFILE| LR_CREATEDIBSECTION); f(hBtmap) { f(m_bmpBtmap.DeeteOb|ect()) m_bmpBtmap.Detach(); m_bmpBtmap.Attach(hBtmap); } m_pc1.GetCentRect(rect);// m_bmpBtmap.GetBtmap(&bm);// dcMem1.CreateCompatbeDC(pDC); dcMem1.SeectOb|ect(&m_bmpBtmap); for(=0;<bm.bmHeght;++) for(|=0;|<bm.bmWdth;|++) { warna=dcMem1.GetPxe(|,); WarnaToRGB(warna,&red,&green,&bue); gray=nt(red+green+bue)/3; warnagray=RGBToWarna(gray,gray,gray); dcMem1.SetPxe(|,,warnagray); } pDC->StretchBt(0,0,rect.Wdth(),rect.Heght(),&dcMem1, 0,0,bm.bmWdth,bm.bmHeght,SRCCOPY);// } Iskan program pada button kuantsas 16 vod CEnamDg::OnButton2() { nt ,|,red,green,bue,th; ong nt warna,wgray,xgray; CDC* pDC = m_pc2.GetDC(); CDC dcMem1; CRect rect; BITMAP bm; HBITMAP hBtmap=(HBITMAP)::LoadImage(AfxGetInstanceHande(), "pens.bmp",IMAGE_BITMAP, 0, 0, LR_LOADFROMFILE| LR_CREATEDIBSECTION); f(hBtmap) { f(m_bmpBtmap.DeeteOb|ect()) m_bmpBtmap.Detach(); m_bmpBtmap.Attach(hBtmap); } m_pc2.GetCentRect(rect); m_bmpBtmap.GetBtmap(&bm); dcMem1.CreateCompatbeDC(pDC); dcMem1.SeectOb|ect(&m_bmpBtmap); th= nt (256/16); for(=0;<bm.bmHeght;++) for(|=0;|<bm.bmWdth;|++) { warna=dcMem1.GetPxe(|,); WarnaToRGB(warna,&red,&green,&bue); wgray=(red+green+bue)/3; xgray=th*nt (wgray/th); warna=RGBToWarna(xgray,xgray,xgray); dcMem1.SetPxe(|,,warna); } pDC->StretchBt(0,0,rect.Wdth(),rect.Heght(),&dcMem1, 0,0,bm.bmWdth,bm.bmHeght,SRCCOPY); } Iskan program pada button kuantsas 4 vod CEnamDg::OnButton3() { nt ,|,red,green,bue,th; ong nt warna,wgray,xgray; CDC* pDC = m_pc3.GetDC(); CDC dcMem1; CRect rect; BITMAP bm; HBITMAP hBtmap=(HBITMAP)::LoadImage(AfxGetInstanceHande(), "pens.bmp",IMAGE_BITMAP, 0, 0, LR_LOADFROMFILE| LR_CREATEDIBSECTION); f(hBtmap) { f(m_bmpBtmap.DeeteOb|ect()) m_bmpBtmap.Detach(); m_bmpBtmap.Attach(hBtmap); } m_pc3.GetCentRect(rect); m_bmpBtmap.GetBtmap(&bm); dcMem1.CreateCompatbeDC(pDC); dcMem1.SeectOb|ect(&m_bmpBtmap); th= nt (256/4); for(=0;<bm.bmHeght;++) for(|=0;|<bm.bmWdth;|++) { warna=dcMem1.GetPxe(|,); WarnaToRGB(warna,&red,&green,&bue); wgray=(red+green+bue)/3; xgray=th*nt (wgray/th); warna=RGBToWarna(xgray,xgray,xgray); dcMem1.SetPxe(|,,warna); } pDC->StretchBt(0,0,rect.Wdth(),rect.Heght(),&dcMem1, 0,0,bm.bmWdth,bm.bmHeght,SRCCOPY);// } Iskan program pada button kuantsas 2 vod CEnamDg::OnButton4() { nt ,|,red,green,bue,th; ong nt warna,wgray,xgray; CDC* pDC = m_pc4.GetDC(); CDC dcMem1; CRect rect; BITMAP bm; HBITMAP hBtmap=(HBITMAP)::LoadImage(AfxGetInstanceHande(), "pens.bmp",IMAGE_BITMAP, 0, 0, LR_LOADFROMFILE| LR_CREATEDIBSECTION); f(hBtmap) { f(m_bmpBtmap.DeeteOb|ect()) m_bmpBtmap.Detach(); m_bmpBtmap.Attach(hBtmap); } m_pc4.GetCentRect(rect); m_bmpBtmap.GetBtmap(&bm); dcMem1.CreateCompatbeDC(pDC); dcMem1.SeectOb|ect(&m_bmpBtmap); th= nt (256/2); for(=0;<bm.bmHeght;++) for(|=0;|<bm.bmWdth;|++) { warna=dcMem1.GetPxe(|,); WarnaToRGB(warna,&red,&green,&bue); wgray=(red+green+bue)/3; xgray=th*nt (wgray/th); warna=RGBToWarna(xgray,xgray,xgray); dcMem1.SetPxe(|,,warna); } pDC->StretchBt(0,0,rect.Wdth(),rect.Heght(),&dcMem1, 0,0,bm.bmWdth,bm.bmHeght,SRCCOPY); } Fungs mengubah warna ke rgb vod WarnaToRGB(ong nt warna,nt *Red, nt *Green, nt *Bue) { *Red = warna & 0x000000FF; *Green = (warna & 0x0000FF00) >> 8; *Bue = (warna & 0x00FF0000) >> 16; } Fungs mengubah rgb ke warna ong nt RGBToWarna(nt Red, nt Green, nt Bue) { return(Red+(Green<<8)+(Bue<<16)); } Tambahan pada header e pubc: Cbtmap m_bmpBtmap; III.& 'atihan 1. Sebutkan proses utama pada proses konvers ctra berwarna men|ad ctra gray-scae? Apa perbedaan antara pemakaan rumus rata-rata x = (r + g + b) / 3 dan rumus RGB optma x = 0.42r + 0.32g + 0.28b. 2. Ubahah program konvers ctra berwarna men|ad ctra gray scae d atas dengan mengubah na gray scae dengan x = 0.5r + 0.2g + 0.3b x = 0.2r + 0.5g + 0.3b x = 0.2r + 0.2g + 0.5b x = 0.5r + 0.5g + 0b x = 0.5r + 0g + 0.5b Perhatkan bagamana perbedaan has konvers dengan tga macam rumus d atas. 3. |easkan apa pengertan dar threshodng, dan bagamana prosesnya? Apa hubungan threshodng dengan kuantsas pada ctra? 4. |easkan apakah konvers ctra ke ctra bner dan proses threshodng dengan na threshodng 2 menghaskan ctra yang sama ?