宋 亮,陳瑜軒
(1.海軍裝備部 陜西 西安 710043;2.中國航空計算技術(shù)研究所 陜西 西安 710068)
平時常常會看到類似PhotoShop或Corel PhotoPaint等軟件繪制出的精美圖片,同時可以對原有的圖像進行處理,得到自己想要的結(jié)果,就像PhotoShop那樣。而這個處理過程,就是數(shù)字圖像處理(Digital Image Processing),又稱為計算機圖像處理,它是指將圖像信號轉(zhuǎn)換成數(shù)字信號并利用計算機對其進行處理的過程。數(shù)字圖像處理(Digital Image Processing)技術(shù)是一門非常實用的技術(shù)。PhotoShop的核心就是圖像處理技術(shù)。如果掌握了數(shù)字圖像處理的基本算法就可以通過編程來實現(xiàn)了。經(jīng)歷了這么多年的發(fā)展,圖像處理經(jīng)歷了從靜止圖像到活動圖像;從單色圖像到彩色圖像;從客觀圖像到主觀圖像;從二維圖像到三維圖像的發(fā)展歷程。特別是與計算機圖形學(xué)的結(jié)合已能產(chǎn)生高度逼真、非常純凈、更有創(chuàng)造性的圖像。由此派生出來的虛擬現(xiàn)實技術(shù)的發(fā)展或許將從根本上改變?nèi)藗兊膶W(xué)習、生產(chǎn)和生活方式[1]。
數(shù)字圖像處理是一門關(guān)于如何使用計算機對圖像進行處理的學(xué)科,而數(shù)字圖像是由被稱作像素的小塊區(qū)域組成的二維矩陣。對于單色即灰度圖像而言,每個像素的亮度用一個數(shù)值來表示,通常數(shù)值范圍在0~255之間,即可用一個字節(jié)來表示,0表示黑、255表示白,而其他表示灰度。
彩色圖像可以用紅、綠、藍三元組組成的二維矩陣表示。通常,三元組的每個數(shù)值也在0~255之間,0表示相應(yīng)的基色在該像素中沒有,而255則代表相應(yīng)的基色在該像素中取得最大值,這種情況下每個像素可用3個字節(jié)來表示[2]。
所謂圖像處理,就是對圖像信息進行加工以滿足人的視覺心理或者應(yīng)用需求的行為。圖像處理的手段有光學(xué)方法、電子學(xué)(數(shù)字)方法。后者正是要討論的數(shù)字圖像處理,它是指使用計算機加工處理圖像,通過各種處理算法來實現(xiàn)對圖像內(nèi)容處理。本論文只處理BMP格式的圖片進行討論。
BMP(bitmap)文件由文件頭、位圖信息頭、顏色信息和圖形數(shù)據(jù)4部分組成。文件頭主要包含文件的大小、文件類型、圖像數(shù)據(jù)偏離文件頭的長度等信息;位圖信息頭包含圖像的尺寸信息、圖像用幾個比特數(shù)值來表示一個像素、圖像是否壓縮、圖像所用的顏色數(shù)等信息。顏色信息包含圖像所用到的顏色表,顯示圖像時需用到幾個顏色表來生成調(diào)色板,但如果圖像為真彩色,即圖像的每個像素用24個比特來表示,文件中就沒有這一塊信息,也就不需要操作調(diào)色板。文件中的數(shù)據(jù)塊表示圖像的相應(yīng)像素值,需要注意的是:圖像的像素值在文件中的存放順序為從左到右,從下到上,也就是說,在BMP文件中首先存放的是圖像的最后一行像素,最后才存儲圖像的第一行像素,但對于同一行的像素,則是按照先左邊后右邊的順序存儲的;另外一個需要關(guān)注的細節(jié)是:文件存儲圖像的每一行像素值時,如果存儲該行像素值所占的字節(jié)數(shù)為4的倍數(shù),則正常存儲;否則,需要在后端補0,湊足4的倍數(shù)[3]。位圖文件的結(jié)構(gòu)如表1所示。
表1 位圖文件結(jié)構(gòu)Tab.1 Bitmap file structure
2.1.1 位圖頭文件
第一部分為位圖文件頭BITMAPFILEHEADER,是一個結(jié)構(gòu),其定義如下:
typedef struct tagBITMAPFILEHEADER{
WORD bfType; //位圖文件的類型,必須為BM
DWORD bfSize; //位圖文件的大小,字節(jié)單位
WORD bfReserved1; //位圖文件保留字,必須為0
WORD bfReserved2; //位圖文件保留字,必須為0
DWORD bfOffBits; //位圖文件頭到數(shù)據(jù)的偏移
}BITMAPFILEHEADER[4];
2.1.2 位圖信息頭
第二部分為位圖信息頭BITMAPINFOHEADER,也是一個結(jié)構(gòu),其定義如下:
typedef struct tagBITMAPINFOHEADER{
DWORD biSize; //該結(jié)構(gòu)所占字節(jié)數(shù)
LONG biWidth; //位圖的寬度,像素單位
LONG biHeight; //位圖的高度,像素單位
WORD biPlanes; //目標設(shè)備的位面數(shù),必須為1
WORD biBitCount; //顏色深度,即每個像素所占的位數(shù)
DWORD biCompression; //位圖的壓縮類型
DWORD biSizeImage; //位圖的大小,字節(jié)單位
LONG biXPelsPerMeter; //位圖水平分辨率
LONG biYPelsPerMeter; //位圖的垂直分辨率
DWORD biClrUsed; //位圖實際使用的顏色表中顏色數(shù)
DWORD biClrImportant; //位圖顯示中比較重要的顏色數(shù)
} BITMAPINFOHEADER;
2.1.3 顏色表
第三部分為顏色表RGBQUAD。當然這是對那些需要調(diào)色板的位圖文件而言的。有些位圖,如真彩色圖,是不需要調(diào)色板的,BITMAPINFOHEADER后直接是位圖數(shù)據(jù)。
顏色表實際上是一個數(shù)組,共有biClrUsed個元素(如果該值為零,則有2biBitCount個元素)。數(shù)組中每個元素的類型是一個RGBQUAD結(jié)構(gòu),占4個字節(jié),其定義如下:
typedef struct tagRGBQUAD{
BYTE rgbBlue; //該顏色的藍色分量
BYTE rgbGreen; //該顏色的綠色分量
BYTE rgbRed; //該顏色的紅色分量
BYTE rgbReserved; //保留值
} RGBQUAD;
位圖信息頭和顏色表組成位圖信息結(jié)構(gòu)BITMAPINFO,其定義如下:
typedef struct tagBITMAPINFO{
BITMAPINFOHEADER bmiHeader; //位圖信息頭
RGBQUAD bmiColors[1]; //顏色表
} BITMAPINFO[5];
2.1.4 實際的位圖數(shù)據(jù)
第四部分就是實際的圖像數(shù)據(jù)IMAGEDATA。對于用到顏色表的位圖,圖像數(shù)據(jù)就是該像素在顏色表中的索引值。對于真彩色圖,圖像數(shù)據(jù)就是實際的R、G、B值[6]。
1)對于2色位圖,用1位就可以表示該像素的顏色(一般0表示黑,1表示白),所以一個字節(jié)可以表示8個像素。
2)對于16色位圖,用4位表示一個像素的顏色,所以一個字節(jié)可以表示2個像素。
3)對于256色位圖,1個字節(jié)剛好可以表示1個像素。
4)對于真彩色圖,3個字節(jié)才能表示1個像素。
在這里要注意兩點:
1)每一行的字節(jié)數(shù)必須是4的整倍數(shù),如果不是,則需要補齊。
2)一般來說,.BMP文件的數(shù)據(jù)從下到上,從左到右的。也就是說,從文件中最先讀到的是圖像最下面一行的左邊第一個像素,然后是左邊第二個像素…接下來是倒數(shù)第二行左邊第一個像素,左邊第二個像素…依次類推,最后得到的是最上面一行的最右一個像素。
現(xiàn)實世界的顏色很多,但計算機只能表示其中的部分顏色。為了計算機能最好的重現(xiàn)實際圖景,就要采用一定的技術(shù)來管理顏色,從Windows3.0起,微軟就開始提供了調(diào)色板技術(shù)來作為顏色處理的一種通用方法。
假如有一個長寬各為200像素,顏色素為16色的彩色圖,每一個像素都用R、G、B 3個分量表示。因為每個分量有256個級別,要用8位(bit),即一個字節(jié)(byte)來表示,所以每個像素需要用3個字節(jié)。整個圖像要用200×200×3字節(jié),約120K字節(jié),這樣占用的空間就太大了。
其實,16色圖最多只有16種顏色。如果用一個表:表中的每一行記錄一種顏色的R、G、B值。這樣當表示一個像素的顏色時,只需要指出該顏色是在第幾行,即該顏色在表中的索引值。舉個例子,如果表的第0行為255,0,0(紅色),那么當某個像素為紅色時,只需要標明0即可。
再來計算一下:16種狀態(tài)可以用4位(bit)表示,所以一個像素要用半個字節(jié)。整個圖像用200×200×0.5字節(jié),約20K字節(jié),在加上表占用的字節(jié)為3×16字節(jié)。整個占用的字節(jié)數(shù)約為前面的1/6,省了很多空間。這張R、G、B的表,就是調(diào)色板,另一種叫法是顏色查找表LUT(Look Up Table)[7]。
本論文主要是基于設(shè)備無關(guān)的位圖DIB(Device-Independent Bitmap)。主要是因為DIB內(nèi)的位圖幾乎都沒有被壓縮,在程序中處理起來比較方便。如果在內(nèi)存中有DIB,就可以提供指向該DIB的指針作為某些函數(shù)的參數(shù),來顯示DIB。同時,由前面的介紹可以知道,BMP文件包含了一個DIB,至于BMP文件的格式前面2.1已有講述。
這里還要引入一個概念——Windows 圖形設(shè)備接口GDI(Graphics Device Interface)是為與設(shè)備無關(guān)的圖形設(shè)計的。因為計算機常與一系列不同的設(shè)備結(jié)合在一起,如打印機、繪圖儀等輸出設(shè)備以及顯示設(shè)備等,因而設(shè)備無關(guān)性的圖形能使用戶編程時無需考慮特殊的硬件設(shè)置,對Windows編程來說非常重要[8]。
Windows應(yīng)用程序使用圖形設(shè)備接口和Windows設(shè)備驅(qū)動程序來支持與設(shè)備無關(guān)的圖形。圖形設(shè)備接口GDI是Windows系統(tǒng)的重要組成部分,負責系統(tǒng)與用戶或繪圖程序之間的信息交換,并控制在輸出設(shè)備上顯示圖形或文字[8]。圖1描述了Windows輸出處理流程與GDI的關(guān)系。
圖1 Windows輸出處理流程與GDIFig.1 Windows output process with GDI
計算機輸出設(shè)備和顯示設(shè)備種類繁多,包括不同技術(shù)標準的顯示器、打印機、繪圖儀等等,每類設(shè)備又包含許多不同的型號。為了適應(yīng)不同的設(shè)備,Windows系統(tǒng)提供應(yīng)用程序與具體設(shè)備分離的功能。操作系統(tǒng)管理并協(xié)調(diào)一系列輸出設(shè)備驅(qū)動程序,將應(yīng)用程序的圖形輸出請求轉(zhuǎn)換為打印機、繪圖儀、顯示器或其它輸出設(shè)備上的輸出。GDI的設(shè)備無關(guān)性是Windows操作系統(tǒng)的特色之一。對于開發(fā)人員而言,所要做的工作僅僅是在系統(tǒng)的幫助下建立一個與某個實際輸出設(shè)備的關(guān)聯(lián),以要求系統(tǒng)加載相應(yīng)的設(shè)備驅(qū)動程序,其他的具體輸出操作則由系統(tǒng)實現(xiàn)。由此可見,Windows系統(tǒng)分擔了應(yīng)用程序的硬件設(shè)備適配器功能。
在對DIB位圖進行操作時,有以下的一些任務(wù)是需要完成的:裝載位圖、獲取位圖文件頭信息、獲取位圖信息、獲取顏色表信息、獲取位圖數(shù)據(jù)信息、獲取位圖尺寸、獲取顏色總數(shù)、獲取顏色位數(shù)、創(chuàng)建位圖調(diào)色板,繪制位圖等[9]。
數(shù)字圖像處理最早出現(xiàn)于20世紀50年代,早期的圖像處理的目的是改善圖像的質(zhì)量,它以人為對象,以改善人的視覺效果為目的。首次獲得實際成功應(yīng)用的是美國噴氣推進實驗室(JPL[10])。他們對航天探測器徘徊者7號在1964年發(fā)回的幾千張月球照片使用了圖像處理技術(shù),如幾何校正、灰度變換、去除噪聲等方法進行處理,并考慮了太陽位置和月球環(huán)境的影響,由計算機成功地繪制出月球表面地圖,獲得了巨大的成功。數(shù)字圖像處理取得的另一個巨大成就是在醫(yī)學(xué)上獲得的成果。1972年英國EMI公司工程師Housfield發(fā)明了用于頭顱診斷的X射線計算機斷層攝影裝置,也就是我們通常所說的CT(Computer Tomograph[11])。CT的基本方法是根據(jù)人的頭部截面的投影,經(jīng)計算機處理來重建截面圖像,稱為圖像重建。圖像處理技術(shù)的深入發(fā)展,從70年代中期開始,隨著計算機技術(shù)和人工智能、思維科學(xué)研究的迅速發(fā)展,數(shù)字圖像處理向更高、更深層次發(fā)展。人們已開始研究如何用計算機系統(tǒng)解釋圖像,實現(xiàn)類似人類視覺系統(tǒng)理解外部世界,這被稱為圖像理解或計算機視覺。其中代表性的成果是70年代末MIT的Marr提出的視覺計算理論,這個理論成為計算機視覺領(lǐng)域其后十多年的主導(dǎo)思想。圖像理解雖然在理論方法研究上已取得不小的進展,但它本身是一個比較難的研究領(lǐng)域,存在不少困難,有待人們進一步探索。
數(shù)字圖像處理研究的內(nèi)容主要有以下幾個方面:1)圖像變換 由于圖像陣列很大,往往采用圖像變換方法,將空間域處理轉(zhuǎn)換為變換域處理。2)圖像編碼壓縮 可減少描述圖像的數(shù)據(jù)量,以便節(jié)省圖像傳輸、處理時間和減少所占用的存儲器容量。3) 圖像增強 為了提高圖像的質(zhì)量,如去除噪聲[12]。圖像增強不考慮圖像降質(zhì)的原因,突出圖像中所感興趣的部分。本文對圖像處理的基本概念進行了介紹,并著重闡述了BMP圖像文件格式的基本概念。數(shù)字圖像處理作為許多學(xué)科的重要基礎(chǔ),已經(jīng)廣泛應(yīng)用于軍事、氣象、交通等領(lǐng)域,從多方面影響人們的生活。
[1] 呂鳳軍 .數(shù)字圖像處理編程入門[M].北京:清華大學(xué)出版社,2006.
[2] 韓玉坤.數(shù)字圖像壓縮編碼技術(shù)綜述[N]. 濰坊學(xué)院學(xué)報,2006年7月.
[3] 周長發(fā).精通Visual C++ 圖像處理編程)[M]. 2版.電子工業(yè)出版社, 2004.
[4] 高守傳,姚領(lǐng)田. Visual C++實踐與提高—數(shù)字圖像處理與工程應(yīng)用篇[M]. 中國鐵道出版社.2006.
[5] MacGregor,J.F Bharati, M.H. Multivariate image analysis for process monitoring and control [J].Proceedings of SPIE - The International Society for Optical Engineering, 2009,26(5):461-462.
[6] 夏明生,張炎生.數(shù)字圖像增強技術(shù)及其在VC++6.0下的實現(xiàn)[N]. 成都信息工程學(xué)院學(xué)報,2002.
[7] 孔濤.圖像濾波算法的若干研究[D].杭州:浙江大學(xué),2005.
[8] 耿生玲,田芳.圖像的平滑和銳化的原理及實現(xiàn)[N].青海師范大學(xué)學(xué)報:自然科學(xué)版,2003.
[9] Liu,N.Yan,H.Colour image edge enhancement by two-channel process Electronics Letters[J].1994,12(9):25-28.
[10] 謝燕江.中值濾波在圖像去噪中的應(yīng)用[N].湘南學(xué)院學(xué)報,2004.
[11] Luengas-Ruiz,Fernando;Aguilera-Longoria[J].Daniel Digital image p rocessing in Contirod p rocess Proceed ings of the Annual Convention of the W ire Association International,1994,36(8):46-50.
[12] 徐志平,鐘亦平,張世永.基于交叉視覺皮質(zhì)模型二值圖像形態(tài)學(xué)算法[J].計算機輔助設(shè)計與圖形學(xué)學(xué)報,2007,19(8):991-994.XU Zhi-ping,ZHAONG Yi-ping,ZHANG Shi-yong.The intersecting cortical model two value image morphology algorithm [J].journal,Computer Aided Design and Computer Graphics,2007,19(8):991-994.