图像对象及其属性
图像 CData
注意
image
和 imagesc
命令可用于创建图像对象。图像对象是坐标区对象的子级,线条、补片、曲面和文本对象也是如此。和所有图形对象一样,您可以设置图像对象的许多属性,从而微调该对象在屏幕上的外观。与图像对象的外观相关的最重要的属性有 CData
、CDataMapping
、XData
和 YData
。这些属性将会在这一部分以及下面的部分中加以讨论。有关图像对象的这些以及所有属性的详细信息,请参阅 image
。
图像对象的 CData
属性包含了数据数组。在以下命令中,h
是由 image
创建的图像对象的句柄,而且矩阵 X
和 Y
是相同的:
h = image(X); colormap(map) Y = get(h,'CData');
CData
数组的维数控制图像是使用颜色图颜色还是以 RGB 图像的形式显示。如果 CData
数组是二维的,则图像是索引图像或强度图像;在这两种情况下,图像都使用颜色图颜色进行显示。如果另一方面,CData
数组是 m×n×3,则该数组显示为真彩色图像,而忽略颜色图颜色。
图像 CDataMapping
CDataMapping
属性可用于控制图像是 indexed
还是 intensity
。要显示索引图像,请将 CDataMapping
属性设置为 'direct'
,从而使 CData
数组的值直接用作图窗颜色图的索引。当 image
命令与单个输入参量配合使用时,该命令将 CDataMapping
的值设置为 'direct'
:
h = image(X); colormap(map) get(h,'CDataMapping') ans = direct
通过将 CDataMapping
属性设置为 'scaled'
来显示强度图像。在这种情况下,CData
值经过线性缩放来形成颜色图索引。坐标区的 CLim
属性可用于控制缩放因子。imagesc
函数可创建一个 CDataMapping
属性设置为 'scaled'
的图像对象,而且该函数可调整父坐标区的 CLim
属性。例如:
h = imagesc(I,[0 1]); colormap(map) get(h,'CDataMapping') ans = scaled get(gca,'CLim') ans = [0 1]
XData 和 YData
XData
和 YData
属性可用于控制图像的坐标系。对于 m×n 的图像而言,默认的 XData
是 [1 n]
,而默认的 YData
是 [1 m]
。这些设置表明以下内容:
图像左列的 x 坐标为 1。
图像右列的 x 坐标为 n。
图形顶行的 y 坐标为 1。
图像底行的 y 坐标为 m。
图像的坐标系
使用默认坐标系
使用默认坐标系显示图像。使用 colorcube
图中的颜色。
C = [1 2 3 4; 5 6 7 8; 9 10 11 12]; im = image(C); colormap(colorcube)
指定坐标系
显示图像并指定坐标系。使用 colorcube
图中的颜色。
C = [1 2 3 4; 5 6 7 8; 9 10 11 12]; x = [-1 2]; y = [2 4]; figure image(x,y,C) colormap(colorcube)
在图像数据上添加文本
此示例说明如何使用数组索引将文本光栅化到现有图像。
使用 text
函数在坐标区中绘制文本。随后,使用 getframe
命令从屏幕上捕获文本并关闭图窗。
fig = figure; t = text(.05,.1,'Mandrill Face','FontSize',20,'FontWeight','bold'); F = getframe(gca,[10 10 200 200]); close(fig)
选择由 getframe
返回所得的 RGB 图像的任意平面。找到黑色像素(黑色是 0)并使用 sub2ind
将它们的下标转换为索引。使用这些下标将文本“刷”到 mandrill
MAT 文件所包含的图像中。利用该图像的大小,加上文本的行位置和列位置来确定新图像的位置。对新图像建立索引,取代像素。
c = F.cdata(:,:,1);
[i,j] = find(c==0);
load mandrill
ind = sub2ind(size(X),i,j);
X(ind) = uint8(255);
使用 bone 颜色图显示新图像。
imagesc(X)
colormap bone
快速更新图像的其他技术
要提高图像对象的 CData
属性的更新速度,则优化 CData
并设置一些相关的图窗和坐标区属性:
尽可能使用最小的数据类型。对图像使用
uint8
数据类型比使用double
数据类型更快。设置图像
CData
属性过程包括复制矩阵用于图像。矩阵的总体大小依赖于单个元素的大小。使用更小的单个元素(即更小的数据类型)将会减小矩阵大小,并减少复制矩阵所需的总时间。使用最小可接受的矩阵。
如果图像显示速度处于最高优先级,那么您可能需要牺牲图像的大小和质量。再次强调,减小尺寸会减少复制矩阵所需的时间。
将坐标区的范围模式属性(
XLimMode
和YLimMode
)设置为manual
。如果它们设置为
auto
,则每当有对象(例如图像、线条、补片等)改变了自身的某些数据时,坐标区都必须重新计算相关的属性。例如,如果指定image(firstimage); set(gca, 'xlimmode','manual',... 'ylimmode','manual',... 'zlimmode','manual',... 'climmode','manual',... 'alimmode','manual');
重绘图像前,坐标区并不重新计算任何一个范围值。
如果您的主要任务只是在屏幕上显示一系列图像,则考虑使用
movie
对象。MATLAB®
movie
对象直接利用基本系统图形资源,而不会执行 MATLAB 对象代码。这比重复设置图像的CData
属性更快,如上所述。