官术网_书友最值得收藏!

  • 計算機視覺
  • 劉紹輝
  • 1870字
  • 2021-01-22 18:56:25

2.2 灰度位圖圖像和彩色位圖圖像

2.1節(jié)簡單介紹了位圖的基本情況,如8位圖像和24位圖像等。本節(jié)介紹灰度和彩色位圖圖像。

一般出版物為了降低成本,都采用灰度圖像,也就是沒有彩色的圖像。那么,這種灰度圖像屬于8位圖像,還是24位圖像呢?具體在計算機中是如何表示的呢?這些問題參考位圖的結(jié)構(gòu),如圖2.4所示。

img

圖2.4 位圖的結(jié)構(gòu)

在上述結(jié)構(gòu)定義中,三個結(jié)構(gòu)體分別定義如下。其中,BITMAPFILEHEADER為

img

其各個參數(shù)含義如下:

(1)bfType:位圖文件類型,必須是0x424D,即字符串"BM",也就是說,所有的“*.bmp”文件的頭2字節(jié)都是"BM"。若磁盤損壞,則可以根據(jù)這個標志位恢復部分位圖數(shù)據(jù)。

(2)bfSize:位圖文件大小,包括14字節(jié)。

(3)bfReserved1,bfReserved2:Windows的保留字,暫不使用。

(4)bfOffBits:從文件頭到實際的位圖數(shù)據(jù)的偏移字節(jié)數(shù)。

BITMAPINFOHEADER定義為:

img

BITMAPINFOHEADER結(jié)構(gòu)體的各個參數(shù)的詳細說明如下:

(1)biSize:本結(jié)構(gòu)體的長度,為40 B。

(2)biWidth:位圖的寬度,以像素為單位。

(3)biHeight:位圖的高度,以像素為單位。

(4)biPlanes:目標設備的級別,必須是1。

(5)biBitCount:每個像素所占的位數(shù)(bit),其值必須為1(黑白圖像)、4(16色圖)、8(256色)、24(真彩色圖),新的BMP格式支持32位色。

(6)biCompression:位圖壓縮類型,有效值為BI_RGB(未經(jīng)壓縮)、BI_RLE8、BI_RLE4、BI_BITFILEDS(均為Windows定義常量)。這里只討論未經(jīng)壓縮的情況,即biCompression=BI_RGB。

(7)biSizeImage:實際的位圖數(shù)據(jù)占用的字節(jié)數(shù),該值的大小在第4部分位圖數(shù)據(jù)中有具體解釋。

(8)biXPelsPerMeter:指定目標設備的水平分辨率,單位是像素/米。

(9)biYPelsPerMeter:指定目標設備的垂直分辨率,單位是像素/米。

(10)biClrUsed:位圖實際用到的顏色數(shù),若該值為零,則用到的顏色數(shù)為2的biBitCount次冪。

(11)biClrImportant:位圖顯示過程中重要的顏色數(shù),若該值為零,則認為所有的顏色都是重要的。

而顏色表部分實際上由占4字節(jié)的RGBQUAD結(jié)構(gòu)體數(shù)組組成,該結(jié)構(gòu)體數(shù)組的長度由biClrUsed指定(若該值為零,則由biBitCount指定,即2的biBitCount次冪個元素)。RGBQUAD結(jié)構(gòu)體定義為:

img

其各個參數(shù)定義如下:

(1)rgbBlue:該種顏色的藍色分量值;

(2)rgbGreen:該種顏色的綠色分量值;

(3)rgbRed:該種顏色的紅色分量值;

(4)rgbReserved:保留值,有時可用來表示α通道值。

