灰度圖是指用灰度表示的圖像,灰度是在白色和黑色之間分的若干個等級,其中最常用的是256級,也就是256級灰度圖。灰度圖在醫學、航天等領域有着廣泛的應用。
Gray = R*0.3+G*0.59+B*0.11
這也是最常用的一種轉換,另外還有一種常用的轉換叫平均值法,即取去紅綠藍三色的平均值爲灰度:
Gray=(R+G+B)/3;
下面來寫一段程序實現第一種轉換算法,顯然對於對於一幅256級灰度圖,每個像素採用一個字節表示足矣,即爲8位位圖。對於8位位圖的保存,真正的RGB數據是保存在調色板裏的,而實際的數據僅僅是保存的調色板內的像素值的索引。
轉自 http://www.cnblogs.com/tingshuo/archive/2011/05/16/2047797.html
BMP格式詳解:
位圖文件的組成
|
結構名稱
|
符號
|
位圖文件頭(bitmap-file header)
|
BITMAPFILEHEADER
|
bmfh
|
位圖信息頭(bitmap-information header)
|
BITMAPINFOHEADER
|
bmih
|
彩色表(color table)
|
RGBQUAD
|
aColors[]
|
圖象數據陣列字節
|
BYTE
|
aBitmapBits[]
|
|
偏移量
|
域的名稱
|
大小
|
內容
|
圖象文件
頭
|
0000h
|
文件標識
|
2 bytes
|
兩字節的內容用來識別位圖的類型:
‘BM’ : Windows 3.1x, 95, NT, …
‘BA’ :OS/2 Bitmap Array
‘CI’ :OS/2 Color Icon
‘CP’ :OS/2 Color Pointer
‘IC’ : OS/2 Icon
‘PT’ :OS/2 Pointer
注:因爲OS/2系統並沒有被普及開,所以在編程時,你只需判斷第一個標識“BM”就行。
|
|
0002h
|
File Size
|
1 dword
|
用字節表示的整個文件的大小
|
|
0006h
|
Reserved
|
1 dword
|
保留,必須設置爲0
|
|
000Ah
|
Bitmap Data Offset
|
1 dword
|
從文件開始到位圖數據開始之間的數據(bitmap data)之間的偏移量
|
|
000Eh
|
Bitmap Header Size
|
1 dword
|
位圖信息頭(Bitmap Info Header)的長度,用來描述位圖的顏色、壓縮方法等。下面的長度表示:
28h - Windows 3.1x, 95, NT, …
0Ch - OS/2 1.x
F0h - OS/2 2.x
注:在Windows95、98、2000等操作系統中,位圖信息頭的長度並不一定是28h,因爲微軟已經制定出了新的BMP文件格式,其中的信息頭結構變化比較大,長度加長。所以最好不要直接使用常數28h,而是應該從具體的文件中讀取這個值。這樣才能確保程序的兼容性。
|
|
0012h
|
Width
|
1 dword
|
位圖的寬度,以象素爲單位
|
|
0016h
|
Height
|
1 dword
|
位圖的高度,以象素爲單位
|
|
001Ah
|
Planes
|
1 word
|
位圖的位面數(注:該值將總是1)
|
圖象
信息
頭
|
001Ch
|
Bits Per Pixel
|
1 word
|
每個象素的位數
1 - 單色位圖(實際上可有兩種顏色,缺省情況下是黑色和白色。你可以自己定義這兩種顏色)
4 - 16 色位圖
8 - 256 色位圖
16 - 16bit 高彩色位圖
24 - 24bit 真彩色位圖
32 - 32bit 增強型真彩色位圖
|
|
001Eh
|
Compression
|
1 dword
|
壓縮說明:
0 - 不壓縮 (使用BI_RGB表示)
1 - RLE 8-使用8位RLE壓縮方式(用BI_RLE8表示)
2 - RLE 4-使用4位RLE壓縮方式(用BI_RLE4表示)
3 - Bitfields-位域存放方式(用BI_BITFIELDS表示)
|
|
0022h
|
Bitmap Data Size
|
1 dword
|
用字節數表示的位圖數據的大小。該數必須是4的倍數
|
|
0026h
|
HResolution
|
1 dword
|
用象素/米表示的水平分辨率
|
|
002Ah
|
VResolution
|
1 dword
|
用象素/米表示的垂直分辨率
|
|
002Eh
|
Colors
|
1 dword
|
位圖使用的顏色數。如8-比特/象素表示爲100h或者 256.
|
|
0032h
|
Important Colors
|
1 dword
|
指定重要的顏色數。當該域的值等於顏色數時(或者等於0時),表示所有顏色都一樣重要
|
調色板數據
|
根據BMP版本的不同而不同
|
Palette
|
N * 4 byte
|
調色板規範。對於調色板中的每個表項,這4個字節用下述方法來描述RGB的值:
|
圖象數據
|
根據BMP版本及調色板尺寸的不同而不同
|
Bitmap Data
|
xxx bytes
|
該域的大小取決於壓縮方法及圖像的尺寸和圖像的位深度,它包含所有的位圖數據字節,這些數據可能是彩色調色板的索引號,也可能是實際的RGB值,這將根據圖像信息頭中的位深度值來決定。
|
DWORD bfSize;
UINT bfReserved1;
UINT bfReserved2;
DWORD bfOffBits;
bfType
|
說明文件的類型.(該值必需是0x4D42,也就是字符'BM'。我們不需要判斷OS/2的位圖標識,這麼做現在來看似乎已經沒有什麼意義了,而且如果要支持OS/2的位圖,程序將變得很繁瑣。所以,在此只建議你檢察'BM'標識)
|
bfSize
|
說明文件的大小,用字節爲單位
|
bfReserved1
|
保留,必須設置爲0
|
bfReserved2
|
保留,必須設置爲0
|
bfOffBits
|
說明從文件頭開始到實際的圖象數據之間的字節的偏移量。這個參數是非常有用的,因爲位圖信息頭和調色板的長度會根據不同情況而變化,所以你可以用這個偏移值迅速的從文件中讀取到位數據。
|
RGBQUAD bmiColors[1];
bmiHeader
|
說明BITMAPINFOHEADER結構,其中包含了有關位圖的尺寸及位格式等信息
|
bmiColors
|
說明彩色表RGBQUAD結構的陣列,其中包含索引圖像的真實RGB值。
|
LONG biWidth;
LONG biHeight;
WORD biPlanes;
WORD biBitCount;
DWORD biCompression;
DWORD biSizeImage;
LONG biXPelsPerMeter;
LONG biYPelsPerMeter;
DWORD biClrUsed;
DWORD biClrImportant;
biSize
|
說明BITMAPINFOHEADER結構所需要的字數。注:這個值並不一定是BITMAPINFOHEADER結構的尺寸,它也可能是sizeof(BITMAPV4HEADER)的值,或是sizeof(BITMAPV5HEADER)的值。這要根據該位圖文件的格式版本來決定,不過,就現在的情況來看,絕大多數的BMP圖像都是BITMAPINFOHEADER結構的(可能是後兩者太新的緣故吧:-)。
|
biWidth
|
說明圖象的寬度,以象素爲單位
|
biHeight
|
說明圖象的高度,以象素爲單位。注:這個值除了用於描述圖像的高度之外,它還有另一個用處,就是指明該圖像是倒向的位圖,還是正向的位圖。如果該值是一個正數,說明圖像是倒向的,如果該值是一個負數,則說明圖像是正向的。大多數的BMP文件都是倒向的位圖,也就是時,高度值是一個正數。(注:當高度值是一個負數時(正向圖像),圖像將不能被壓縮(也就是說biCompression成員將不能是BI_RLE8或BI_RLE4)。
|
biPlanes
|
爲目標設備說明位面數,其值將總是被設爲1
|
biBitCount
|
說明比特數/象素,其值爲1、4、8、16、24、或32
|
biCompression
|
說明圖象數據壓縮的類型。其值可以是下述值之一:
|
biSizeImage
|
說明圖象的大小,以字節爲單位。當用BI_RGB格式時,可設置爲0
|
biXPelsPerMeter
|
說明水平分辨率,用象素/米表示
|
biYPelsPerMeter
|
說明垂直分辨率,用象素/米表示
|
biClrUsed
|
說明位圖實際使用的彩色表中的顏色索引數(設爲0的話,則說明使用所有調色板項)
|
biClrImportant
|
說明對圖象顯示有重要影響的顏色索引的數目,如果是0,表示都重要。
|
- 第二個字節的值爲0:行的結束。
- 第二個字節的值爲1:圖象結束。
- 第二個字節的值爲2:其後的兩個字節表示下一個象素從當前開始的水平和垂直位置的偏移量。
這些壓縮數據可解釋爲 :
壓縮數據
|
擴展數據
|
03 04
|
04 04 04
|
05 06
|
06 06 06 06 06
|
00 03 45 56 67 00
|
45 56 67
|
02 78
|
78 78
|
00 02 05 01
|
從當前位置右移5個位置後向下移一行
|
02 78
|
78 78
|
00 00
|
行結束
|
09 1E
|
1E 1E 1E 1E 1E 1E 1E 1E 1E
|
00 01
|
RLE編碼圖象結束
|
- 第二個字節的值爲0:行的結束。
- 第二個字節的值爲1:圖象結束。
- 第二個字節的值爲2:其後的兩個字節表示下一個象素從當前開始的水平和垂直位置的偏移量。
壓縮數據
|
擴展數據
|
03 04
|
0 4 0
|
05 06
|
0 6 0 6 0
|
00 06 45 56 67 00
|
4 5 5 6 6 7
|
04 78
|
7 8 7 8
|
00 02 05 01
|
從當前位置右移5個位置後向下移一行
|
04 78
|
7 8 7 8
|
00 00
|
行結束
|
09 1E
|
1 E 1 E 1 E 1 E 1
|
00 01
|
RLE圖象結束
|
BYTE rgbGreen;
BYTE rgbRed;
BYTE rgbReserved;
rgbBlue
|
指定藍色強度
|
rgbGreen
|
指定綠色強度
|
rgbRed
|
指定紅色強度
|
rgbReserved
|
保留,設置爲0
|
2)2-3:整個文件大小。4690 0000,爲00009046h=36934。
3)4-5:保留,必須設置爲0。
4)6-7:從文件開始到位圖數據之間的偏移量。4600 0000,爲00000046h=70,上面的文件頭就是35字=70字節。
5)8-9:位圖圖信息頭長度。
6)10-11:位圖寬度,以像素爲單位。8000 0000,爲00000080h=128。
7)12-13:位圖高度,以像素爲單位。9000 0000,爲00000090h=144。
8)14:位圖的位面數,該值總是1。0100,爲0001h=1。
12)20-21:用象素/米表示的水平分辨率。A00F 0000爲0000 0FA0h=4000。
13)22-23:用象素/米表示的垂直分辨率。A00F 0000爲0000 0FA0h=4000。
14)24-25:位圖使用的顏色索引數。設爲0的話,則說明使用所有調色板項。
15)26-27:對圖象顯示有重要影響的顏色索引的數目。如果是0,表示都重要。
1字節用於藍色分量
1字節用於綠色分量
1字節用於紅色分量
1字節用於填充符(設置爲0)
對於24-位真彩色圖像就不使用彩色表,因爲位圖中的RGB值就代表了每個象素的顏色。但是16位r5g6b5位域彩色圖像需要彩色表,看前面的圖,與上面的解釋不太對得上,應以下面的解釋爲準。
00F8 0000爲F800h=1111100000000000(二進制),是紅色分量的掩碼。
E007 0000爲07E0h=0000011111100000(二進制),是綠色分量的掩碼。
1F00 0000爲001Fh=0000000000011111(二進制),是紅色分量的掩碼。
0000 0000總設置爲0。
按照前述r5g6b5彩色板規範,我們對圖像最左下角手機上圖像的的像素在24位模式中的rgb值進行推算(由於垂直翻轉,這個像素在手機上看來實際上在左上角):
02F1 爲 F102h
r=(F102 AND F800)/ 800 × 8 h= F0h=240
g=(F102 AND 07E0)/ 20 × 4 h=20h=32
b=(F102 AND 001F)× 8 h= 10h=16
rgb=F02010h,放在存儲器中爲1020F0h。
在Photoshop中設一下顏色,rgb取240、32、16可以看到是近紅色。