MATLAB動態繪圖、展示並保存的一種方法

雲龍派 發佈 2024-03-08T18:28:47.437319+00:00

imwrite函數將圖像寫入圖形文件語法imwrite(A,filename)imwrite(A,map,filename)imwrite(___,fmt)imwrite(___,Name,Value)說明imwrite(A,filename) 將圖像數據 A 寫入

imwrite函數

將圖像寫入圖形文件

語法
imwrite(A,filename)
imwrite(A,map,filename)
imwrite(___,fmt)
imwrite(___,Name,Value)
說明
imwrite(A,filename) 將圖像數據 A 寫入 filename 指定的文件,並從擴展名推斷出文件格式。
imwrite 在當前文件夾中創建新文件。輸出圖像的位深取決於 A 的數據類型和文件格式。
對於大多數格式來說:
如果 A 屬於數據類型 uint8,則 imwrite 輸出 8 位值。
如果 A 屬於數據類型 uint16 且輸出文件格式支持 16 位數據(JPEG、PNG 和 TIFF),則 imwrite 
將輸出 16 位的值。如果輸出文件格式不支持 16 位數據,則 imwrite 返回錯誤。
如果 A 是灰度圖像或者屬於數據類型 double 或 single 的 RGB 彩色圖像,則 imwrite 假設動態範圍
是 [0,1],並在將其作為 8 位值寫入文件之前自動按 255 縮放數據。如果 A 中的數據是 single,則在
將其寫入 GIF 或 TIFF 文件之前將 A 轉換為 double。
如果 A 屬於 logical 數據類型,則 imwrite 會假定數據為二值圖像並將數據寫入位深為 1 的文件
(如果格式允許)。BMP、PNG 或 TIFF 格式以輸入數組形式接受二值圖像。
如果 A 包含索引圖像數據,則應另外指定 map 輸入參數。
imwrite(A,map,filename) 將 A 中的索引圖像及其關聯的顏色圖寫入由 map filename 指定的文件。
如果 A 是屬於數據類型 double 或 single 的索引圖片,則 imwrite 通過從每個元素中減去 1 來將
索引轉換為從 0 開始的索引,然後以 uint8 形式寫入數據。如果 A 中的數據是 single,則在將其寫
入 GIF 或 TIFF 文件之前將 A 轉換為 double。
imwrite(___,fmt) 以 fmt 指定的格式寫入圖像,無論 filename 中的文件擴展名如何。您可以在任何
先前語法的輸入參數之後指定 fmt。
imwrite(___,Name,Value) 使用一個或多個名稱-值對組參數,以指定 GIF、HDF、JPEG、PBM、
PGM、PNG、PPM 和 TIFF 文件輸出的其他參數。您可以在任何先前語法的輸入參數之後指定
Name,Value。

實例1

下圖直觀的展示了 y=sin(ax) 的函數圖像隨參數 a 是如何變化的。

clc;
clear all;
close all;
num = 200;% 參數a的個數,及組成GIF圖的總圖片個數
a_list = linspace(0.5, 5, num);% 設置參數a的取值範圍
x = linspace(0, 2*pi, 200);% 設置自變量x的範圍


pic_num = 1;
for i = 1:num  
    a = a_list(i);
    y = sin(a.*x);% 在一個確定的a下得到y=sin(ax)
    figure(1);
    set(figure(1), 'Color', 'white');% 設置圖片窗口背景顏色為白色
    plot(x, y, 'LineWidth', 2, 'Color', [0.0118, 0.0359, 0.4824], 'DisplayName', '{\ita}='+string(roundn(a, -2))); 
    % 繪製x,y曲線,並設置線寬,曲線顏色,曲線圖例名稱


    grid on;% 為繪圖窗口加上網格
    set(gca,'FontSize',12,'FontName','Bookman Old Style');% 設置圖片中字體的大小,樣式
    xlabel('Label {\itx}', 'FontSize',14);% 設置x軸標籤
    xlim([min(x), max(x)]);% 設置y軸標籤
    ylim([-1.2, 1.2]);% 設置y軸顯示範圍
    ylabel('Label {\ity}', 'FontSize',14);% 設置y軸標籤
    legend('FontSize',14, 'box', 'off');% 為圖片加上圖例
    title('GIF: {\ity}=sin({\itax})', 'FontSize',14);% 增加圖片的標題
    drawnow;% 立即刷新當前繪圖窗口,這是matlab繪圖中動態展示的關鍵
    
    F = getframe(gcf);  % 獲取當前繪圖窗口的圖片
    Im = frame2im(F);   % 返回與電影幀相關的圖片數據
    [A, map] = rgb2ind(Im, 256); % 將RGB圖片轉化為索引圖片
    if pic_num == 1
        imwrite(A, map, 'sin.gif', 'gif', 'Loopcount', Inf, 'DelayTime', 0.1);
        % 將第一張圖片寫入『sin.gif』文件中,並且將GIF播放次數設置成無窮,即保存的GIF圖會一直動下去
    else
        imwrite(A, map,'sin.gif','gif','WriteMode','append','DelayTime',0.1);
        % 依次將其他的圖片寫入到GIF文件當中
    end
    pic_num = pic_num + 1;