有些位圖需要顏色表,而有些位圖(如真彩色圖)不需要顏色表,顏色表的長度由BITMAPINFOHEADER結(jié)構(gòu)中的biBitCount分量決定。對于biBitCount值為1的二值圖像,每像素占 1bit,圖像中只有兩種(如黑白)顏色,顏色表也就有21=2個表項,整個顏色表的大小為2×sizeof(RGBQUAD)=2×4=8 B;對于biBitCount值為8的灰度圖像,每像素占8bit,圖像中有28=256種顏色,顏色表也就有256個表項,且每個表項的R、G、B分量都相等,整個顏色表的大小為256×4=2014 B;而對于大于256種顏色的彩色圖像,如biBitCount=24,由于每像素3 B中分別代表了R、G、B三個分量的值,此時不需要顏色表,因此真彩色圖的BITMAPINFOHEADER結(jié)構(gòu)體后面直接就是位圖數(shù)據(jù)。

注意,有的工程師在編寫自己的位圖類時,RGBQUAD中元素的順序可能會翻轉(zhuǎn)為R、G、B,而不是默認的B、G、R順序,此時會導致顯示器顯示的圖像顏色不正確。一旦出現(xiàn)該情況,可以根據(jù)實際情況,調(diào)試解決該問題。

第三部分是位圖數(shù)據(jù),即圖像數(shù)據(jù),其緊跟在文件頭、顏色表(若有顏色表)之后,記錄了圖像的每個像素值。對于有顏色表的位圖,位圖數(shù)據(jù)就是該像素顏色在顏色表中的索引值;對于真彩色圖,位圖數(shù)據(jù)就是實際的R、G、B值(三個分量的存儲順序是B、G、R)。

下面分別就2色、16色、256色和真彩色位圖的位圖數(shù)據(jù)進行說明。

對于2色位圖,用1位就可以表示該像素的顏色,所以1 B能存儲8個像素的顏色值。對于16色位圖,用4 bit可以表示1個像素的顏色,所以1B可以存儲2個像素的顏色值。對于256色位圖,1 B剛好存儲1個像素的顏色值。對于真彩色位圖,3 B才能表示1個像素的顏色值。但實際應用中需要注意以下特殊情況:

(1)Windows規(guī)定一個掃描行所占的字節(jié)數(shù)必須是4的倍數(shù),若不足4的倍數(shù)則要對其進行擴充。假設圖像的寬為biWidth個像素,每個像素biBitCount位,其一個掃描行所占的真實字節(jié)數(shù)的計算公式為

DataSizePerLine=(biWidth×biBitCount /8+ 3)/ 4×4

那么,在不壓縮的情況下,位圖數(shù)據(jù)的大小(BITMAPINFOHEADER結(jié)構(gòu)中的biSizeImage成員)計算公式為

biSizeImage=DataSizePerLine×biHeight

但在實際編程實現(xiàn)時,往往會出現(xiàn)顯示的圖像是斜的,這一般是由于沒有按照4的整數(shù)倍對齊圖像數(shù)據(jù)造成的。顯然,若圖像每行字節(jié)數(shù)不是4的整數(shù)倍,則這時圖像每行最后都用多余的字節(jié)補成4的整數(shù)倍這個方法是沒用的,這些字節(jié)實際上可以用于邊信息通信,如信息隱藏等。

(2)一般程序中,BMP文件的數(shù)據(jù)是從圖像的左下角開始逐行掃描圖像的,即從下到上、從左到右來安排圖像的像素值,因此圖像坐標零點在圖像左下角。但有些工程師在編寫程序時并沒有按照這種規(guī)范,而只是簡單從上到下、從左到右排列像素值,這時會造成圖像倒立。例如,OpenCV中有專門的標志位來確認這種現(xiàn)象。

主站蜘蛛池模板: 旅游| 乌拉特后旗| 望谟县| 万全县| 涡阳县| 玉田县| 青州市| 新河县| 沂南县| 阿克苏市| 南陵县| 阜康市| 忻州市| 奉贤区| 海盐县| 桑植县| 贺兰县| 丰台区| 白山市| 政和县| 怀宁县| 视频| 和硕县| 灵丘县| 丰原市| 滨州市| 漳浦县| 略阳县| 攀枝花市| 浮山县| 昌乐县| 渭南市| 社旗县| 灵丘县| 彭泽县| 容城县| 梁平县| 新民市| 贞丰县| 武山县| 大化|