BMP圖像的基本操作
上一講我們主要介紹了圖像的格式,其中重點說明了BMP文件的存儲格式,同時對JEPG和GIF等常用格式作了簡單的介紹。本節主要講述如何操作BMP文件,如對其讀、寫和顯示等。
在實現數字圖象處理的過程中,主要是通過對圖像中的每一個像素點運用各種圖像處理算法來達到預期的效果,所以進行圖像處理的第一步,也是我們最關心的問題,是如何得到圖像中每一個像素點的亮度值;為了觀察和驗證處理的圖像效果,另一個需要解決的問題是如何將處理前後的圖像正確的顯示出來。我們這章內容就是解決這些問題。
隨著科技的發展,圖像處理技術已經滲透到人類生活的各個領域並得到越來越多的應用,但是突出的一個矛盾是圖像的格式也是越來越多,目前圖像處理所涉及的主要的圖像格式就有很多種,如TIF、JEMP、BMP等等,一般情況下,為了處理簡單方便,進行數字圖像處理所采用的都是BMP格式的圖像文件(有時也稱為DIB格式的圖像文件),並且這種格式的文件是沒有壓縮的。我們通過操作這種格式的文件,可以獲取正確顯示圖像所需的調色板信息,圖像的尺寸信息,圖像中各個像素點的亮度信息等等,有了這些數據,開發人員就可以對圖像施加各種處理算法,進行相應的處理。如果特殊情況下需要處理其它某種格式的圖像,如GIF、JEMP等格式的圖象文件,可以首先將該格式轉換為BMP格式,然後再進行相應的處理。這一點需要讀者清楚。
BMP格式的圖像文件又可以分為許多種類,如真彩色位圖、256色位圖,采用RLE(游程編碼)壓縮格式的BMP位圖等等。由於在實際的工程應用和圖像算法效果驗證中經常要處理的是256級並且是沒有壓縮的BMP灰度圖像,例如通過黑白采集卡采集得到的圖像就是這種格式,所以我們在整個講座中范例所處理的文件格式都是BMP灰度圖像。如果讀者對這種格式的位圖能夠作到熟練的操作,那麼對於其余形式的BMP位圖的操作也不會很困難。
BMP灰度圖像作為Windows環境下主要的圖像格式之一,以其格式簡單,適應性強而倍受歡迎。正如我們在上一講中介紹過的那樣,這種文件格式就是每一個像素用8bit表示,顯示出來的圖像是黑白效果,最黑的像素的灰度(也叫作亮度)值為0,最白的像素的灰度值為255,整個圖像各個像素的灰度值隨機的分布在0到255的區間中,越黑的像素,其灰度值越接近於0,越白(既越亮)的像素,其灰度值越接近於255;與此對應的是在該文件類型中的顏色表項的各個RGB分量值是相等的,並且顏色表項的數目是256個。
在進行圖像處理時,操作圖像中的像素值就要得到圖像陣列;經過處理後的圖像的像素值需要存儲起來;顯示圖像時要正確實現調色板、得到位圖的尺寸信息等。結合這些問題,下面我們針對性的給出了操作灰度BMP圖像時的部分函數實現代碼及注釋。
一、 BMP位圖操作
首先我們回顧一下上講中的重要信息:BMP位圖包括位圖文件頭結構BITMAPFILEHEADER、位圖信息頭結構 BITMAPINFOHEADER、位圖顏色表RGBQUAD和位圖像素數據四部分。處理位圖時要根據文件的這些結構得到位圖文件大小、位圖的寬、高、實現調色板、得到位圖像素值等等。這裡要注意的一點是在BMP位圖中,位圖的每行像素值要填充到一個四字節邊界,即位圖每行所占的存儲長度為四字節的倍數,不足時將多余位用0填充。
有了上述知識,可以開始編寫圖像處理的程序了,關於在VC的開發平台上如何開發程序的問題這裡不再贅述。在開發該圖像處理程序的過程中,筆者沒有采用面向對象的方法,雖然面向對象的方法可以將數據封裝起來,保護類中的數據不受外界的干擾,提高數據的安全性,但是這種安全性是以降低程序的執行效率為代價的,為此,我們充分利用了程序的文檔視圖結構,在程序中直接使用了一些API函數來操作圖像。在微軟的MSDN中有一個名為Diblook的例子,該例子演示了如何操作Dib位圖,有興趣的讀者可以參考一下,相信一定會有所收獲。
啟動Visual C++,生成一個名為Dib的多文檔程序,將CDibView類的基類設為CscrollVIEw類,這樣作的目的是為了在顯示位圖時支持滾動條,另外在處理圖像應用程序的文檔類(CDibDoc.h)中聲明如下宏及公有變量:
#define WIDTHBYTES(bits) (((bits) + 31) / 32 * 4)//計算圖像每行象素所占的字節數目;
HANDLE m_hDIB;//存放位圖數據的句柄;
CPalette* m_palDIB;//指向調色板Cpalette類的指針;
CSize m_sizeDoc;//初始化視圖的尺寸,該尺寸為位圖的尺寸;
最後將程序的字符串表中的字符串資源IDR_DibTYPE修改為: Dib Dib Dib Files(*.bmp;*.dib) .bmp Dib.Document Dib Document。這樣作的目的是為了在程序文件對話框中可以選擇BMP或DIB格式的位圖文件。
1、 讀取灰度BMP位圖
可以根據BMP位圖文件的結構,操作BMP位圖文件並讀入圖像數據,為此我們充分利用了VC的文檔視圖結構,重載了文擋類的 OnOpenDocument()函數,這樣用戶就可以在自動生成程序的打開文件對話框中選擇所要打開的位圖文件,然後程序將自動調用該函數執行讀取數據的操作。該函數的實現代碼如下所示:
BOOL CDibDoc::OnOpenDocument(LPCTSTR lpszPathName)
{
LOGPALETTE *pPal;//定義邏輯調色板指針
[1] [2] [3] [4] [5] [6] 下一頁