Main Content

图像对象及其属性

图像 CData

注意

imageimagesc 命令可用于创建图像对象。图像对象是坐标区对象的子级,线条、补片、曲面和文本对象也是如此。和所有图形对象一样,您可以设置图像对象的许多属性,从而微调该对象在屏幕上的外观。与图像对象的外观相关的最重要的属性有 CDataCDataMappingXDataYData。这些属性将会在这一部分以及下面的部分中加以讨论。有关图像对象的这些以及所有属性的详细信息,请参阅 image

图像对象的 CData属性包含了数据数组。在以下命令中,h 是由 image 创建的图像对象的句柄,而且矩阵 XY 是相同的:

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

XDataYData 属性可用于控制图像的坐标系。对于 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)

Figure contains an axes object. The axes object contains an object of type image.

指定坐标系

显示图像并指定坐标系。使用 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)

Figure contains an axes object. The axes object contains an object of type image.

在图像数据上添加文本

此示例说明如何使用数组索引将文本光栅化到现有图像。

使用 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

Figure contains an axes object. The axes object contains an object of type image.

快速更新图像的其他技术

要提高图像对象的 CData 属性的更新速度,则优化 CData 并设置一些相关的图窗和坐标区属性:

  • 尽可能使用最小的数据类型。对图像使用 uint8 数据类型比使用 double 数据类型更快。

    设置图像 CData 属性过程包括复制矩阵用于图像。矩阵的总体大小依赖于单个元素的大小。使用更小的单个元素(即更小的数据类型)将会减小矩阵大小,并减少复制矩阵所需的总时间。

  • 使用最小可接受的矩阵。

    如果图像显示速度处于最高优先级,那么您可能需要牺牲图像的大小和质量。再次强调,减小尺寸会减少复制矩阵所需的时间。

  • 将坐标区的范围模式属性(XLimModeYLimMode)设置为 manual

    如果它们设置为 auto,则每当有对象(例如图像、线条、补片等)改变了自身的某些数据时,坐标区都必须重新计算相关的属性。例如,如果指定

    image(firstimage);
    set(gca, 'xlimmode','manual',...
    'ylimmode','manual',...
    'zlimmode','manual',...
    'climmode','manual',...
    'alimmode','manual');
    

    重绘图像前,坐标区并不重新计算任何一个范围值。

  • 如果您的主要任务只是在屏幕上显示一系列图像,则考虑使用 movie 对象。

    MATLAB® movie 对象直接利用基本系统图形资源,而不会执行 MATLAB 对象代码。这比重复设置图像的 CData 属性更快,如上所述。