資源描述:
《vc編程實(shí)現(xiàn)灰度圖像與彩色圖像的相互轉(zhuǎn)換》由會(huì)員上傳分享,免費(fèi)在線閱讀,更多相關(guān)內(nèi)容在行業(yè)資料-天天文庫(kù)。
1、VC編程實(shí)現(xiàn)灰度圖像與彩色圖像的相互轉(zhuǎn)換 PhotoShop的圖像處理功能很強(qiáng),其中有一個(gè)功能是將灰度圖像轉(zhuǎn)換為彩色圖像,數(shù)字圖像處理中,也經(jīng)常要遇到灰度圖像與彩色圖像相互轉(zhuǎn)換的問(wèn)題,如何自己解決這個(gè)問(wèn)題,值得大家探討,現(xiàn)將我解決這類問(wèn)題的方法陳述如下: 工程應(yīng)用中經(jīng)常要遇到需要把彩色圖像到灰度圖像的變換的問(wèn)題,采集卡過(guò)來(lái)的圖像為彩色圖像,為加快處理速度,要把彩色圖像轉(zhuǎn)換為黑白圖象,這個(gè)問(wèn)題比較好解決,一般情況下彩色圖像每個(gè)像素用三個(gè)字節(jié)表示,每個(gè)字節(jié)對(duì)應(yīng)著R、G、B分量的亮度(紅、綠、藍(lán)),轉(zhuǎn)換后的黑白圖像的一個(gè)像素用一個(gè)字節(jié)表示該
2、點(diǎn)的灰度值,它的值在0~255之間,數(shù)值越大,該點(diǎn)越白,既越亮,越小則越黑。轉(zhuǎn)換公式為Gray(i,j)=0.11*R(i,j)+0.59*G(i,j)+0.3*B(i,j),其中Gray(i,j)為轉(zhuǎn)換后的黑白圖像在(i,j)點(diǎn)處的灰度值,我們可以觀察該式,其中綠色所占的比重最大,所以轉(zhuǎn)換時(shí)可以直接使用G值作為轉(zhuǎn)換后的灰度。 至于灰度圖像轉(zhuǎn)換為彩色圖像,技術(shù)上稱為灰度圖像的偽彩色處理,這是一種視覺(jué)效果明顯而技術(shù)又不是很復(fù)雜的圖像增強(qiáng)技術(shù)。灰度圖像中,如果相鄰像素點(diǎn)的灰度相差不大,但包含了豐富的信息的話,人眼則無(wú)法從圖像中提取相應(yīng)的信
3、息,因?yàn)槿搜鄯直婊叶鹊哪芰懿?,一般只有幾十個(gè)數(shù)量級(jí),但是人眼對(duì)彩色信號(hào)的分辨率卻很強(qiáng),這樣將黑白圖像轉(zhuǎn)換為彩色圖像人眼可以提取更多的信息量。在轉(zhuǎn)換過(guò)程中,經(jīng)常采用的技術(shù)是灰度級(jí)-彩色變換,意思就是對(duì)黑白圖像上的每一個(gè)像素點(diǎn),取得該點(diǎn)的灰度值并送入三個(gè)通道經(jīng)過(guò)實(shí)施不同的變換,產(chǎn)生相應(yīng)的R、G、B的亮度值,即所求彩色圖像對(duì)應(yīng)像素點(diǎn)的彩色值,具體變換公式很多,我采用的是最常用的一種,變換曲線圖如下: 上圖中,三個(gè)圖分別代表了三個(gè)變換通道,R、G、B指的是變換后對(duì)應(yīng)點(diǎn)的R、G、B分量值,L指的是各個(gè)分量的最大值為255,G(x,y)為相應(yīng)點(diǎn)
4、的灰度值。理論上就這些,下面是我用VC實(shí)現(xiàn)的源代碼,圖一為我的灰度位圖,圖二為偽彩色處理后的結(jié)果圖。我這個(gè)實(shí)現(xiàn)函數(shù)中是如何得到灰度位圖的數(shù)據(jù)的就不多講了,有興趣的朋友可參考我在天極網(wǎng)上九月十號(hào)發(fā)表的《VC灰度位圖處理》一文,那里應(yīng)該講的很清楚了。需要讀者注意的是彩色圖像中每個(gè)象素中的三個(gè)字節(jié)分別代表的分量,第一個(gè)字節(jié)為B,第二個(gè)為G值、最后一個(gè)為R值,這個(gè)順序不要搞錯(cuò)了。代碼實(shí)現(xiàn)如下:voidCDibView::OnMenuchange()file://圖像轉(zhuǎn)換實(shí)現(xiàn)函數(shù){ //TODO:Addyourcommandhandlercode
5、here HANDLEdata1handle; LPBITMAPINFOHEADERlpBi; BITMAPINFO*m_pBMI; CDibDoc*pDoc=GetDocument(); HDIBhdib; unsignedchar*hData; unsignedchar*data; hdib=pDoc->GetHDIB();//得到位圖數(shù)據(jù)的句柄,其中包含圖像信息頭 BeginWaitCursor(); lpBi=(LPBITMAPINFOHEADER)GlobalLock((HGLOBAL)hdib); hData=(unsign
6、edchar*)FindDIBBits((LPSTR)lpBi); m_pBMI=newBITMAPINFO;//生成彩色圖像的信息頭 m_pBMI->bmiHeader.biBitCount=24; m_pBMI->bmiHeader.biClrImportant=0; m_pBMI->bmiHeader.biClrUsed=0; m_pBMI->bmiHeader.biCompression=BI_RGB; m_pBMI->bmiHeader.biHeight=lpBi->biHeight; m_pBMI->bmiHeader.bi
7、Width=lpBi->biWidth; m_pBMI->bmiHeader.biPlanes=1; m_pBMI->bmiHeader.biSize=sizeof(BITMAPINFOHEADER); m_pBMI->bmiHeader.biXPelsPerMeter=0; m_pBMI->bmiHeader.biYPelsPerMeter=0; m_pBMI->bmiHeader.biSizeImage=WIDTHBYTES(lpBi->biWidth*8)*lpBi->biHeight*3; file://data=hData;
8、intR,G,B,i,j; data1handle=GlobalAlloc(GMEM_SHARE,WIDTHBYTES(lpBi->biWidth*8)*lpBi->biHeight*3); file://