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