利用matlab制作光栅动画(莫尔条纹动画)

  • 1原理
  • 2 预期动画准备
  • 3 底片绘制
  • 4 光栅动画

光栅动画是一种利用一种透明光栅在底片上快速移动,使得看起来底片像是运动的一种动画方式。这种动画不依赖于电子媒体以及gif图,只需要一个事先准备好的底片,以及一个印在透明塑料片上的光栅图案,即可体验到动图的效果(当然电子版的ppt也可以)。

本文尝试分析光栅动画的原理,并通过该原理利用matlab编程,实现光栅动画。

1原理

光栅动画的原理,首先用到了心理学中知觉组织的连续性原则与闭合原则,让人利用破碎的信息脑补出一个整体信息,比如下图:

通过破碎的信息,加上光栅的遮挡之后,人们就会自然地想象出下面这个两个齿轮的图。

之后,光栅动画的原理就是将前面破碎的信息依次拼接起来,随着光栅位置的改变,变成不同的图案。将不同光栅位置的不同破碎图案组合在一起,便构成了底片。

所以,一般光栅动画具有单颜色(颜色单一容易脑补),动画周期短(光栅间距减小有利于脑补),动画简单且以粗线条或大块的图块为主(参考闭合原则)。

2 预期动画准备

这里依然以第一节中的双齿轮动画作为演示,展示预期要演示的动画效果。运动周期选择T=6,不建议选太大(当然太小就得不到效果了)。

clear
close all
figure('Color','white')
N=17;
T=6;
for k=1:Tclfdt=2*pi/N/T*k;%第一个齿轮hold onfor j=1:Ntheta=2*pi/N*j;R=1.1;plot([-1,-1+R*cos(theta+dt)],[0,R*sin(theta+dt)],'k','linewidth',5)endrectangle('Position',[-1.9,-0.9,1.8,1.8],'Curvature',1,'LineWidth',8)hold off%第二个齿轮hold onfor j=1:Ntheta=2*pi/N*j;R=1.1;dth=2*pi/N/2;plot([1,1-R*cos(theta+dth+dt)],[0,R*sin(theta+dth+dt)],'k','linewidth',5)endrectangle('Position',[0.1,-0.9,1.8,1.8],'Curvature',1,'LineWidth',8)hold offxlim([-3,3])ylim([-2,2])axis offaxis equalpause(0.2)%绘制动图cdata = print('-RGBImage','-r100'); %保存Figure上的图像frame.cdata=cdata;frame.colormap=[];imind=frame2im(frame);[imind,cm]=rgb2ind(imind,2);if k==1imwrite(imind,cm,'test.gif','gif', 'Loopcount',inf,'DelayTime',0.2);elseimwrite(imind,cm,'test.gif','gif','WriteMode','append','DelayTime',0.2);endend

效果图如下:

3 底片绘制

底片的绘制与动画周期和光栅宽度有关。由于之前设置的动画周期为6,所以底片分6次绘制完成。光栅宽度这里设置为1,也就是每个缝的宽度为1像素。

代码如下:

%绘制底片close all
figure('Color','white')
N=17;
T=6;
for k=1:Tclfdt=2*pi/N/T*k;%第一个齿轮hold onfor j=1:Ntheta=2*pi/N*j;R=1.1;plot([-1,-1+R*cos(theta+dt)],[0,R*sin(theta+dt)],'k','linewidth',5)endrectangle('Position',[-1.9,-0.9,1.8,1.8],'Curvature',1,'LineWidth',8)hold off%第二个齿轮hold onfor j=1:Ntheta=2*pi/N*j;R=1.1;dth=2*pi/N/2;plot([1,1-R*cos(theta+dth+dt)],[0,R*sin(theta+dth+dt)],'k','linewidth',5)endrectangle('Position',[0.1,-0.9,1.8,1.8],'Curvature',1,'LineWidth',8)hold offxlim([-3,3])ylim([-2,2])axis offaxis equalpause(0.2)%绘制底片cdata = print('-RGBImage','-r100');Size_cdata=size(cdata);if k==1cdata_N=cdata;else%每次绘制1个像素,间隔为1*Tcdata_N(:,k:T:Size_cdata(2),:)=cdata(:,k:T:Size_cdata(2),:);endendclf
imshow(cdata_N)%展示底片
save('cdata_N.mat','cdata_N')%保存,待会要用

底片绘制之后的结果如下:

4 光栅动画

之后利用这张光栅底片图(上一节保存成了mat文件),可以制作光栅动画图。

这里我先利用之前的底片,制作一个png格式的透明光栅,保存在PPT里,加上动画播放效果就可以玩了。当然如果能够有条件自己制作光栅的话也可以实际制作。

clear
clcload('cdata_N.mat')
cdata_N=double(cdata_N);
cdata_Z=255+zeros(size(cdata_N));
%绘制光栅
cdata_Z(119:319,120:480,:)=0;
cdata_Z(119:319,120:T:480,:)=255;
imwrite(cdata_Z,'GuangShan.png','Alpha',cdata_Z(:,:,1)/255); %保存透明图像

生成的图片如下:

在matlab里也可以演示其最终效果:

%绘制变形图和光栅叠加的动图
clear
close all
figure('Color','white')
N=17;
T=6;
%处理
load('cdata_N.mat')
cdata_N=double(cdata_N);
Size_cdata=size(cdata_N);
cdata_N=[cdata_N,255*ones(Size_cdata(1),00,Size_cdata(3))];%生成size
Size_cdata=size(cdata_N);k=[1:120,119:-1:2];
for j=1:length(k)t=k(j);cdata_Z=255*ones(Size_cdata);%绘制光栅cdata_Z(119:319,250-t:550-t,:)=0;cdata_Z(119:319,250-t:T:550-t,:)=255;%imshow(cdata_Z)%叠加cdata_Combine =imlincomb(1,cdata_N,1,cdata_Z,-255);imshow(cdata_Combine)pause(0.1)
end

