彩色圖像變成灰度格式,是要扔掉圖像的顏色信息,用灰度表示圖像的亮度信息。彩色圖像每像素占3個字節,而變成灰度圖像后,每個像素占一個字節,像素的灰度值是當前彩色圖像像素的亮度,對於一個三分量的RGB的彩色圖像像素,該店的亮度一般按以下公式計算:
I = 0.3B + 0.59G + 0.11R
另外,彩色圖像沒有顏色表,因此轉換成灰度圖像后,還要為灰度圖像生成顏色表。我們只需要為灰度圖像的顏色表分配256個長度的RGBQUAD結構體數組,並將顏色表中每一項的R,G,B分量設置成相同的值即可。
分配顏色表:
if(m_nColorTableLengthOut!=0) { m_lpColorTableOut=new RGBQUAD[m_nColorTableLengthOut]; for(int i=0; i<m_nColorTableLengthOut;i++) { m_lpColorTableOut[i].rgbBlue=i; m_lpColorTableOut[i].rgbGreen=i; m_lpColorTableOut[i].rgbRed=i; m_lpColorTableOut[i].rgbReserved=0; } }
轉換:
for(i=0;i<m_imgHeight;i++) { for(j=0;j<m_imgWidth;j++) *(m_pImgDataOut+i*lineByteOut+j)=0.11**(m_pImgData+i*lineByteIn+j*pixelByteIn+0) +0.59**(m_pImgData+i*lineByteIn+j*pixelByteIn+1) +0.30**(m_pImgData+i*lineByteIn+j*pixelByteIn+2)+0.5; }
灰度圖像變彩色格式
灰度圖像變彩色,需要將彩色圖像中每個像素三個分量設置成相應的灰度值,即三個分量的值相等,對於顏色表,由於彩色圖像每有顏色表,一次不需要為彩色圖像分配顏色表緩沖區。因此灰度圖像變彩色只是在格式上變成了彩色,而沒有真正的顏色信息。
1、刪除顏色表
2、轉換:
for(i=0;i<m_imgHeight;i++) { for(j=0;j<m_imgWidth;j++) { //用像素灰度值為彩色格式中每個通道賦值,三個通道數值相等 for(k=0;k<3;k++) *(m_pImgDataOut+i*lineByteOut+j*3+k)=*(m_pImgData+i*lineByteIn+j); }