PhotoShop算法实现

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

kezunhai@gmail.com

http://blog.csdn.net/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级,然后根据灰度与相应的颜色对应关系,求出新的颜色。

颜色映射表:

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

        算法实现:

  1. // img:需为灰度图像
  2. // ColorTable:为颜色映射表
  3. void PhotoShop::PseudoColor(Mat& img, Mat &gImg)
  4. {
  5. if ( gImg.empty())
  6. gImg.create(img.rows, img.cols, CV_8UC3);
  7. gImg = cv::Scalar::all(0);
  8. int i, j;
  9. Size size = img.size();
  10. //int chns = img.channels();
  11. int chns = gImg.channels();
  12. if (img.isContinuous() && gImg.isContinuous())
  13. {
  14. size.width *= size.height;
  15. size.height = 1;
  16. }
  17. for ( i= 0; i<size.height; ++i)
  18. {
  19. const unsigned char* src = (const unsigned char*)(img.data+ img.step*i);
  20. unsigned char* dst = (unsigned char*)gImg.data+gImg.step*i;
  21. for ( j=0; j<size.width; ++j)
  22. {
  23. uchar val = src[j]>>4;
  24. dst[j*chns] = ColorTalbe[val*3];
  25. dst[j*chns+1] =ColorTalbe[val*3+1];
  26. dst[j*chns+2] = ColorTalbe[val*3+2];
  27. }
  28. }
  29. }

        实现效果图:

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

1、伪彩色增强

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

(0)

相关推荐