資源描述:
《VC數(shù)字圖像處理編程講座之五》由會(huì)員上傳分享,免費(fèi)在線閱讀,更多相關(guān)內(nèi)容在教育資源-天天文庫(kù)。
1、VC數(shù)字圖像處理編程講座之五第四節(jié)BMP圖像操作的補(bǔ)充篇 上一講中我們介紹了圖像特效顯示操作的實(shí)現(xiàn)方法,如隨機(jī)顯示效果、馬賽克效果、拉幕顯示效果等,由于篇幅的限制,還有許多效果沒(méi)有介紹;本期講座將接著上一講的內(nèi)容,繼續(xù)介紹一些圖像特效顯示效果。另外,我們前面的學(xué)習(xí)都是針對(duì)現(xiàn)成的BMP圖像,在實(shí)際工作學(xué)習(xí)中,絕大部分處理圖像過(guò)程都是在一個(gè)系統(tǒng)環(huán)境中,也就是說(shuō)需要和圖像數(shù)據(jù)的獲取設(shè)備直接打交道,一般情況下,計(jì)算機(jī)圖像處理系統(tǒng)從系統(tǒng)層次上可分為高、中、低檔三個(gè)層次,目前比較普及的是低檔次的系統(tǒng),該系統(tǒng)由CCD(攝像頭)、圖像采集卡、計(jì)算
2、機(jī)三個(gè)部分組成,其結(jié)構(gòu)簡(jiǎn)單,應(yīng)用方便,效果也比較不錯(cuò),得到的圖像較清晰,所以目前在工程應(yīng)用中采用的比較多。這就給開(kāi)發(fā)人員帶來(lái)一個(gè)現(xiàn)實(shí)的問(wèn)題,如何使用圖像采集卡呢?目前雖然各種編程資源中基于VC開(kāi)發(fā)經(jīng)驗(yàn)的文章不少,但是關(guān)于如何在VC開(kāi)發(fā)平臺(tái)上使用圖像采集卡的文章的確沒(méi)發(fā)現(xiàn),筆者借這期講座的寶貴機(jī)會(huì),補(bǔ)充介紹一下如何在程序中編寫自己的代碼來(lái)操作圖像采集卡,從而搭建一個(gè)完整的圖像處理系統(tǒng)。希望通過(guò)這部分內(nèi)容的學(xué)習(xí),在讀者的腦海里就可以建立一個(gè)完整的圖像操作系統(tǒng)概念;同時(shí)也能夠給目前正需要利用圖像采集卡開(kāi)發(fā)自己的圖像處理系統(tǒng)的朋友有所幫助。
3、 1.抖動(dòng)圖像 在上一節(jié)講座中,我們講到了如何實(shí)現(xiàn)圖象的"雕刻"和"浮雕"效果,它們的實(shí)現(xiàn)思想是通過(guò)求取"沒(méi)有處理過(guò)的相鄰兩個(gè)像素之間的差值"來(lái)實(shí)現(xiàn)的。如果沒(méi)有限制"以前沒(méi)有處理過(guò)的兩個(gè)像素之間的操作",取而代之的是"處理以前已經(jīng)操作過(guò)的像素",那末就可以將一個(gè)像素的灰度值傳遞到與其相鄰的若干像素。事實(shí)上,有時(shí)后我們必須通過(guò)上述的約定才能實(shí)現(xiàn)一些效果,如圖像的抖動(dòng)效果。例如,為了使圖象看起來(lái)好象從左上角向右下角掃過(guò),以產(chǎn)生運(yùn)動(dòng)的感覺(jué),必須要反復(fù)拷貝左上方的那些像素的灰度值,逐步把它們?nèi)诤显谝黄?,看起?lái)好象圖像后邊有一些顏色在逐漸
4、的消失,這就是我們要講的圖象的抖動(dòng)效果。下面給出了該效果的實(shí)現(xiàn)代碼:voidCDibView::OnDouDongImage()//產(chǎn)生"抖動(dòng)"效果圖函數(shù){ HANDLEdata1handle;//用來(lái)存放圖像數(shù)據(jù)的句柄; LPBITMAPINFOHEADERlpBi;//圖像的信息頭結(jié)構(gòu); CDibDoc*pDoc=GetDocument();//得到文擋指針; HDIBhdib;//用來(lái)存放圖像數(shù)據(jù)的句柄; unsignedchar*pData;//指向原始圖像數(shù)據(jù)的指針; unsignedchar*data;//指向處理后圖像
5、數(shù)據(jù)的指針; hdib=pDoc->m_hDIB;//拷貝存放已經(jīng)讀取的圖像文件數(shù)據(jù)句柄; lpBi=(LPBITMAPINFOHEADER)GlobalLock((HGLOBAL)hdib);//獲取圖像信息頭;pData=(unsignedchar*)FindDIBBits((LPSTR)lpBi);//FindDIBBits是我定義的一個(gè)函數(shù),根據(jù)圖像的結(jié)構(gòu)得到位圖的灰度值數(shù)據(jù);pDoc->SetModifiedFlag(TRUE);//設(shè)置文檔修改標(biāo)志為"真",為后續(xù)的修改存盤作準(zhǔn)備;data1handle=GlobalAl
6、loc(GMEM_SHARE,WIDTHBYTES(lpBi->biWidth*8)*lpBi->biHeight); //聲明一個(gè)緩沖區(qū)用來(lái)暫存處理后的圖像數(shù)據(jù);data=(unsignedchar*)GlobalLock((HGLOBAL)data1handle);//得到該緩沖區(qū)的指針;AfxGetApp()->BeginWaitCursor();inti,j,buf;for(i=lpBi->biHeight;i>=2;i--)//從圖像右下角開(kāi)始對(duì)圖像的各個(gè)像素進(jìn)行"抖動(dòng)"處理; for(j=lpBi->biWidth;j
7、>=2;j--) {//抖動(dòng)處理、從圖像的右下角開(kāi)始計(jì)算圖像斜上方相鄰像素的均值;buf=(*(pData+(lpBi->biHeight-i)*WIDTHBYTES(lpBi->biWidth*8)+j)+*(pData+(lpBi->biHeight-i+1)*WIDTHBYTES(lpBi->biWidth*8)+j-1))/2;if(buf>255)buf=255;//限制像素點(diǎn)的灰度范圍為0-255;if(buf<0)buf=0;*(data+(lpBi->biHeight-i)*WIDTHBYTES(lpBi->biW
8、idth*8)+j)=(BYTE)buf;}for(j=0;jbiWidt