您的位置:首页 > 编程语言 > MATLAB

MATLAB学习笔记(十二)

2015-07-10 18:14 465 查看

本章将学习MATLAB高级绘图的知识,将熟悉以下内容:

1.掌握MATLAB如何处理三种不同类型的图形文件。

2.使用句柄图形制定绘图的句柄并调整特性。

3.通过MATLAB两种技术的任意一种创建动画。

4.调节光源参数,照相机位置和透明值。

5.对三维标量和矢量信息使用可视化方法。

一.图像

通过检验函数image和imagesc对图形的处理过程,可以了解MATLAB的高级绘图功能。因为MATLAB是一个矩阵运算程序,所以它将图像存储为矩阵。

创建函数peaks的三维曲面图:

>> surf(peaks)


函数peaks是MATLAB的内置函数,用来描述图形功能。图形标题和坐标轴标注按一般方式添加。



利用交互式图形操作工具可以操作已经创建的图形,可以得到从顶向下看的图形效果。或者使用伪色图

>> pcolor(peaks)


效果如下图所示:



通过指定阴影选项,可以将自动绘制的网格线删除:

>> shading flat




当图像存储于矩阵中时,通常从图像的左上角开始,由左向右,由上而下来表示数据,在MATLAB中有两个函数采用这种格式显示图像,它们分别是image和imagesc。尺度图像函数(imagesc)使用完全色图表示数据,该函数类似于伪色图,绘制结果同上图:

>> imagesc(peaks)


注意,与伪色图相比,图像是可以翻转的。在许多图形应用中,如何表示数据并不重要,关键是理解所使用的转换方法,很明显,一幅图片被垂直堆成反转是不可接受的表示法。

1.图像类型

MATLAB可以识别三种不同的存储和表示图像的技术

亮度或灰度图像

索引图像

RGB或真彩色图像

两个函数用于显示图像,即imagesc和image。

(1)亮度图像

利用尺度图像函数imagesc可以将山峰函数表示为灰度图像,在这种表示方法中,图像的色彩取决于色图。对存储于图像矩阵中的数值进行标度,并将其与一副已知的图进行相关联,图 jet color map是默认的方式。当显示的参数与实际色彩不相关时,这种方法具有良好的运行效果。例如,函数peaks 通常用于比较山峰和山谷的范围,但是用红色表示海拔高度并不明确,从美学的角度看,这是可以随意选择的。色图也可以提高图像中感兴趣的特征。

例如:传统的X光图像是胶片曝光后的结果,现如今许多X光图像不再使用胶片,而是被处理为数字图像,并存储在数据文件中。因为X光图像的亮度与颜色无关,所以,根据需要可随意对文件进行操作。

MATLAB中包含一个示例文件,是一张数字化的脊椎X光胶片图像,该图像适用于尺度图像函数显示。下载文件:

>> load spine


该文件中包含许多矩阵,灰度矩阵被命名为x,表示为:

>> imagesc(X)


该函数所产生的图形的颜色取决于当前的colormap,其默认状态为 jet。如果使用色图bone,那么,这幅图像看起来更像是传统的X光图片。

>> colormap(bone)




脊椎图像文件同样包含一副与色图bone一致的定制色图,该数组被命名为map。对于灰度图像的显示,色图不是必须的,并且

>> colormap(map)


也可以产生相同的结果图像。

虽然通常把图像数据视为矩阵,但这些数据并不一定要用标准的图形格式存储。MATLAB中包含一个函数imfinfo,它能够读出标准图形文件的数据,并确定文件中包含的数据类型。例如:

>> info = imfinfo('ngc6543a.jpg')

info =