end

其中 imwrite 函數就是起到將循環中得到的圖片依次寫入到GIF格式的圖片中,其中參數『DelayTime』表示相鄰兩張圖片播放的間隔時間,一定程度上決定了GIF動圖播放時的流暢程度。代碼看起來很長,但有很大一段是對圖片的坐標,題目等屬性的設置。當然我們可以把將圖片寫入GIF圖的過程封裝成一個函數,然後把它加入到Matlab的庫函數中去,這樣以後使用就可以直接調用而不用再重複粘貼這一大串代碼了。

這其中,主要用到以下4個函數:

1. getframe函數

該函數用來捕獲坐標區或圖窗作為影片幀。使用格式

F=getframe
它捕獲顯示在屏幕上的當前坐標區作為影片幀。F是一個包含圖像數據的結構體。getframe按照屏幕
上顯示的大小捕獲這些坐標區,它並不捕獲坐標區輪廓外部的刻度標籤或其他內容。

2. frame2im函數

它與getframe函數屬於一類,它返回與影片幀關聯的圖像數據。

3. rgb2ind函數

從函數名的構成上看,rgb2ind,就是將RGB圖像轉換(2同to音)為索引(index)圖像。gif實際上是多圖疊加而成,各圖展示時間有延遲,所以看上去是動態的。要將多個圖像保存到一個gif文件中,但因為gif文件不支持三維數據,所以應調用rgb2ind,使用顏色圖map將圖像中的RGB數據轉換為索引圖像。

4. imwrite函數

imwrite將GIF文件寫入您的當前文件夾。在imwrite的參數中,除了要寫出的圖像數據、圖像文件名稱外,還有三個非常重要的參數:

4.1參數LoopCount

LoopCount用來設定動畫連續循環的次數。循環次數可取[0,65535]範圍內的整數或Inf值,如果指定0,動畫將播放一次,但某些Microsoft應用程式會將值0的含義解釋為根本不進行循環;如果指定值1,動畫將播放兩次,以此類推;取Inf值可使動畫連續循環。

4.2參數WriteMode

因為Gif圖像是多圖疊加,所以需要將多個圖像添加到第一個圖像中,而使用'WriteMode','append'這種名稱-值,可將後續生成的圖像疊加到前邊的圖像中。

4.3參數DelayTime

參數DelayTime指定各個圖像的顯示延遲時間,正是因為這種在每個圖像顯示之間指定了時滯,才看上去是動態的,上邊的代碼中設定了0.05秒。


實例2

clc;
clear all;
close all;


h = figure;
axis tight manual % this ensures that getframe() returns a consistent size
filename = 'testAnimated.gif';
for n = 1:0.5:5
    % Draw plot for y = x.^n
    x = 0:0.01:1;
    y = x.^n;
    plot(x,y) 
    drawnow 
 
      % Capture the plot as an image 
      frame = getframe(h); 
      im = frame2im(frame); 
      [imind,cm] = rgb2ind(im,256); 
 
      % Write to the GIF File 
      if n == 1 
          imwrite(imind,cm,filename,'gif', 'Loopcount',inf); 
      else 
          imwrite(imind,cm,filename,'gif','WriteMode','append'); 
      end 
  end

實例3

clc;
clear all;
close all;
% 畫橢圓 x*x/4 + y*y/3 = 1的切線
a = 12*cos(0:2*acos(1/3):200*pi)+9i*sin(0:2*acos(1/3):200*pi);
figure();
h = plot(a(1));
axis equal
axis([-12,12,-9,9]);
[A,map] = rgb2ind(frame2im(getframe),256);
imwrite(A,map,'1.gif','LoopCount',65535,'DelayTime',0.1);
for ii = 1:length(a)-56
    h.XData(ii) = real(a(ii));
    h.YData(ii) = imag(a(ii));
    [A,map] = rgb2ind(frame2im(getframe),256);
    imwrite(A,map,'1.gif','WriteMode','append','DelayTime',0.1);
    pause('on')
    pause(0.01)
end

本文內容來源於網絡,僅供參考學習,如內容、圖片有任何版權問題,請聯繫處理,24小時內刪除。


作 者 | 郭志龍
編 輯 | 郭志龍
校 對 | 郭志龍

關鍵字: