今天的推文,我们主要来介绍matlab中几种绘制动态图像的方法。首先,以之前介绍过的心形图为例,来说明在matlab中如何将绘图过程保存为gif动态图像。

1. Matlab绘制GIF图像

Step1:生成三维心形线坐标,三维空间下的心形线方程为:为了求解满足该方程所有点坐标,首先定义了在xyz坐标轴上[-3,3]范围内分别取101个点,用meshgrid得到101*101*101的三维网格点数据,计算每个网格点上函数的取值val,所有val为0的点即为心形线坐标点。Step2:在YOZ平行平面上绘制心形线,令X取定值,提取该平面上所有val取值为0的网格点(Y,Z)坐标,绘制心形线。在这里,提取val为0的点,通过提取等值线来实现,(Y,Z)=contourc(val(:,X,:),[0,0]),具体这部分matlab代码为:

for X = 35:67    %提取不同X取值下,与YOZ平行的平面上,f(y,z)取值    plane = reshape(val(:,X,:),101,101);    %提取val为0的等值线,即满足f(y,z)=0的坐标点    c_data = contourc(plane,[0,0]);    x_data = X*ones(1,c_data(2,1));    %绘制在YOZ平行平面上的心形线    plot3(x_data,c_data(2,2:end),c_data(1,2:end),'r');    axis([30,80,30,80,30,80])axis offEnd

Step3:将图像保存为gif文件,在matlab可以使用imwrite将图像保存为gif,但需要将图像数据保存为索引图像。其中,保存第一张图像时,需要创建gif文件,之后的图像全部采用append的方式进行添加即可。保存gif文件的基本框架为:

pic_index = 1;%记录图像编号for i = 1:end    plot(data(i));    %抓取当前的figure,保存为rgb图像后,再转化为索引图像    [A,map] = rgb2ind(frame2im(getframe),256);    if pic_index == 1      imwrite(A,map,'test.gif','gif','Loopcount',inf,'DelayTime',0.2);    else      imwrite(A,map,'test.gif','gif','WriteMode','append','DelayTime',0.2);    end    pic_index = pic_index + 1;end

其中,getframe是为了抓取当前绘制的图像,frame2im函数将当前图形保存为rgb图像,rgb2ind函数将rgb图像保存为索引图像。所谓索引图像是指一个数据矩阵A,一个颜色映像矩阵Map。其中Map是一个包含三列、若干行的数据阵列,其中每个元素的值均为[0, 1]之间的双精度浮点型数据。Map矩阵的每一行分别表示红色、绿色和蓝色的颜色值。在MATLAB中,索引图像是从像素值到颜色映射表值的“直接映射”。像素颜色由数据矩阵X作为索引指向矩阵Map进行索引,例如,值1指向矩阵Map中的第一行,值2指向第二行,以此类推。索引图像的使用解决了图像数据矩阵消耗内存过大的问题,rgb图像需要一个三维数据矩阵才可以表示,索引图像只需要一维数据矩阵和一个map就可以表示了。Setp4:同理,绘制XOY平行平面和XOZ平面的心形线,并继续保存到gif文件中即可。完整代码在公众号后台回复“动态心形线”即可获取。

2. Matlab创建动画线条

我们在绘制动态图像的目的一般是为了展示图像的绘制过程,或者是为了在串行获取数据时,实时展示图像。为了实现实时绘图的动画,我们需要借助于matlab中的animatedline函数(注意:这是matlab在2014a版本之后才才更新的一个函数,2014a包括2014a之前版本的matlab都不能实现这个功能)。

  • an = animatedline 创建一根没有任何数据的动画线条并将其添加到当前坐标区中;

  • an = animatedline(x,y) 创建一根包含由 x 和 y 定义的初始数据点的动画线条;

  • an = animatedline(x,y,z) 创建一根包含由 x、y 和 z 定义的初始数据点的三维动画线条;

  • an = animatedline(___,Name,Value) 使用一个或多个名称-值对组参数指定动画线条属性。例如,'Color','r' 将线条颜色设置为红色。

当然,animatedline创建了一个动画线条,为了让这个线条动起来,我们需要给它继续添加坐标点,这里就需要用到addpoints函数。

  • addpoints(an,x,y) 向动画线条an中,添加二维点;

  • addpoints(an,x,y,z) 向动画线条an中,添加三维点。

