資源描述:
《VC數(shù)字圖像處理編程講座之三.doc》由會員上傳分享,免費在線閱讀,更多相關內容在教育資源-天天文庫。
1、VC數(shù)字圖像處理編程講座之三BMP圖像的基本操作 上一講我們主要介紹了圖像的格式,其中重點說明了BMP文件的存儲格式,同時對JEPG和GIF等常用格式作了簡單的介紹。本節(jié)主要講述如何操作BMP文件,如對其讀、寫和顯示等?! ≡趯崿F(xiàn)數(shù)字圖象處理的過程中,主要是通過對圖像中的每一個像素點運用各種圖像處理算法來達到預期的效果,所以進行圖像處理的第一步,也是我們最關心的問題,是如何得到圖像中每一個像素點的亮度值;為了觀察和驗證處理的圖像效果,另一個需要解決的問題是如何將處理前后的圖像正確的顯示出來。我們這
2、章內容就是解決這些問題隨著科技的發(fā)展,圖像處理技術已經(jīng)滲透到人類生活的各個領域并得到越來越多的應用,但是突出的一個矛盾是圖像的格式也是越來越多,目前圖像處理所涉及的主要的圖像格式就有很多種,如TIF、JEMP、BMP等等,一般情況下,為了處理簡單方便,進行數(shù)字圖像處理所采用的都是BMP格式的圖像文件(有時也稱為DIB格式的圖像文件),并且這種格式的文件是沒有壓縮的。我們通過操作這種格式的文件,可以獲取正確顯示圖像所需的調色板信息,圖像的尺寸信息,圖像中各個像素點的亮度信息等等,有了這些數(shù)據(jù),開發(fā)人員
3、就可以對圖像施加各種處理算法,進行相應的處理。如果特殊情況下需要處理其它某種格式的圖像,如GIF、JEMP等格式的圖象文件,可以首先將該格式轉換為BMP格式,然后再進行相應的處理。這一點需要讀者清楚。 BMP格式的圖像文件又可以分為許多種類,如真彩色位圖、256色位圖,采用RLE(游程編碼)壓縮格式的BMP位圖等等。由于在實際的工程應用和圖像算法效果驗證中經(jīng)常要處理的是256級并且是沒有壓縮的BMP灰度圖像,例如通過黑白采集卡采集得到的圖像就是這種格式,所以我們在整個講座中范例所處理的文件格式都是
4、BMP灰度圖像。如果讀者對這種格式的位圖能夠作到熟練的操作,那么對于其余形式的BMP位圖的操作也不會很困難?! MP灰度圖像作為Windows環(huán)境下主要的圖像格式之一,以其格式簡單,適應性強而倍受歡迎。正如我們在上一講中介紹過的那樣,這種文件格式就是每一個像素用8bit表示,顯示出來的圖像是黑白效果,最黑的像素的灰度(也叫作亮度)值為“0”,最白的像素的灰度值為“255”,整個圖像各個像素的灰度值隨機的分布在“0”到“255”的區(qū)間中,越黑的像素,其灰度值越接近于“0”,越白(既越亮)的像素,其灰
5、度值越接近于“255”;與此對應的是在該文件類型中的顏色表項的各個RGB分量值是相等的,并且顏色表項的數(shù)目是256個。 在進行圖像處理時,操作圖像中的像素值就要得到圖像陣列;經(jīng)過處理后的圖像的像素值需要存儲起來;顯示圖像時要正確實現(xiàn)調色板、得到位圖的尺寸信息等。結合這些問題,下面我們針對性的給出了操作灰度BMP圖像時的部分函數(shù)實現(xiàn)代碼及注釋。一、BMP位圖操作 首先我們回顧一下上講中的重要信息:BMP位圖包括位圖文件頭結構BITMAPFILEHEADER、位圖信息頭結構BITMAPINFOHEA
6、DER、位圖顏色表RGBQUAD和位圖像素數(shù)據(jù)四部分。處理位圖時要根據(jù)文件的這些結構得到位圖文件大小、位圖的寬、高、實現(xiàn)調色板、得到位圖像素值等等。這里要注意的一點是在BMP位圖中,位圖的每行像素值要填充到一個四字節(jié)邊界,即位圖每行所占的存儲長度為四字節(jié)的倍數(shù),不足時將多余位用0填充。 有了上述知識,可以開始編寫圖像處理的程序了,關于在VC的開發(fā)平臺上如何開發(fā)程序的問題這里不再贅述,筆者假定讀者都具有一定的VC開發(fā)經(jīng)驗。在開發(fā)該圖像處理程序的過程中,筆者沒有采用面向對象的方法,雖然面向對象的方法可
7、以將數(shù)據(jù)封裝起來,保護類中的數(shù)據(jù)不受外界的干擾,提高數(shù)據(jù)的安全性,但是這種安全性是以降低程序的執(zhí)行效率為代價的,為此,我們充分利用了程序的文檔視圖結構,在程序中直接使用了一些API函數(shù)來操作圖像。在微軟的MSDN中有一個名為Diblook的例子,該例子演示了如何操作Dib位圖,有興趣的讀者可以參考一下,相信一定會有所收獲。 啟動VisualC++,生成一個名為Dib的多文檔程序,將CDibView類的基類設為CscrollView類,這樣作的目的是為了在顯示位圖時支持滾動條,另外在處理圖像應用程序
8、的文檔類(CDibDoc.h)中聲明如下宏及公有變量:#defineWIDTHBYTES(bits)(((bits)+31)/32*4)//計算圖像每行象素所占的字節(jié)數(shù)目;HANDLEm_hDIB;//存放位圖數(shù)據(jù)的句柄;CPalette*m_palDIB;//指向調色板Cpalette類的指針;CSizem_sizeDoc;//初始化視圖的尺寸,該尺寸為位圖的尺寸; 最后將程序的字符串表中的字符串資源IDR_DibTYPE修改為:“DibDibDibF