最终效果如下:

利用matlab制作光栅动画(莫尔条纹动画)相关推荐

  1. 利用MATLAB制作基于艾宾浩斯记忆曲线的背单词计划

    利用MATLAB制作基于艾宾浩斯记忆曲线的背单词计划 最近感觉自己的英语不够用了,需要背点单词了.打算学期结束后就开始背单词,现在已经入手了<恋练有词>,整本书共30个小部分.听说根据艾宾 ...

  2. html靶心制作,如何利用PPT制作正中靶心小动画 实例教程

    用PPT做了个射靶的小动画,如下所示, 本篇我们来讲解用PPT绘制动画中的素材--标和靶,下篇会讲解如何制作该动画. 1. 首先我们来画一个靶. 当然,我们可以依次点击"插入"-- ...

  3. 第四周作业:利用matlab制作图像的二值模板并分别利用模板进行“与模板相与”、“与模板相或”、“与模板异或”操作

    文章目录 第四周作业 第一题 第二题 第四周作业 第一题 题目: 利用 MATLAB 编程,打开自己的一张照片,依次完成下列要求: 1) 以照片的自己作为目标,制作二值模板 2) 分别利用模板进行&q ...

  4. 如何利用Matlab制作色卡,手把手教你做一张属于自己的色卡,彩铅必备!

    色卡是用于色彩选择.比对.沟通,是色彩实现在一定范围内统一标准的工具.很多彩铅刚入门的友友们对于色彩还不是特别熟悉,上色的时候找对应颜色的彩铅就会比较麻烦,做一张色卡可以方便按色号查找画笔颜色,让你快 ...

  5. 利用MATLAB制作各种心形

    最近闲来无事,整理了一些采用MATLAB软件来绘制心形的代码: 1. >> [x,y,z]=meshgrid(linspace(-1.3,1.3)); >> val=(x.^2 ...

  6. 【转载】利用Matlab制作钟表

    静态时钟 hObject=figure; set(hObject,'NumberTitle','off'); set(hObject,'MenuBar','none'); set(hObject,'v ...

  7. 如何利用Matlab制作色卡,(七)用matlab生成二值化图和24色卡

    [code]%生成4个半径依次为10,30,50,100的圆 clc; clear; close all; I = zeros(256,256); %定义一个256*256的灰度图 iter = [1 ...

  8. 利用MATLAB实现图片切换动画效果详解

    内容摘要:本博文介绍MATLAB图片切换动画效果的制作以及GIF文件保存,并结合具体代码详细解释.介绍了利用MATLAB编程进行几幅图片的轮流切换,切换时实现与幻灯片切换相似的炫酷的图片切换特效.其中 ...

  9. 莫尔条纹三维测量仿真matlab,利用莫尔条纹测量物体三维形貌新方法研究

    第 37 卷第 7 期 2008 年 7 月 光 子 学 报 ACTA PHOTONICA SINICA Vol. 37 No. 7 July 2008 3陕西省教育厅专项科研计划(05J K221) ...

  10. 用MATLAB做一个单摆运动的动画

    用MATLAB做一个单摆运动的动画 MATLAB与单摆运动 MATLAB在机械机构分析和数值理论计算中中应用广泛.倒立摆系统的设计与弹簧振子设计类似,本文将利用MATLAB脚本建立单摆运动的动画演示. ...

最新文章

  1. 看漫画学Python,屏幕前的彦祖要不要试试?
  2. spring-security问题记录
  3. openHEVC 编译 for VS2017+Win10 x64
  4. 【王俊杰de人工智能实战课】第7次作业2
  5. ioca0中断 pic单片机_单片机入门知识-PIC为例程序.ppt
  6. python列表赋值 连续整数_Python_03_字符串_数据类型_for循环_列表操作
  7. ubuntu 安装Pangolin 过程
  8. 数据库系统概论--课后习题
  9. 【汇编】更灵活的定位内存地址方式——and,or命令、SI、DI变址寄存器、直接寻址[idata]、寄存器间接寻址[bx]、寄存器相对寻址[bx+idata]、基址变址寻址、相对基址变址寻址
  10. MD通过vscode生成PDF(带目录标签)
  11. fatal: couldn‘t find remote ref develop-XXXX fatal: the remote end hung up unexpectedly
  12. echarts中环形图加边框
  13. 计算机设备名称在哪里找,如何查看电脑驱动
  14. 雷军在北京大学的演讲
  15. 大学计算机课算绩点吗,大学体育成绩算入绩点吗?
  16. nyist 252 01串
  17. 前端面试题汇总(含答案)(JS篇)
  18. 通讯录管理系统报告java_java实现通讯录管理系统
  19. 射频功率测量角度看数字调制信号
  20. 计算机原理--计算机的控制器

热门文章

  1. 【操作系统】分区分配算法(首次适应算法、最佳适应算法)C语言
  2. 华东理工大学计算机考研资料汇总
  3. 全系列三极管应用参数
  4. 审车的时候环保怎样安全通过_车审环保过不了如何处理
  5. 读债务危机0814-08年9月崩溃
  6. 红帽linux内核,如何下载centos/redhat的linux内核源代码
  7. 公网linux服务器地址,Linux终端查看服务器公网IP地址的四条命令
  8. Ubuntu18.04 wifi已连接却没办法上网~代理服务器出现问题
  9. 腾讯帝国的2018年,本命年过得不是很顺利
  10. 小学课本的“七桥问题”