|
MATLAB像素颜色的表达方式
|
这些像素值表示什么颜色?如果你很熟悉图像处理,那你应该知道255表示白色,所以上面这些数字表示白色或者接近白色的颜色。但是实际上,这些数字并不是来自一张图片。这些数字是波士顿地区的海拔高度,从U.S. Geological Survey (USGS) 。255是一个以米为单位的测量值,并不是颜色。
MATLAB可以将任何矩阵以图片的形式显示出来。比如,根据你使用命令的不同,MATLAB可以将数字海拔高度数据显示为如下的图。
将矩阵按照各种方式显示为图形,可以跟直观的了解你的数据。通过理解不同的图形类型,你可以知道MATLAB是如何将矩阵值转化为像素值的。你可以控制MATLAB对数据的显示方式,纠正有可能出错的图形。
图形类型
一种图像类型即代表了一种从矩阵值到像素值的映射方式。MATLAB有三种基本的图像类型:
Truecolor ——数码相机,广泛用于计算机图形。
Indexed和scaled indexed ——经常用来显示科学或者工程数据,关联的颜色比例代表数据单位?。
Image Processing Toolbox 可以识别另外两种类型:
Grayscale ——经常用在图像处理和图像分析算法中
Binary ——经常用做为一个封装来表示图形的分割结果或者是感兴趣的区域。
Truecolor Images
在这种格式的图里,每一个图形像素由三个数字表示:红,绿,蓝,整个图形在MATLAB里由一个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
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的值(直接或者比例)作为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,则一些像素可能被带透明的显示。
Copyright ©2011-2014 bbs.06climate.com All Rights Reserved. Powered by Discuz! (京ICP-10201084)
本站信息均由会员发表,不代表气象家园立场,禁止在本站发表与国家法律相抵触言论