【中文转述】
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图形,使上面的两个像素为红和蓝色,下面的两个像素为黄色和灰色。
首先,构造3个2-2的矩阵来代表每一个颜色成分。
- red = [1 0; 1 0.7]
- green = [0 0; 1 0.7]
- blue = [0 1; 0 0.7]
然后,使用cat函数来将这些颜色成分矩阵在第三维上拼合起来。
- truecolor_image = cat(3, red, green, blue);
最后,使用image函数显示图形:
- image(truecolor_image)
- axis equal % Display the image using square pixels
可以看到,矩阵值直接指定了每一个像素的颜色。通过这种表达方式你可以很大程度上控制颜色显示,但是对于工程应用来说它并不是最适合的一种图形格式。
Indexed images索引图像
在索引图像里,颜色矩阵的值并不直接决定颜色像素。MATLAB将矩阵值作为索引在图像的colormap中进行颜色查表。比如,在MATLAB文件clown.mat中包含一下索引图形:
- load clown %可以在你的matlab中直接输入这个命令
- 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)的值:
- X (5, 5)
ans =
61
这个值作为colormap的行索引值:
- map (61, :)
ans =
0.9961 0.5781 0.1250
由此看到,像素(5,5)处的颜色是由‘很多红色',‘一些绿色’和‘一点点蓝色’构成。
使用两个MATLAB命令显示这幅图,一个用来显示图形同时另一个用来指定图像的colormap。
- image(X)
- colormap(map)
- colormap(cool)
与truecolor图像不同的是,indexed图像的显示因使用不同的colormap而不同。
索引图像在15年前很常用,当时大部分颜色图形设备最多只能同时显示256种颜色。而现在可以使用不同颜色比例来显示数据。因为索引图像的值必须是整数,所以比例索引图像就具有更多灵活性。(这段需修正,不过感觉作用不大,不管它了)
Scaled indexed images比例索引图像
和一般的索引图像类似,比例索引图像也使用矩阵值在图像的colormap中进行查表。而不同之处在于,将矩阵值进行线性缩放后,再作为查表索引值。
比如,现在使用image命令来显示一个小的magic阵接着将它与imagese来对比。
- 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
使用image和255-color的grayscale colormap来显示A)
- image(A)
- colormap(gray(256))
- axis equal
可以看到显示出的图像非常暗。那是因为A矩阵的元素都在1到25之间,所以图像只使用了grayscale colormap中的最开始的25种颜色来表示图形——均为暗黑色。
对比使用imagesc命令的图形:
- imagesc(A)
- colormap(gray(256))
- axis equal
imagesc将A中的最小值1显示为colormap色系中的第一个,黑色;将A中的最大值25,显示为colormap色系中的最后一个,白色。其他的所有1到25之间的值则按此线性比例使用colormap中的对应颜色。比如,12则使用colormap中的第118种颜色,中灰色。
如果你换了一种colormap,这A中的值则根据新的colormap重新按比例显示。
- colormap(jet)
你也可以通过乘以底层图像句柄属性来获得这个比例。如果是在MATLAB里开发GUI程序,你经常需要使用底层函数和属性来替代类设于imagesc这样的命令。现在来看两种与图像颜色显示有关的图形句柄属性。
图形对象有一个属性叫做CDataMappling
- h = image(A);
- get(h, 'CDataMapping')
ans =
direct
你可以看到这个属性的默认值为'direct'。这表示A的值直接被用作colormap的索引值。它的值也可以为'scaled',当你使用imagesc时则为这个值。
- h = imagesc(A);
- get(h, 'CDataMapping')
ans =
scaled
比例的最大最小值由axes的CLim(color limits)属性控制。
- h = imagesc(A);
- get(gca, 'CLim')
ans =
1 25
默认情况下,imagesc会将A的最大最小值赋给CLim。你也可以指定你自己的颜色界限,通过添加imagesc函数输入参数。
- imagesc(A, [10 15])
- colormap(gray)
- axis equal
这次,imagesc将10(以及小于10)显示为黑色。类似地,它将15(以及大于15)的值显示为白色。介于10和15的值则显示为相应灰度。
比例图形在图像处理的工程应用中非常重要,因为在这里感兴趣的并不是‘图形’而是带物理单位的度量值矩阵,与光照强度无关,比如说USGS中的高度尺寸。
Grayscale images灰度比例图形
灰度比例图形只包括亮度信息,它是使用grayscale colormap的比例索引图形。如果你将一个二维矩阵的作为参数传递给图像处理工具箱显示函数,imtool和imshow,这这些函数会自动的使用grayscale colormap来显示这些图形。(image和imagesc函数则使用fugure当前的colormap)。
- theta = linspace(0, 2*pi, 256);
- I = repmat((-cos(2*theta) + 1)/2, [256 1]);
- h = imshow(I); % Save the handle for use below.
imshow会自动的为以下参数赋值:
- get(h, 'CDataMapping')
ans =
scaled
对于一个floating-point图形,图像处理工具箱约定将0显示为黑色,1显示为白色。
- get(gca, 'CLim')
ans =
0 1
工具箱会自动使用grayscale colormap
- map = get(gcf, 'Colormap');
- 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
工具箱里的imshow和imtool也可以不使用既定的显示范围而自定义黑和白的值。就像imagesc命令一样,添加一个表示黑和白值的2元素向量的输入参数,如下。0.4及以下表示为黑色,0.6及以上表示为白色。
- imshow(I, [0.4 0.6])
灰度比例图形经常用于图像处理算法,直接操作相对亮度值而非颜色。他们也常用于印刷中(略)。
Binary images二进制图形
二进制图形只包括黑色和白色。图像分割算法的输出通常都是二进制图形,黑色像素代表感兴趣的对象而白色像素代表背景。
图像处理工具箱函数将逻辑矩阵视为一个二进制图形。逻辑矩阵只包括0(显示为黑色)和1(显示为白色)。
- bw = imread('text.png');
- islogical(bw)
ans =
1
- h = imshow(bw);
二进制图形有时用于文字或者线条。它也用做于图像处理中的封装。一个图形封装将像素分为两类。一类,白色像素,包括感兴趣的位置。比如,表示被删除的对象。而另一类则指示背景位置。
控制像素颜色的图像属性句柄
Image Object: Cdata and Dimensionality
Ø
如果CData是一个三维矩阵,而第三维的大小为3,这CData值认为是RGB值。
Ø
如果CData是一个二维矩阵,则image显示的颜色对应于当前figure的colormap。MATLAB使用CData的值(direct直接或者比例scaled)作为colormap的查表索引。
Image Object:CDataMapping
如果CData是一个二维矩阵,则image显示的颜色对应于当前figure的colormap,而image CDataMapping属性则控制了colormap的查表方式:
u
如果CDataMapping是'direct',则CData值直接作为查表索引
u
如果它的值是'scaled',则CData按比例查表。
对于truecolor图像,CDataMapping的值不影响图形显示。
Image Object:Cdata Class
如果图像是truecolor,则CData阵的类型(unit8,unit16或者double)决定了那一个值显示为白色。如果CData class是double,则[1 1 1]显示为白色。如果class是unit8,则[255 255 255]显示为白色。如果class是unit16,则[65535 65535 63355]显示为白色。[ 0 0 0]均显示为黑色。
如果图像是索引方式,则CData的class影响索引操作。double,则1代表第一个colormap颜色;unit8或者unit16,则0代表第一个colormap颜色。
Axes Object:CLim
如果CData是两维的且CDataMapping是'scaled',则CLim属性的向量决定了比例方式。第一个元素值对应colormap的第一个颜色,第二个元素值对应colormap最后一个颜色。
对于truecolor图像,或者CDataMapping属性为'direct',则CLim对图像颜色没有影响。
Figure Object:Colormap
如果CData是二维的,则所有显示的像素颜色均来自figure的Colormap。
对于truecolor图像,此属性没影响。
Transparency Properties透明度属性
如果figure AlphaMpa、image AlphaData或者是image AlphaDataMapping属性都设置为nondefault,则一些像素可能被带透明的显示。