【文章內(nèi)容簡(jiǎn)介】
黑色到最亮的白色的灰度,每種灰度(顏色深度)成為一個(gè)灰度級(jí),通常用 L 表示。在灰度圖像中,像素可以取 0~L— 1 之間的整數(shù)值,根 據(jù)保存灰度數(shù)值所使用的數(shù)據(jù)類型的不同,可能有 256種取值或者 k2種取值,當(dāng) k=1 時(shí)即退化為二值圖像。 ( 3) RGB 圖像 眾所周知,自然界中幾乎所有顏色都可以由紅( Red, R) 、綠( Green, G) 、藍(lán)( Blue, B) 3 種顏色組合而成,通常稱它們?yōu)?RGB 三原色。計(jì)算機(jī)顯示彩色圖像時(shí)采用最多的就是 RGB 模型。對(duì)于每個(gè)像素,通過(guò)控制 R、 G、 B 三原色的合成比例則可決定該像素的最終顯示顏色。 對(duì)于三原色 RGB 中的每一種顏色,可以像灰度圖那 樣使用 L 個(gè)等級(jí)來(lái)表示含有這種顏色成分的多少。例如對(duì)于含有 256 個(gè)等級(jí)的紅色, 0 表示不含紅色成分,255表示含有 100%的紅色成分。同樣綠色和藍(lán)色也可以劃分為 256 個(gè)等級(jí)。這樣每種原色可以用 8位二進(jìn)制數(shù)據(jù)表示,于是 3 原色總共需要 24 位二進(jìn)制數(shù),這樣能夠表示出的顏色種類數(shù)目為 256 256 256=242 ,大約有 1600 萬(wàn)種,已經(jīng)遠(yuǎn)遠(yuǎn)超過(guò)普通人所能分辨出的顏色數(shù)目。 未經(jīng)壓縮的原始 BMP 文件就是使用 RGB 標(biāo)準(zhǔn)給出的 3 個(gè)數(shù)值來(lái)存儲(chǔ)圖像數(shù) 據(jù)的,稱為 RGB 圖像。在 RGB 圖像中每個(gè)像素都是用 24 位二進(jìn)制數(shù)表示,故也稱為 24 位真色彩圖像。 ( 4)索引圖像 如果對(duì)每個(gè)像素都直接使用 24位二進(jìn)制數(shù)表示,圖像文件的體積將變得十分龐大。舉個(gè)例子,對(duì)一個(gè)長(zhǎng)、寬各為 200 像素,顏色數(shù)為 16 的彩色圖像,每個(gè)像素都用 RGB 3 個(gè)分量表示,這樣每個(gè)像素由 3 個(gè)字節(jié)表示,整個(gè)圖像就是200 200 3=120kB。這種完全未經(jīng)壓縮的表達(dá)方式,浪費(fèi)了大量的存儲(chǔ)空間,下面介紹一種更節(jié)省空間的存儲(chǔ)方式:索引圖像。 同樣還是 200 像素 200 像素的 16 色圖像,由于這張圖片中最 多只有 16 種顏色,那么可以使用一張顏色表 (16 3的二維數(shù)組 )保存這 16種顏色對(duì)應(yīng)的 RGB 值, 10 在表示圖像的矩陣中使用這 16種顏色在顏色表中的索引(偏移量 ) 作為數(shù)據(jù)寫入相應(yīng)的行列位置。 3 VC++的圖像處理簡(jiǎn)介 位圖文件及其 C++操 作 Windows 操作系統(tǒng)中使用最多的圖形文件格式就是位圖格式,最常見(jiàn)的位圖文件的擴(kuò)展名為 BMP。 BMP 是英文 Bitmap(位圖)的簡(jiǎn)寫,這種格式的特點(diǎn)是包含的圖像信息較豐富,幾乎不進(jìn)行壓縮,因此占用的磁盤空間較大。 設(shè)備無(wú)關(guān)位圖 以后的 BMP 位圖文件格式與顯示設(shè)備無(wú)關(guān),因此把這種 BMP 位圖文件稱為設(shè)備無(wú)關(guān)位圖( device independent bitmap, DIB)。 DIB 自帶顏色信息,因此調(diào)色板管理非常簡(jiǎn)單?,F(xiàn)在,任何 Windows 操作系統(tǒng)的計(jì)算機(jī)都能夠顯示和處理 DIB,它通常以 BMP 文件的形式被把保存在磁盤中。 BMP 圖像文件數(shù)據(jù)結(jié)構(gòu) 典型的 BMP 圖像文件由以下 4 部分組成,如圖 所示。 ( 1)位圖文件頭數(shù)據(jù)結(jié)構(gòu) BITMAPFILEHEADER,包含 BMP 圖像文件的類型、顯示內(nèi)容等信息。 ( 2)位圖信息頭數(shù)據(jù)結(jié)構(gòu) BITMAPINFOHEADER,包含有 BMP 圖像的寬、高、壓縮方法以及定義顏色等信息。 ( 3)調(diào)色板,即顏色索引表。 ( 4)實(shí)際的位圖數(shù)據(jù)。 1.位圖文件 BITMAPFILEHEADER 結(jié)構(gòu) 位圖文件頭 BITMAPFILEHEADER 的定義可以再 MFC Library 中找到,這部分文件頭包含了文件的類型、大小以及設(shè)備無(wú)關(guān)位圖的圖像文件布局。 11 單色 D IB 有 2 個(gè)表項(xiàng) 16 色 D IB 有 16 個(gè)表項(xiàng)或更少 256 色 D IB 有 256 個(gè)表項(xiàng)或更少 真彩色 D IB 沒(méi)有調(diào)色板 每個(gè)表項(xiàng)長(zhǎng)度為 4 字節(jié)( 32 位) 像素按照每行每列的順序排列 每一行的字節(jié)數(shù)必須是 4 的整數(shù)倍 b i S i z e b i W i d t h b i H e i g h t b i P l a n e s b i Bit Co u n t b i Co m p re s s i o n b i S i z e Im a g e b i X P e l s P e rM e t e r b i Y P e l s P e rM e t e r b i ClrU s e d b i ClrIm p o rta n t b f T y p e = ” BM ” b f S i z e b f Re s e rv e d 1 b f Re s e rv e d 2 b f O f f Bit s BI TM A PF I LE H EA D ER 位圖文件頭 (只用于 BM P 文件) BI TM A PI N FO H EA D ER 位圖信息頭 Pa l e tt e 調(diào)色板 D I B Pi x e l s D I B 圖像數(shù)據(jù) 圖 BMP文件的組成 the position of BMP file BITMAPFILEHEADER 結(jié)構(gòu)體長(zhǎng)度固定,為 14 字節(jié),其定義和描述如下: typedef struct tagBITMAPFILEHEADER{ WORD bfType。 DWORD bfSize。 WORD bfReserved1。 WORD bfReserved2。 DWORD bfOffBits。 }BITMAPFILEHEADER, *PBITMAPFILEHEADER; 各個(gè)域的說(shuō)明如下: 12 bfType:指定 文件類型,必須是 0x424D,即字符串“ BM”,也就是說(shuō)所有“ .bmp”文件的頭兩個(gè)字節(jié)都是“ BM”。 bfSize:指定文件大小,包括這 14 個(gè)字。 bfReserved1, bfReserved2:為保留字,不用考慮。 bfOffBits:為從文件頭到實(shí)際的位圖數(shù)據(jù)的偏移字節(jié)數(shù),即下圖中前三個(gè)部分的和。 2.位圖信息頭 BITMAPINFOHEADER 結(jié)構(gòu) BITMAPINFOHEADER 結(jié)構(gòu)體包含了設(shè)備無(wú)關(guān)位圖關(guān)于顏色維度和色彩格式的信息,其定義和描述如下: typedef struct tagBITMAPINFOHEADER{ DWORD biSize; LONG biWidth; LONG biHeight; WORD biPlanes; WORD biBitCount; DWORD biCompression; DWORD biSizeImage; LONG biXPelsPerMeter; LONG biYPelsPerMeter; DWORD biClrUsed; DWORD biClrImportant; }BITMAPINFOHEADER, *PBITMAPINFOHEADER 該結(jié)構(gòu)的長(zhǎng)度也是固定的,為 40 個(gè)字節(jié)。各個(gè)域的說(shuō)明如下: biSize:指定這個(gè)結(jié)構(gòu)的長(zhǎng)度,為 40字節(jié)。 biWidth:指定圖像的寬度,單位是像素。 biHeight:指定圖像的高度,單位是像素。 biPlanes:必須是 1,不用考慮。 biBitCount:指定表示顏色時(shí)要用到的位數(shù),常用的值為 1(黑白二色圖)、 4( 16 13 色圖)、 8( 256 色)、 24(真彩色),新的“ .bmp”格式支持 32 位色,這里就不做討論了。 biCompression:指定位圖是否壓縮,有效的值為 BIRGB, BIRLE8, BIRLE4,BIBITFIELDS(都是 Windows 定義好的常量)。要說(shuō)明的是, Windows 位圖可以采用 RLE4 和 RLE8 的壓縮格式,但用的不多。今后所討論的只有第一種不壓縮的情況,即 biCompression 為 BIRGB 的情況。 biSizeImage:指定實(shí)際的位圖數(shù)據(jù)占用的字節(jié)數(shù)。 biXPelsPerMeter:指定目標(biāo)設(shè)備的水平分辨率,單位是像素 /米。 biYPelsPerMeter:指定目標(biāo)設(shè)備的垂直分辨率,單位 是像素 /米。 biClrUsed:指定本圖像實(shí)際用到的顏色數(shù),如果該項(xiàng)為 0,則用到的顏色數(shù)為2的 biCompression 次冪。 biClrImportant:指定本圖像中重要的顏色數(shù),如果該值為 0,則認(rèn)為所有的顏色都是重要的。 3.調(diào)色板結(jié)構(gòu) 有些位圖需要調(diào)色板,有些位圖,如真彩色圖,不需要調(diào)色板,它們的BITMAPINFOHEADER 后面直接是位圖數(shù)據(jù)。 調(diào)色板實(shí)際上是一個(gè)數(shù)組,共有 biClrUsed 個(gè)元素(如果該值為 0,則有 2 的biBitCount 次冪個(gè)元素)。數(shù)組中每個(gè)元素的類型是一個(gè) RGBQUAD 結(jié)構(gòu),占 4 個(gè)字節(jié),其定義如下: typedef struct tagRGBQUAD BYTE rgbBlue。 BYTE rgbGreen。 BYTE rgbRed。 BYTE rgbReserved。 }RGBQUAD。 其中: rgbBlue:該顏色的藍(lán)色分量。 rgbGreen:該顏色的綠色分量。 14 rgbRed:該顏色的紅色分量。 rgbReserved:保留值。 4.實(shí)際位圖結(jié)構(gòu) 實(shí)際位圖數(shù)據(jù)是一片連續(xù)的存儲(chǔ)區(qū)域,其中保存著圖像中每個(gè)像素的灰度 (顏色 ) 信息。對(duì)于 256 色灰度圖像,圖像數(shù)據(jù)就是該像素的實(shí)際灰度, 1 個(gè)像素需要 1個(gè)字節(jié)來(lái)表示;對(duì)于索引圖像,圖像數(shù)據(jù)就是該像素顏色在調(diào)色板中的索引值;而對(duì)于真色彩圖,圖像數(shù)據(jù)就是實(shí)際的 RGB值, 1 個(gè)像素需要 3 個(gè)字節(jié)來(lái)表示。 CImg 類 CImg 類的主要成員如表 所示。 CImg 類擁有兩個(gè)公有成員: BITMAPINFOHEADER *m_pBMIH。 LPBYTE *m_lpData。 其中, m_pBMIH 中保存的是圖像的信息頭,而 m_lpData 中保存實(shí)際的圖像數(shù)據(jù)。 CImg 類的主要成員如 表 表 CImg類的主要成員 the main members of CImg class 函數(shù)原型 功能 CImg()。 構(gòu)造函數(shù) BOOL IsValidate()。 判斷位圖是否有效 Void InitPixel( BYTE color) 。 將所有像素的值初始化為灰度值 color BOOLAttachFromFile(LPCTSTRlpcPathName)。 BOOL AttachFromFile(CFile amp。 file)。 從文件加載位圖 BOOL SaveToFile(LPCTSTR lpcPathName)。 BOOL SaveToFile(CFile amp。 file)。 將位圖保存到文件 BOOL Draw(CDC*pDC)。 將位圖繪制到設(shè)備平面 void SetPixel(int y,COLORREF color)。 設(shè)置指定位置像素的值 15 函數(shù)原型 功能 COLORREF GetPixel(int x,int y)。 獲取指定位置像素的顏色值 BYTE GetGray9int x,int y)。 獲取指定位置像素的灰度值 int GetWidthByte()。 獲取圖像數(shù)據(jù)矩陣一行的字節(jié)數(shù) int GetWidthPixel()。 獲取圖像數(shù)據(jù)矩陣一行的像素?cái)?shù) int GetHeight()。 獲取圖像數(shù)據(jù)矩陣的高度(行數(shù) ) void ImResize(int nHeight,int nWidth)。 改變位圖的尺寸 BOOL IsBinaryImg()。 判斷當(dāng)前對(duì)象中存儲(chǔ)的是否為二值圖像 BOOL IsIndexedImg(void)。 判斷當(dāng)前對(duì)象中存儲(chǔ)的是否為索引圖像 bool Index2Gray()。 256 色素引圖像轉(zhuǎn)灰度圖 像 LPVOID GetColorTable()。 取得顏色索引表數(shù)據(jù) 4 圖像的幾何變換 包含相同內(nèi)容的兩幅圖像可能由于成像角度、透視關(guān)系乃至鏡頭自身原因所造成的幾何失真而呈現(xiàn)出截然不同的外觀,這就給觀測(cè)者或是圖像識(shí)別程序帶來(lái)了困擾。通過(guò)適當(dāng)?shù)膸缀巫儞Q可以最大程度地消除這些幾何失真所產(chǎn)生的負(fù)面影響,有利于我們?cè)诤罄m(xù)的處理和識(shí)別工作中將注意力集中于圖像內(nèi)容本身,更確切地說(shuō)是圖像中的對(duì)象,而不是該對(duì)象的角度和位置等。因此,幾何變換常常作為其他圖像處理應(yīng)用的預(yù)處理步驟。 解決幾何變換的一般思路 圖像 幾何變換又稱為圖像空間變換,它將一幅圖像中的坐標(biāo)位置映射到另一幅圖像中的新坐標(biāo)位置。我們學(xué)習(xí)幾何變換的關(guān)鍵就是要確定這種空間映射關(guān)系,以 16 及映射過(guò)程中的變換參數(shù)。 幾何變換不改變圖像的像素值,只是在圖像平面上進(jìn)行像素的重新