MATLAB学习笔记(十二)

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

1.掌握MATLAB如何处理三种不同类型的图形文件。
2.使用句柄图形制定绘图的句柄并调整特性。
3.通过MATLAB两种技术的任意一种创建动画。
4.调节光源参数,照相机位置和透明值。
5.对三维标量和矢量信息使用可视化方法。

一.图像

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

  1. 创建函数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

如果计算机的运算速度很快,那么动画效果可能会更平滑。然而,如果计算机的运算速度很慢,那么当程序创建每个新的图形时,会出现生涩的移动和暂停。

  • 0
    点赞
  • 15
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
matlab学习笔记汇总,适合初学者。 1.3Matlab界面介绍(1).docx 1.4Matlab界面介绍(2).docx 1.5Matlab帮助系统.docx 1.6Matlab的搜索顺序及搜索路径.docx 2.1Matlab的变量与常量.docx 2.2Matlab的基本数据结构(1).docx 2.2Matlab的基本数据结构(2).docx 2.3 Matlab的空数组与子数组.docx 2.4 Matlab的算术运算符.docx 2.5 常见的Matlab运算函数(1).docx 2.6 常见的Matlab运算函数(2).docx 2.7 Matlab的字符串及其运算.docx 2.8 字符串函数及二维字符串.docx 2.9 绘图入门.docx 2.10绘图属性的控制.docx 2.11图形窗口菜单及对数坐标.docx 2.12 本章小结.docx 3.1程序编写的一般步骤.docx 3.2关系运算符.docx 3.3逻辑运算符.docx 3.4逻辑函数与短路运算.docx 3.5if语句.docx 3.6流程图的绘制.docx 3.7if语句的嵌套.docx 3.8switch.docx 3.9try_catch结构.docx 3.10多个图像窗口与子窗口.docx 3.11图像的增强控制.docx 3.12文本的高级控制.docx 3.13极坐标图.docx 4.1while循环结构.docx 4.2while循环举例.docx 4.3for循环.docx 4.4for循环举例.docx 4.5break和continue.docx 4.6循环结构嵌套.docx 4.7编译语言与解释语言.docx 4.8逻辑数组与向量化.docx 4.9应用举例.docx 4.10应用举例(2).docx 5.1M文件的分类.docx 5.2自顶向下程序设计.docx 5.3初始Matlab函数.docx 5.4初始Matlab函数(2).docx 5.5函数的局部变量.docx 5.6局部变量与按值传递.docx 5.7函数的选择性参数.docx 5.8函数的检测工具.docx 5.9全局内存与全局变量.docx 5.10持久变量.docx 5.11显示信息的几种方式.docx 5.12排查逻辑错误.docx 5.13排查逻辑错误(2).docx 5.14函数的函数.docx 5.15函数的函数(2).docx 5.16子函数.docx 5.17私有函数.docx 6.1复数数据类型.docx 6.2复数的作图.docx 6.3其他二维作图函数.docx 6.4其他的作图函数.docx 6.5本章举例.docx 9.1多项式.docx 9.2插值与拟合.docx matlab文帮助文档.chm
学习MATLAB时,编写学习笔记是一种很好的方法,可以帮助您记录重要的概念、语法和技巧,以及解决问题的步骤。以下是一些关于编写MATLAB学习笔记的建议: 1. 组织结构:使用清晰的标题和分节来组织您的学习笔记。将不同的主题分成单独的部分,并使用子标题来进一步细分内容。 2. 内容概要:在每个部分或子标题下,写下该主题的概要。这样可以帮助您回顾和理解该主题的关键点。 3. 示例代码和输出:对于每个主题,包括一些示例代码和相应的输出结果。这有助于您理解和演示具体的MATLAB语法和功能。 4. 问题与解答:如果您在学习过程遇到了一些困惑或问题,将其记录下来,并在笔记提出并解答这些问题。这样可以帮助您深入思考并加深对该主题的理解。 5. 笔记补充:除了基本概念和语法外,您还可以添加一些额外的笔记,如最佳实践、编程技巧、常见错误等。这些额外的笔记可以提供更多的实用信息和提示。 6. 参考资料:在您的学习笔记,包括引用的参考资料,如教程、文档、书籍或网站链接。这样,您可以随时回顾并深入研究相关的主题。 7. 总结和复习:在学习笔记的结尾,添加一个总结部分,回顾和总结您学到的重点和关键概念。此外,定期复习您的学习笔记也是加深理解和记忆的好方法。 以上是关于编写MATLAB学习笔记的一些建议。希望这对您有所帮助,并祝您在MATLAB学习过程取得成功!如果有任何其他问题,请随时提问。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值