由此,我们写一下,实现动态线条的基本框架:

h = animatedline('Color','r','LineWidth',3);for k = 1:length(x)    addpoints(h,x(k),y(k));  end

基于这两个函数,就可以完成上图的动态绘图效果了,结合第一节中介绍的gif文件保存方式,我们还可以将绘图过程输出为gif文件。

t = 0:0.1:2*pi;x = 16*(sin(t)).^3;y = 13*cos(t)-5*cos(2*t)-2*cos(3*t)-cos(4*t);axis off;set(gcf,'color',[1 1 1]);[A,map] = rgb2ind(frame2im(getframe),256);imwrite(A,map,'xin2.gif','LoopCount',65535,'DelayTime',0.1);h = animatedline('Color','r','LineWidth',3);for k = 1:length(x)    addpoints(h,x(k),y(k));    axis([-20,20,-20,20])    [A,map] = rgb2ind(frame2im(getframe),256);    imwrite(A,map,'xin2.gif','WriteMode','append','DelayTime',0.1);end

3. Matlab动画循环播放

Movie函数可以实现电影动画,一次运行结果可以保存起来进行多次播放,同时可以生成avi视频文件,独立于matlab进行使用。在进行movie函数创建动画之前,需要用moviein函数保存绘制的图形数据,创建一个足够大的矩阵,使之能够容纳基于当前绘制的图形(此处称为帧)。当创建了一系列的动画帧后,可以利用movie函数按照指定的速度和次数运行该电影动画。movie函数的调用格式为:

  • movie(M) 将矩阵M中的动画帧播放一次;

  • movie(M,n) 将矩阵M中的动画帧播放n次;

  • movie(M,n,fps) 将矩阵M中的动画帧以每秒fps帧的速度播放n次。

接下来,我们以三维曲面的动态变化为例,展示一下movie函数效果。

x = -6:0.1:6;y = -6:0.1:6;[X,Y] = meshgrid(x,y);r = sqrt(X.^2 + Y.^2);Z = sin(r)./(r + eps);p = surf(X,Y,Z);set(p,'LineStyle','None');axis([-6,6,-6,6,-1,1])%axis off%theAxes = axis;M = moviein(20);filename = '动画.gif';for j = 0.1:0.1:10    p = surf(X,Y,sin(j*pi)*Z);    axis([-6,6,-6,6,-1,1])    axis off;    set(p,'LineStyle','None');    M(:,end+1) = getframe;    %输出为gif    [A,map] = rgb2ind(frame2im(getframe),256);    if j == 0.1        imwrite(A,map,filename,'gif', 'Loopcount',inf,'DelayTime',0.1);    else        imwrite(A,map,filename,'gif','WriteMode','append','DelayTime',0.1);    endend%循环2两次显示动画movie(M,2)

本文介绍了几种关于matlab绘制动画的基本函数,在这些基本的函数基础上,可以结合图像处理技术还可以做出更多丰富的动画特效,这些内容可以在之后的推文中慢慢了解。

antd tree 动态添加_一文了解Matlab如何制作动态图像相关推荐

  1. php动态添加查询,php动态添加url查询参数的方法,php动态url参数_PHP教程

    php动态添加url查询参数的方法,php动态url参数 本文实例讲述了php动态添加url查询参数的方法.分享给大家供大家参考.具体分析如下: 这段代码可以动态为url添加key-value查询参数 ...

  2. vegas可以做动画吗_Sony Vegas怎么为字幕制作动态运动效果?Sony Vegas为字幕制作动态运动效果的方法步骤...

    Sony Vegas怎么为字幕制作动态运动效果?最近有小伙伴向我询问想用Sony Vegas制作动态运动效果的字幕不知道如何操作,那么今天小编就给大家带来Sony Vegas为字幕制作动态运动效果的操 ...

  3. javacv开发详解之19:如何使用批量的多张图片制作apng动态图,再也不用担心不会制作动态图了

    javacv实战专栏目录: JavaCV实战专栏文章目录(JavaCV速查手册) 前言 前面写过视频.桌面屏幕录制apng和gif动态图,虽然已经满足大部分情况,但是没考虑到现在很多动态图都是使用多张 ...

  4. javacv开发详解之11补充篇:使用批量多张图片制作gif动态图,再也不用担心不会制作动态图了

    javacv实战专栏目录: JavaCV实战专栏文章目录(JavaCV速查手册) 前言 前面写过视频.桌面屏幕录制apng和gif动态图,虽然已经满足大部分情况,但是没考虑到现在很多动态图都是使用多张 ...

  5. antd tree 动态添加_动态壁纸设置教程

    点击上方蓝色字体,关注我们 ☾ 每天8:30 请记得打开手机,查收我的礼物你点的每一个赞 方法一 很多小伙伴下载完原视频后不知道怎么设置 动态壁纸设置 这里有一个最简单的 [手机动态壁纸设置方法] 主 ...

  6. antd tree 动态添加_推荐三款动态壁纸软件,足够让你的桌面惊艳!

    点击上方"码农的后花园",选择"星标" 公众号 精选文章,第一时间送达今天给大家推荐三款动态壁纸软件,给你的桌面添加一点精彩,心情也更美呢 ~ 1,WinDyn ...

  7. c++ 传入动态参数_一文了解Mybatis中动态SQL的实现

    一.动态SQL简介 MyBatis的强大特性之一便是它的动态 SQL.如果你有使用 JDBC 或其他类似框架的经验,你就能体会到根据不同条件拼接 SQL 语句有多么痛苦.拼接的时候要确保不能忘了必要的 ...

  8. python列表动态添加_在Python中动态创建列表

    我有一堆与不同组关联的项,我最终想为每个组创建一个列表,其中包含所有关联项.在 问题是我不知道有多少组,所以如何动态生成正确数量的列表,以及如何调用它们?在 我在循环item_list和group_l ...

  9. iphone主屏幕动态壁纸_灵动优美的iphone高清动态锁屏壁纸

    看惯了千篇一律的静态壁纸,厌烦了自带的动态壁纸,不妨来试试小编给大家精心挑选的几款Live Photos,除了惊艳还是惊艳^_^ 先来几个样张: 大家不要直接将这两张图用作设置为锁屏壁纸,这样就没有原 ...

最新文章

  1. 任正非最新讲话透露:华为在加快开发统一的人工智能平台
  2. 快速排序与合并排序的分而治之
  3. sql limit子句_SQL子句解释的位置:之间,之间,类似和其他示例
  4. 计算机键盘正确指法操作方法,“认识键盘与正确的指法输入”教案
  5. C语言中利用switch语句和 if--else 语句输出,,闰年或平年,及每月对应的天数。
  6. JVM 运行机制及基本原理
  7. 产生式模型和判别式模型
  8. SAP License:MM中的几个概念
  9. PAT甲题题解-1124. Raffle for Weibo Followers-模拟,水题
  10. 数据库系统概论总结(第五版)
  11. 鼠标右键中没有新建选项,解决方法!
  12. 闲谈IPv6-从ICMP的视角形而上地分析IPv6
  13. IBM AIX初级培训总结
  14. mysql的建表赋权_mysql创建用户并赋权
  15. 零伽壹链改研究:供应链金融潜能爆发,解密背后的区块链技术应用!
  16. 翻译app上的图片文字信息提取好神奇?如何实现一个文字图片识别程序
  17. 嵌入式cmp指令的判断标志位_嵌入式开发的基础知识
  18. 回顾2016年存储市场发展 解析产品涨价为何如此逆天
  19. 10月2号陪同学买笔记本的经历
  20. opencv java lean.png_text-lean_opencv VS2015.使用 实现水平面的文本倾斜,调整角度可 矫正。 256万源代码下载- www.pudn.com...

热门文章

  1. 用IIS建立的.net网站通过IP地址不能访问解决方法
  2. 处理get中的中文乱码情况
  3. nodejs fs path
  4. Eclipse Source not found
  5. 步进电机的单双极驱动
  6. 廖雪峰Python学习笔记——类和实例
  7. 关于sizeof表达式作为数组元素个数的编译
  8. 【原创】有关Silverlight中“DataGrid中级联动态绑定父/子ComboBox ”的示例。
  9. Fibonacci 数列
  10. IE8 Beta2 AJAX 的更新篇之XDR(二)(IE8 Beta2 Hand-on Lab-XDR)