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

一.彩色图像简介

在RGB色彩空间,图像深度与色彩的映射关系主要有真彩色、伪彩色和调配色。

真彩色是指在组成一幅彩色图像的每个像素值中,有R,G,B三个基色分量,每个基色分量直接决定显示设备的基色强度,这样产生的彩色称为真彩色,是真实的原图彩色。

伪彩色图像的每个像素值实际上是一个索引值或代码,该代码值作为色彩查找表CLUT中某一项的入口地址,根据该地址可查找出包含实际R,G,B的强度值。这种用查找映射的方法产生的色彩称为伪彩色。色彩查找表CLUT是一个事先做好的表,表项入口地址也称为索引号。彩色图像本身的像素数值和色彩查找表的索引号有一种变换关系,这种关系可以是系统定义的,也可以是用户自己定义的变换关系。使用查找得到的数值显示的彩色是真的,可又不是图像本身的颜色,因为其没有完全反映原图的彩色,所以称其为伪彩色。

调配色的获取是通过每个像素点的R,G,B分量分别作为单独的索引值进行变换,经相应的色彩查找表找出各自的基色强度,用变换后的R,G,B强度值产生色彩。

二.灰度图像简介

灰度是描述灰度图像内容的最直接的视觉特征。它指黑白图像中点的颜色深度,范围一般从0到255,白色为255,黑色为0,故黑白图像也称灰度图像。灰度图像矩阵元素的取值通常为[0,255],因此其数据类型一般为8位无符号整数,这就是人们通常所说的256级灰度。

三.彩色图像转化为灰度图像

彩色图像转换为灰度图像时,需要计算图像中每个像素有效的亮度值,其计算公式为:

Y = 0.3R + 0.59G + 0.11B

代码如下:

clear all;
close all;

I = imread('lenna.png');
[M N H] = size(I);
I2 = zeros(M, N);

for x = 1 : M
   for y = 1 : N
      A = double([I(x, y, 1) I(x, y, 2) I(x, y, 3)]);
      B = [0.3; 0.59; 0.11];
      [gray] = A * B;                                           % 计算灰度值
      I2(x, y) = gray;
   end
end

imshow(uint8(I2));

四.灰度图像转换为彩色图像 

将灰度图像转换为彩色图像,称为灰度图像的伪彩色处理。

伪彩色处理技术的实现方式有很多,如:灰度分割法、灰度级-彩色变换法、滤波法等等。以下采用的是灰度级-彩色变换法,这是将来自传感器的灰度图像送入三个不同特征的R、G、B变换器,然后将三种变换器的不同输出分别送到彩色显示器进行显示的技术。

映射关系如下,其中R(x,y)、G(x,y)、B(x,y)分别表示R、G、B通道的颜色值,f(x,y)表示特定点灰度图像的灰度值,f是所选灰度图像的灰度值。

代码如下:

clear all;
close all;

I = imread('lenna.jpg');
[M N] = size(I);
I2 = zeros(M, N, 3);

for x = 1 : M
   for y = 1 : N
      if I(x, y) <= 127                                 % R
          I2(x, y, 1) = 0;
      elseif I(x, y) <= 191
          I2(x, y, 1) = 4 * I(x, y) - 510;
      else
          I2(x, y, 1) = 255;
      end
      
      if I(x, y) <= 63                                  % G
          I2(x, y, 2) = 254 - 4 * I(x, y);
      elseif I(x, y) <= 127
          I2(x, y, 2) = 4 * I(x, y) - 254;
      elseif I(x, y) <= 191
          I2(x, y, 2) = 255;
      else
          I2(x, y, 2) = 1022 - 4 * I(x, y);
      end
      
      if I(x, y) <= 63                                 % B
          I2(x, y, 3) = 255;
      elseif I(x, y) <= 127
          I2(x, y, 3) = 510 - 4 * I(x, y);
      else
          I2(x, y, 3) = 0;
      end
   end
end

imshow(uint8(I2));

posted on 2015-10-15 20:16  奈何作贼  阅读(27419)  评论(0编辑  收藏  举报

导航