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