彩色图像与灰度图像的转换
彩色图像变成灰度格式,是要扔掉图像的颜色信息,用灰度表示图像的亮度信息。彩色图像每像素占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); }