MATLAB学习笔记(十二)

原创 2015年07月10日 18:14:23

本章将学习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

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

版权声明:本文为博主原创文章,未经博主允许不得转载。

相关文章推荐

image

image - Display image object   Description image creates an image graphics object by interpreting...

机器学习系列:(三)特征提取与处理

特征提取与处理 上一章案例中的解释变量都是数值,比如匹萨的直接。而很多机器学习问题需要研究的对象可能是分类变量、文字甚至图像。本章,我们介绍提取这些变量特征的方法。这些技术是数据处理的前提...

OpenGL中的抗锯齿功能

     可能读者有注意到了,在有些OpenGL图像中,直线(尤其是接近于水平或垂直的直线)会呈现出锯齿状边缘,这种“锯齿”现象是由于理想的直线是由一系列的像素模拟的,而这些像素又必须位于它们各自的像...
  • smsmn
  • smsmn
  • 2011年05月05日 21:46
  • 1477

Matlab GUI 鼠标事件(二)

WindowButtonDownFcn是MATLAB绘图窗口的一个属性,用以指定响应鼠标按键的回调函数。 如果你是用GUIDE做的界面,就在Figure的Inspector里面找到该属性,按右侧...
  • SMF0504
  • SMF0504
  • 2016年07月11日 19:36
  • 2324

matlab学习笔记(十二)---二值图像及其特征提取

1、二值图像的生成 函数im2bw:把图像转换成二值图像 load trees; BW=im2bw(X,map,0.4); subplot(121),imshow(X,map),title('原图...

JQueryEasyUI学习笔记(十二)源码

  • 2013年04月10日 21:27
  • 731KB
  • 下载

《C++ primer plus》第十一、十二、十三章 学习笔记

一、操作符重载 1.返回引用可以提高效率,但是不能返回指向局部变量或临时变量的引用,因为函数一旦执行完毕,该对象将消失 2.重载限制: (1)重载的操作数中至少有一个是用户自定义的类型 (...

QT之GUI学习笔记(十二)---QMessageBox

QmessageBox一 概述1.QMessageBox用于显示基本的提示信息。 2.QMessageBox有5种类型: information;critical;warning;question...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:MATLAB学习笔记(十二)
举报原因:
原因补充:

(最多只允许输入30个字)