Filename: 'D:\Program Files\MATLAB\R2014a\toolbox\matlab\demos\ngc6543a.jpg'
FileModDate: '02-Oct-1996 00:19:44'
FileSize: 27387
Format: 'jpg'
FormatVersion: ''
Width: 600
Height: 650
BitDepth: 24
ColorType: 'truecolor'
FormatSignature: ''
NumberOfSamples: 3
CodingMethod: 'Huffman'
CodingProcess: 'Sequential'
Comment: {'CREATOR: XV Version 3.00b  Rev: 6/15/94  Quality = 75, Smoothing = 0
'}


为了从这个文件中创建MATLAB矩阵,利用图像读取函数imread,并给结果赋予变量名x;

>> x = imread('ngc6543a.jpg');


然后,利用函数imagesc和色图gray绘制图像:

>> imagesc(x)
>> colormap(gray)




(2)索引图像

当图像的颜色很重要时,创建图像的技术称为索引图像。此时,矩阵不再是亮度值的列表,而是颜色的列表。所创建的图像更像是一幅由数字标出各区域颜色的图画。每元素包含一个与颜色对应的数字。颜色列表在另一个称为色图的n*3矩阵中。他定义n中不同的颜色,每种颜色用红,绿,蓝三原色来表示。每一幅图像有自己的定制色图,也可以使用内置的色图。

考虑一个内置的与狒狒有关的样本图像,利用下面的命令获得:

>> load mandrill


文件包含索引矩阵X和色图map。函数image用于显示索引图像:

>> image(X)


即,没有应用定制色图的狒狒图像,如下图:



应用定制色图的索引图像:

>> image(X)
>> colormap(map)




MATLAB图像填满整个窗口显示,所以图像看上去有些扭曲,利用命令axis可以强制按照正常的比例显示。

>> axis image


函数image 和 imagesc类似,然后他们会给出不同的结果。在亮度图像中,色图grey与存储的色彩并不对应,其结果是图像看上去被水洗过,对比度较差。确定被显示图像的文件类型非常重要,这有助于选择最佳的图像显示方式。

索引图像通常以GIF图片格式保存,但是,当使用函数imfinfo指定了文件参数后,文件格式就不会是这样。

MATLAB 内置了很多图像,每幅图像文件都会创建一个索引值矩阵X和一个色图矩阵map。若要看地球图像,则输入:

>> load earth
>> image(X) >> colormap(map)




(3)真彩色(RGB)图像

第三种图像存储技术是将图像数据存储于m*m*3的三维矩阵中。三维矩阵包含行,列和页等三部分。真彩色图像文件包含三个页,每个页对应红,绿,蓝中的一种颜色亮度。

考虑文件 airplanes.jpg ,用户可以将这个文件或其他类似文件(彩色.jpg图像)复制到当前目录中,并用真彩色图像对其进行验证。利用函数imfinfo确定飞机文件如何存储为图像的:

>> imfinfo('airplanes.jpg')


可以看出颜色类型是 ‘truecolor’,表明每种色彩强度的样本页数是3.

利用函数 imread 下载图像, 并用函数 image 显示:

X = imread('airplanes.jpg');
image(X)
axis image
axis off


在工作窗口中,x是一个 1200*1800*3 的矩阵,每种颜色对应矩阵的一页。因为色彩强度信息已经包含在矩阵x中,所以不需要下载色图。

2.读写图像文件

将图像信息读入MATLAB的最简单方法可能是利用交互式工具,在当前目录窗口中,只要双击要输入的图像文件名即可。MATLAB会给出适当的变量名,并允许矩阵在编辑窗口中预览。

交互式输入数据的问题在于不能提供MATLAB程序的指令,需要使用输入函数。对于大多数标准图像格式而言,函数imread是比较方便的方法。如果文件是mat或者dat的格式,那么调用函数load是最简单的输入数据方法:

>> load cape
>> image(X)




>> colormap(map)




MATLAB图像的保存方法与一般图形文件的保存方法相同。如果要保存类似曼德尔布罗特集图像,可以指定一个增强型图文原件(.emf)。

函数imwrite 也可以对文件进行保存。根据需要保存的数据类型,这个函数可以接受多种不同的输入。

如果输入数据是强度(灰度)数组或者真彩色数组,那么,函数imwrite希望的输入格式为:

arrayname 是MATLAB 数组名称;

filename 是保存数据的文件名称;

format 是文件扩展名, 例如 jpg 和 tif。

因此,如果保存RGB图像到一个名为flowers的 .jpg 文件中,则命令语句为:

>> imwrite(X,'flowers.jpg')


存储索引图像(具有定制色的图像)需要同时保存数据矩阵和色图:

>> imwrite(arrayname, colormap_name, 'filename.format')


存储曼德尔布罗特图像需要保存矩阵和用于选择图像颜色和色图:

>> imwrite(map,jet,'my_mandebrot.jpg')


二.句柄图形

句柄是分配给MATLAB对象的昵称,对MATLAB中使用的图形系统进行完全描述是一件非常复杂的工作,已经超出了叙述的范围,可以参考Help指南。

不论在命令窗口,还是在M文件,使用函数plot之后,MATLAB自动创建一个图形和一个恰当的坐标,然后,在坐标上绘制图形。MATLAB 对许多绘图对象的特性使用默认值。

1.绘图的句柄

为一个绘图分配一个名称(称为句柄)可以简单方便的查询MATLAB列出的绘图对象特性:

首先绘制简单图像,并给他分配一个句柄:

>> x = 1:10;
>> y = x .* 1.5;
>> h = plot(x,y);




其中变量h是绘图的句柄,当然也可以选择其他的变量名,利用函数get查询绘图的特性:

get(h)
DisplayName: ''
Annotation: [1x1 hg.Annotation]
Color: [0 0 1]
LineStyle: '-'
LineWidth: 0.5000
Marker: 'none'
MarkerSize: 6
MarkerEdgeColor: 'auto'
MarkerFaceColor: 'none'
XData: [1 2 3 4 5 6 7 8 9 10]
YData: [1.5000 3 4.5000 6 7.5000 9 10.5000 12 13.5000 15]
ZData: [1x0 double]
BeingDeleted: 'off'


颜色列表特性是【0 0 1】,颜色被描述为光线的每一种基本颜色:红、绿、蓝。数组【0 0 1】表示指定颜色没有红色和绿色,而是100%的蓝色。

2.图形的句柄

为了操作方便,同样需要对图形指定句柄。因为前面用来绘图的图形窗口名称为figure1,所以命令行为:

>> f_handel = figure(1)
f_handel =
1


使用命令get返回相似的结果:

get(f_handel)
Alphamap = [ (1 by 64) double array]
CloseRequestFcn = closereq
Color = [0.8 0.8 0.8]
Colormap = [ (64 by 3) double array]
CurrentAxes = [173.002]
CurrentCharacter =
CurrentObject = []
CurrentPoint = [0 0]
DockControls = on
FileName =
IntegerHandle = on
InvertHardcopy = on


可以看出,图形窗口的特性列表与绘图曲线的特性列表是不相同的。例如颜色是【0.8 0.8 0.8】,它指定了红、绿、蓝具有相同的强度,当然,其结果是一个白色背景。

如果没有图形指定句柄,则可以使用命令 gcf (取得当前图形)查询MATLAB,以确定当前图形的句柄名称。

>> get(gcf)
Alphamap = [ (1 by 64) double array]
CloseRequestFcn = closereq
Color = [0.8 0.8 0.8]
Colormap = [ (64 by 3) double array]
CurrentAxes = [173.002]
CurrentCharacter =


3.坐标的句柄

与图形和绘图的句柄一样,通过函数gca(取得当前坐标)可以指定一个坐标的句柄

>> h_axis = gca;
>> get(h_axis)
ActivePositionProperty = outerposition
ALim = [0 1]
ALimMode = auto
AmbientLightColor = [1 1 1]


4.注释坐标

除了上面描述的三种组件外,还有一个叠加在绘图中的透明层。该层用来插入一些注释对象到图形窗口中,例如线形,图例说明和文本框。

5.使用句柄操作图形

利用函数set可以改变对象的特性,函数set的第一个输入时对象句柄,然后用不同的字符串指定特性的名称,紧跟其后的是一个新的特征值。

>> set(h,'color','red')




MATLAB去寻找名为h的绘图(不是图形,而是实际绘制的曲线),并将颜色改变为红色。如果要改变某些图形窗口的特性,则使用图形句柄名称或者使用函数gcd,方法相同。使用下面的命令行可以改变figure1的名称。

>> set(f_handle,'name','My_graph')


或者:

>> set(gcf,'name','My_graph')


效果如下图所示:



三.动画

在MATLAB中有两种创建动画的技术:

重绘和擦除

创建电影

在每种情况下都可以使用句柄图形来创建动画。

1. 重绘和擦除

通过重绘和擦除创建动画,首先创建一个绘图,然后调整绘图的特性,每次调整都是一个循环,用下面的方程定义一簇抛物线:

y = kx² - 2

每个k值定义一条抛物线,可以通过三维绘图来描述数据,也可以采用其他办法,例如,创建一系列绘制系列图形的动画,每次使用不同的k值。创建动画的代码为:

clear,clc,clf
x = -10:0.01:10;
k = -1;
y = k * x .^ 2 - 2;
h = plot(x,y);
grid on
%set(h,'EraseMode','xor')

axis([-10,10,-100,100])
while k<1
k = k + 0.01;
y = k * x.^2 - 2;
set(h,'XData',x,'YData',y)
drawnow
end


在这个例子中,利用句柄图形对图进行重画,每次重画没有创建新的图形窗口,而是循环绘图。绘图对象为XData和YData,这些对象指定要绘图的数据点。使用函数 set 设定新的 x 值和 y 值,并在每次调用函数 drawnow 时创建一幅不同的话。从程序产生的动画画面中挑选几幅示于图中。

注意注释行:

%set(h,'EraseMode','xor')


如果去掉该行的注释运算符,使这一行激活,那么,每次重画时程序不会擦除以前画过的内容,只改变颜色不同的像素点。这样可以提高动画的绘制效率,特别是绘制复杂图形时,这个特性尤为重要。

2.电影

使线条运动起来并不是从计算上改变高度,而是采用简单易行的方法得到漂亮、平滑的运动线条。下面的程序实现复杂曲面的动画效果:

clear,clc
x = 0:pi/100:pi;
y = x;
[X,Y] = meshgrid(x,y);
z = 3 * sin(X) + cos(Y);
h = surf(z);
axis tight
set(gca,'nextplot','replacechildren');
shading interp
colormap(jet)
for k = 0:pi/100:2*pi
z = (sin(X) + cos(Y)).*sin(k);
set(h,'Zdata',z)
drawnow
end


如果计算机的运算速度很快,那么动画效果可能会更平滑。然而,如果计算机的运算速度很慢,那么当程序创建每个新的图形时,会出现生涩的移动和暂停。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: