MATLAB像素颜色的表达方式

MATLAB像素颜色的表达方式

 





【中文转述】

 

252
249
246
243
237
255
255
250
246
243
253
254
248
245
243
250
249
245
243
239
 


    这些像素值表示什么颜色?如果你很熟悉图像处理,那你应该知道255表示白色,所以上面这些数字表示白色或者接近白色的颜色。但是实际上,这些数字并不是来自一张图片。这些数字是波士顿地区的海拔高度,从U.S. Geological Survey (USGS)下载 255是一个以米为单位的测量值,并不表示颜色。
MATLAB可以将任何矩阵以图片的形式显示出来。比如,根据你使用命令的不同,MATLAB可以将海拔高度数据显示为如下图。
或者是


    将矩阵按照各种方式显示为图形,可以更直观的了解你的数据。通过理解不同的图形类型,你可以知道MATLAB是如何将矩阵值转化为像素值的。你可以控制MATLAB对数据的显示方式,纠正有可能出错的图形。


图形类型

    一种图像类型即代表了一种从矩阵值到像素值的映射方式。MATLAB有三种基本的图像类型:
Truecolor——数码相机的格式,广泛用于计算机图形。
Indexed scaled indexed ——经常用来显示科学或者工程数据,使用的颜色比例可以代表不同的数据单位。


Image Processing Toolbox可以识别另外两种类型:
Grayscale
——经常用在图像处理和图像分析算法中
Binary
——经常用做为一个封装来表示图形的分割结果或者是感兴趣的区域。

Truecolor Images

   在这种格式的图里,每一个像素由三个数字表示:红,绿,蓝,整个图形由一个M-N-3的三维矩阵表达。图形显示函数和图形处理工具箱将这种矩阵视为一个truecolor图形。[传说中的真彩色,囧]
    比如,我们构造一个两行-两列的truecolor图形,使上面的两个像素为红和蓝色,下面的两个像素为黄色和灰色。
首先,构造32-2的矩阵来代表每一个颜色成分。

  1. red = [1 0; 1 0.7]
  2. green = [0 0; 1 0.7]
  3. blue = [0 1; 0 0.7]
复制代码


然后,使用cat函数来将这些颜色成分矩阵在第三维上拼合起来。

  1. truecolor_image = cat(3, red, green, blue);
复制代码


最后,使用image函数显示图形:

  1. image(truecolor_image)
  2. axis equal % Display the image using square pixels
复制代码


可以看到,矩阵值直接指定了每一个像素的颜色。通过这种表达方式你可以很大程度上控制颜色显示,但是对于工程应用来说它并不是最适合的一种图形格式。


Indexed images索引图像

   在索引图像里,颜色矩阵的值并不直接决定颜色像素。MATLAB将矩阵值作为索引在图像的colormap中进行颜色查表。比如,在MATLAB文件clown.mat中包含一下索引图形:

  1. load clown %可以在你的matlab中直接输入这个命令
  2. whos
复制代码


Name         Size         Bytes     Class

X           200x320       512000    double array
caption       2x1              4    char array
map          81x3           1944    double array

Grand total is 64245 elements using 513948 bytes

    变量X中存放了查表索引,map中存放了对应的colormap。两者都会直接用于图像显示。(5,5)这个像素点上的颜色,对应于X(5,5)的值:

  1. X (5, 5)
复制代码


ans =
    61
这个值作为colormap的行索引值:

  1. map (61, :)
复制代码


ans =
    0.9961 0.5781 0.1250

由此看到,像素(5,5)处的颜色是由‘很多红色',‘一些绿色’和‘一点点蓝色’构成。
使用两个MATLAB命令显示这幅图,一个用来显示图形同时另一个用来指定图像的colormap

  1. image(X)
  2. colormap(map)
复制代码


  1. colormap(cool)
复制代码




    与truecolor图像不同的是,indexed图像的显示因使用不同的colormap而不同。
    索引图像在15年前很常用,当时大部分颜色图形设备最多只能同时显示256种颜色。而现在可以使用不同颜色比例来显示数据。因为索引图像的值必须是整数,所以比例索引图像就具有更多灵活性。(这段需修正,不过感觉作用不大,不管它了)

Scaled indexed images比例索引图像

   和一般的索引图像类似,比例索引图像也使用矩阵值在图像的colormap中进行查表。而不同之处在于,将矩阵值进行线性缩放后,再作为查表索引值。
比如,现在使用image命令来显示一个小的magic阵接着将它与imagese来对比。

  1. A = magic(5)
复制代码


A = 17   24    1     8    15     23    5    7    14    16      4    6   13    20    22     10   12   19    21     3     11   18   25     2     9
使用image255-colorgrayscale colormap来显示A)

  1. image(A)
  2. colormap(gray(256))
  3. axis equal
复制代码



    可以看到显示出的图像非常暗。那是因为A矩阵的元素都在125之间,所以图像只使用了grayscale colormap中的最开始的25种颜色来表示图形——均为暗黑色。
对比使用imagesc命令的图形:

  1. imagesc(A)
  2. colormap(gray(256))
  3. axis equal
复制代码



   imagescA中的最小值1显示为colormap色系中的第一个,黑色;将A中的最大值25,显示为colormap色系中的最后一个,白色。其他的所有125之间的值则按此线性比例使用colormap中的对应颜色。比如,12则使用colormap中的第118种颜色,中灰色。
   如果你换了一种colormap,这A中的值则根据新的colormap重新按比例显示。

  1. colormap(jet)
复制代码






    你也可以通过乘以底层图像句柄属性来获得这个比例。如果是在MATLAB里开发GUI程序,你经常需要使用底层函数和属性来替代类设于imagesc这样的命令。现在来看两种与图像颜色显示有关的图形句柄属性。
    图形对象有一个属性叫做CDataMappling

  1. h = image(A);
  2. get(h, 'CDataMapping')
复制代码


ans =
direct
    你可以看到这个属性的默认值为'direct'。这表示A的值直接被用作colormap的索引值。它的值也可以为'scaled',当你使用imagesc时则为这个值。

  1. h = imagesc(A);
  2. get(h, 'CDataMapping')
复制代码


ans =
scaled
   比例的最大最小值由axesCLimcolor limits)属性控制。

  1. h = imagesc(A);
  2. get(gca, 'CLim')
复制代码


ans =
1   25
   默认情况下,imagesc会将A的最大最小值赋给CLim。你也可以指定你自己的颜色界限,通过添加imagesc函数输入参数。

  1. imagesc(A, [10 15])
  2. colormap(gray)
  3. axis equal
复制代码





   这次,imagesc10(以及小于10)显示为黑色。类似地,它将15(以及大于15)的值显示为白色。介于1015的值则显示为相应灰度。
比例图形在图像处理的工程应用中非常重要,因为在这里感兴趣的并不是‘图形’而是带物理单位的度量值矩阵,与光照强度无关,比如说USGS中的高度尺寸。

Grayscale images灰度比例图形

    灰度比例图形只包括亮度信息,它是使用grayscale colormap的比例索引图形。如果你将一个二维矩阵的作为参数传递给图像处理工具箱显示函数,imtoolimshow,这这些函数会自动的使用grayscale colormap来显示这些图形。(imageimagesc函数则使用fugure当前的colormap)。

  1. theta = linspace(0, 2*pi, 256);
  2. I = repmat((-cos(2*theta) + 1)/2, [256 1]);
  3. h = imshow(I);     % Save the handle for use below.
复制代码







imshow会自动的为以下参数赋值:

  1. get(h, 'CDataMapping')
复制代码


ans =
scaled
对于一个floating-point图形,图像处理工具箱约定将0显示为黑色,1显示为白色。

  1. get(gca, 'CLim')
复制代码


ans =
0      1
工具箱会自动使用grayscale colormap

  1. map = get(gcf, 'Colormap');
  2. map(1:5, :)
复制代码


ans =
            0           0        0
       0.0039      0.0039   0.0039
       0.0078      0.0078   0.0078
       0.0118      0.0118   0.0118
       0.0157      0.0157   0.0157

   工具箱里的imshowimtool也可以不使用既定的显示范围而自定义黑和白的值。就像imagesc命令一样,添加一个表示黑和白值的2元素向量的输入参数,如下。0.4及以下表示为黑色,0.6及以上表示为白色。

  1. imshow(I, [0.4 0.6])
复制代码







   灰度比例图形经常用于图像处理算法,直接操作相对亮度值而非颜色。他们也常用于印刷中(略)。

Binary images二进制图形

   二进制图形只包括黑色和白色。图像分割算法的输出通常都是二进制图形,黑色像素代表感兴趣的对象而白色像素代表背景。
图像处理工具箱函数将逻辑矩阵视为一个二进制图形。逻辑矩阵只包括0(显示为黑色)1(显示为白色)

  1. bw = imread('text.png');
  2. islogical(bw)
复制代码


ans =
      1

  1. h = imshow(bw);
复制代码





   二进制图形有时用于文字或者线条。它也用做于图像处理中的封装。一个图形封装将像素分为两类。一类,白色像素,包括感兴趣的位置。比如,表示被删除的对象。而另一类则指示背景位置。


控制像素颜色的图像属性句柄

Image Object: Cdata and Dimensionality
Ø
如果CData是一个三维矩阵,而第三维的大小为3,这CData值认为是RGB值。
Ø
如果CData是一个二维矩阵,则image显示的颜色对应于当前figurecolormapMATLAB使用CData的值(direct直接或者比例scaled)作为colormap的查表索引。


Image Object:CDataMapping


如果CData是一个二维矩阵,则image显示的颜色对应于当前figurecolormap,而image CDataMapping属性则控制了colormap的查表方式:
u
如果CDataMapping'direct',则CData值直接作为查表索引
u
如果它的值是'scaled',则CData按比例查表。
对于truecolor图像,CDataMapping的值不影响图形显示。


Image Object:Cdata Class


如果图像是truecolor,则CData阵的类型(unit8,unit16或者double)决定了那一个值显示为白色。如果CData classdouble,则[1 1 1]显示为白色。如果classunit8,则[255 255 255]显示为白色。如果classunit16,则[65535 65535 63355]显示为白色。[ 0 0 0]均显示为黑色。
如果图像是索引方式,则CDataclass影响索引操作。double,则1代表第一个colormap颜色;unit8或者unit16,则0代表第一个colormap颜色。


Axes Object:CLim

如果CData是两维的且CDataMapping'scaled',则CLim属性的向量决定了比例方式。第一个元素值对应colormap的第一个颜色,第二个元素值对应colormap最后一个颜色。
对于truecolor图像,或者CDataMapping属性为'direct',则CLim对图像颜色没有影响。


Figure Object:Colormap

如果CData是二维的,则所有显示的像素颜色均来自figureColormap
对于truecolor图像,此属性没影响。


Transparency Properties透明度属性

如果figure AlphaMpaimage AlphaData或者是image AlphaDataMapping属性都设置为nondefault,则一些像素可能被带透明的显示。

posted @ 2012-11-01 15:53  muyuhu  阅读(2642)  评论(0编辑  收藏  举报