admin管理员组

文章数量:1566678

          PhotoShop算法实现--伪彩色图像处理(八)

kezunhai@gmail

http://blog.csdn/kezunhai

        伪彩色(Pseudo-color)就是通过一种色彩映射,把一种颜色指定给灰度图像的一个灰度级,让灰度图像也有色彩。当然,这种彩色是通过人为着色的,不是图像场景中的真实色彩,故只能叫做“伪彩色”。伪彩色图像的每个像素值实际上是一个索引值或代码,该代码值作为色彩查找表CLUT(Color Look-Up Table)中某一项的入口地址,根据该地址可查找出包含实际R、G、B的强度值。

        要了解伪彩色,先介绍几个概念:

         1)真彩色(True Color)

         自然物体的彩色叫做真彩色,一般可用红、绿、蓝三种滤色片把一副真彩色图像分离为红、绿、蓝三幅图像:把红、绿、蓝再三幅图像再合成,即恢复为原来的真彩色图像。

         2)假彩色(Sham-Color)

         假彩色分为三种:
       (1)把真是景物的图像的像素逐个地映射为另一种颜色,使目标在原图像中更突出。例如蓝天上有银灰色的飞机,蓝天可映射为红色,飞机和草地可映射为蓝色。这种映射关系可以是一一对应的,也可以不是一一对应的,因此又称为假彩色指定。
       (2)把多光谱图像中的任意三个光谱图像映射为红、绿、蓝三种可见光谱段的新号,再合成为一副彩色图像。通常这种映射的图像有接近于自然光彩色的效果。
      (3)把黑白图像用灰度级映射或频谱映射而成为类似真实彩色的处理,相当于黑白图片的人工着色法。

         3)伪彩色(Pseudo-color

        伪彩色相当于假彩色的一个特例,也就是指定某灰度为某种彩色。通常,这种指定最多为16级左右,最高也不超过30级,否则指定的色彩太多而无法记忆和区分。当每个像素可指定的彩色书目对红、绿、蓝分别达到256种时,也就变成模拟自然彩色的假彩色了,因此假彩色和伪彩色指定是很难严格区分的。通常,把黑白图像做少量彩色映射时叫做伪彩色指定。

         伪彩色处理是用彩色来代替像素灰度值的一种技术,由于人眼对彩色的分辨率远高于对灰度差的分辨率,所以这种技术可以用来识别灰度差较小的像素,这是一种视觉效果明显而技术又不是很复杂的图像增强技术。在转换过程中,对灰度图像的每一个像素点,取得该点的灰度值并送入红、绿、蓝三个通道实施不同的变换,产生相应的红、绿、蓝的亮度值。具体的变换方法很多,下图是一种简单的映射变换曲线:



         本文实现的算法不采用这种方法,而是采用另外一种方法:对于任意一副图像,可以先将灰度级降到16级,然后根据灰度与相应的颜色对应关系,求出新的颜色。       

        颜色映射表:

uchar ColorTalbe[]=
{
	0, 0 , 0,	// 0黑色
	0, 0, 85,   // 1深蓝
	0, 85, 0,   // 2深绿
	85, 0, 0,   // 3深红
	64, 64, 64, // 4深灰
	85, 0, 85,  // 5蓝紫
	0, 0, 255,  // 6蓝色
	85, 85, 0,  // 7草绿
	0, 255, 0,  // 8绿色
	255, 0, 0,  // 9红色
	128, 128, 128, // 10灰色
	0, 255, 255,   // 11青色
	255, 255, 0,   // 12黄色
	255, 255, 255, // 13白色
	0, 85, 85,     // 14深蓝率
	255, 0, 255    // 15紫色
};

        算法实现:

// img:需为灰度图像
// ColorTable:为颜色映射表
void PhotoShop::PseudoColor(Mat& img, Mat &gImg)
{
	if ( gImg.empty())	
		gImg.create(img.rows, img.cols, CV_8UC3);		

	gImg = cv::Scalar::all(0);

	int i, j;
	Size size = img.size();
	//int chns = img.channels();

	int chns = gImg.channels();

	if (img.isContinuous() && gImg.isContinuous())
	{
		size.width *= size.height; 
		size.height = 1;
	}

	for (  i= 0; i<size.height; ++i)
	{
		const unsigned char* src = (const unsigned char*)(img.data+ img.step*i);
		unsigned char* dst = (unsigned char*)gImg.data+gImg.step*i;
		for (  j=0; j<size.width; ++j)
		{	
			uchar val = src[j]>>4;			
			dst[j*chns] = ColorTalbe[val*3];
			dst[j*chns+1] =ColorTalbe[val*3+1];
			dst[j*chns+2] = ColorTalbe[val*3+2];
		}
	}	
}
        实现效果图:



      另外,还有更多有关伪彩色的资料:

1、伪彩色增强

作者:kezunhai 出处:http://blog.csdn/kezunhai 欢迎转载或分享,但请务必声明文章出处。


本文标签: 图像处理算法彩色photoshop