一文了解Matlab如何製作動態圖像

2021-02-18 數學建模andMATLAB

今天的推文,我們主要來介紹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繪製動畫的基本函數,在這些基本的函數基礎上,可以結合圖像處理技術還可以做出更多豐富的動畫特效,這些內容可以在之後的推文中慢慢了解。

相關焦點

  • 大神帶你玩轉matlab圖像處理(6)——Hough變換
    所以說有些知識說不定你那天就能夠使用到,秉持著「技多不壓身」的原則,本期跟隨過冷水了解一點點圖像處理方面的知識吧!之前公眾號作者:小豬豬有連載大神帶你玩轉matlab圖像處理推文。關於圖像處理的基礎知識過冷水就不再重複講解了,在其基礎上繼續深入學習數字圖像的轉變。
  • 值得收藏 | 如何用matlab做出酷炫的圖像
    本文承接在matlab入門基礎操作介紹的兩篇推文之後,在matlab入門(下)中介紹了部分繪圖相關的操作,本文首先做一點簡單回顧,
  • 大神帶你玩轉matlab圖像處理(五)
    A:原圖像,B:結果圖將真彩色圖像B轉換為灰度圖像A。imbinarize使用256-bin圖像直方圖來計算Otsu的閾值。要使用其他直方圖,請參見otsuthresh。B=imbinarize(A,method)使用方法「 global」或「 adaptive」指定的閾值處理方法從圖像A創建二進位圖像。B=imbinarize(A,T)使用閾值T從圖像A創建二進位圖像。
  • Matlab基礎(一)
    ;命令行窗口:可以在>>後面任意輸入matlab指令,再按回車,立刻出執行結果。*上面的一些示例也看到了如何在命令行窗口輸入指令並得到計算結果,下面做簡要總結:假如你是小學生,你需要知道+,-,×,÷四個運算符在Matlab中分別對應+,-,*,/四個符號(小學就學微積分的孩子忽略...),這樣你就具有一款強大的計算器,例如
  • 【matlab圖像處理】圖像處理工具箱(2)
    今天介紹圖像處理工具箱的基本圖像操作。本內容參考自《實用MATLAB圖像和視頻處理》第4章。對於matlab的安裝,可以參考以下文章:讀取圖片是最基本的操作,matlab中內置的函數為imread(),它可以讀取常見的圖像格式,如TIFF、JPEG、BMP、GIF、PNG等,如下。
  • 【matlab圖像處理】圖像處理工具箱(1)
    井田的疆理,一般是以每一方塊為一百畝(約合今31畝),稱為一田,縱橫相連的九田合為一井。井田制下,卿大夫以下的貴族土地不得隨意轉賣。西周晚期後,隨著私田的出現,井田制逐漸衰落。俗話說:「好記性不如爛筆頭」,多寫寫多記記,總不會錯。多一些不為什麼的堅持,少一些功利主義的追求。今天介紹圖像處理工具箱概述。
  • 大神帶你玩轉matlab圖像處理 (一)
    語法規則:B=imtranslate(A,[h,v])     A:原圖像,B:結果圖像     h>0右邊移動,V>0下移     h<0左邊移動,V<0上移clc;clear;s=what;p=s.path;I=imread([p,'\圖像素材
  • 【matlab圖像處理】圖像處理的其他算術運算
    今天介紹圖像處理的其他算術運算,包括減法運算、乘法運算、除法運算。本內容參考自《實用MATLAB圖像和視頻處理》第6章。對於matlab的安裝,可以參考以下文章:關於圖像的算術運算,其實就是逐像素進行處理,即在圖像中運算是獨立作用於各個像素的。這裡的運算操作可以是二值操作符,如常見的「加減乘除」。
  • 小波變換MATLAB圖像融合
    圖像融合是綜合兩幅或者多幅圖像的信息,以獲取同一場景下更加準確、更加全面
  • Matlab | 點雲基本操作(一)
    Matlab是常用的數學工具,相比較於其他語言的特點是比較方便,集成有穩定的數學工具箱,我們所用到的點雲基本操作在matlab的CV工具箱裡
  • matlab處理圖像代碼
    %例2:直方圖的顯示imshow('c:\lilizong\boat.bmp');title('原圖像')%顯示原圖像A=imread('e:\matlabwork\tuxiang\Girl.bmp','bmp');figure;imhist(A),title('對應直方圖')在圖像處理中,點運算是簡單而又重要的一種技術,其中最常用的一種應用就是直方圖的均衡化
  • 想通過視頻自學MATLAB的同學戳這裡!
    Matlab視頻:Matlab中文論壇為新手打造的,20分鐘入門Matlab 2. Matlab初學者視頻教學二:增加程序可讀性發布程序運行結果Matlab GUI 初學者視頻教學 1. Matlab GUI視頻(一): 創建一個簡單GUI 2. Matlab GUI視頻(二): 按鈕的使用,圖片讀取高解析度 3.
  • Matlab實現圖像閾值分割(含代碼)
    使用matlab實現閾值分割,實現兩種方法,一是人工選擇閾值進行分割,而是自動選擇閾值進行分割。
  • 【matlab圖像處理】圖像處理的經典操作
    今天介紹圖像處理的經典操作。本內容參考自《實用MATLAB圖像和視頻處理》第一章。對於matlab的安裝,可以參考以下文章:今天,幾乎不存在與數字圖像處理無關的技術領域。數字圖像處理應用領域非常廣泛,包括:醫學上的核磁共振成像、工業上的缺陷檢測、軍事上的無人機識別、安防上的智能監控、手機上的自拍美圖,更別說網際網路上每時每秒上傳的照片和短視頻等等。
  • 【Matlab】繪圖
    : Group 1, Team 1Abstract(背景)之前因為數學建模比賽,需要總結matlab有什麼關於建模以及繪圖的函數,所以寫了篇推文。因為無聊,寫的還是敘事型的。結果寫一半,matlab壞了,沒繼續寫現在大二做實驗需要數據分析,但是卻還沒學過matlab,可能你們用Python,excel?
  • MATLAB作圖從入門到熟練
    本期推文,喵姐會介紹一下matlab作圖,儘量讓各位同學通過一篇推文學會matlab作圖從入門到熟練。如果你對matlab已經有所了解,可以跳過下面的入門部分。為什麼我們要用MATLAB作圖,而不是用python作圖?這個是工具選擇問題,人與人之間各有偏好。那麼作圖的目的是什麼?是為了清晰地表達數據結果。在數學建模競賽這方面,數據結果表達與論文排版的好壞對論文得分的影響往往很大。
  • Matlab生成Lagrange插值函數圖像遇到的問題及解決方法
    說明:本過程基於Matlab R2091b寫個作業,要求使用matlab編程求出Lagrange
  • Python是這樣調用matlab程序的!
    它常被暱稱為膠水語言,能夠把用其他語言製作的各種模塊(尤其是C/C++)很輕鬆地聯結在一起。常見的一種應用情形是,使用Python快速生成程序的原型(有時甚至是程序的最終界面),然後對其中 有特別要求的部分,用更合適的語言改寫,比如3D遊戲中的圖形渲染模塊,性能要求特別高,就可以用C/C++重寫,而後封裝為Python可以調用的擴展類庫。
  • MATLAB中圖片保存的五種方法(一)
    —>此時圖像就複製到剪貼板了,我們可以藉助其他軟體(比如:繪圖板)保存為需要的圖片3、saveas命令格式Matlab提供直接的saveas函數可以將指定figure中的圖像或者simulink中的框圖進行保存,相當於【文件】中的【另存為】 4、print函數print函數原本不是用來進行圖像保存了
  • 使用MATLAB創建gif動畫詳解
    上課期間,和同學們提起matlab可製作gif動畫圖片,並讓大家搜一個畫心形圖的網頁,繪圖的最終結果如下