彩色图像与灰度图像的转换

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

posted on 2012-06-29 21:23  NotValid  阅读(8688)  评论(0编辑  收藏  举报

导航