欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

【matlab代码练习5】在MATLAB中读取多幅图像,并制成GIF动画

程序员文章站 2022-03-25 09:05:12
...
% 连续读取多幅图像,显示并保存为gif动画形式
% 编写时间:2018年3月26日13:37:31  编写人:gq

close all; clear all; clc; 

%% 采用方式一读取多幅图像。此方式需要将文件夹中待读取的图像重命名为1,2,3...,此处格式为bmp。
 
% str = 'F:\DS0\1\'; % 图像路径
% for idx = 1:5  % 读取5幅图像
%    img{idx} = imread([str, num2str(idx), '.bmp']) ; % 建立一个cell数组img{},依次读取这5幅图像
% end
% 
% for idx = 1:5 % 在一个figure中依次显示这5幅图像
%    subplot(2,3,idx), imshow(img{idx});  
% end

%% 采用方式二读取多幅图像。此方式不需要对文件夹中待读取的图像重命名。
% 利用函数uigetdir得到待处理图像的路径,然后对此路径下的所有图像进行处理

srcDir = uigetdir('F:\DS0\'); % 显示位于文件夹F:\DS0内部的文件夹
% srcDir = uigetdir; % 显示位于当前工作目录内部的文件夹
cd(srcDir); % 打开选择的文件夹。若无此句,则打开当前文件夹
allnames = struct2cell(dir('*.bmp')); % struct2cell(),将结构体转换为cell数组。dir(),列出文件夹内容,此处列出格式为bmp的文件
[m,n] = size(allnames); % 这里的allnames是一个m*n的cell数组,n表示读取了几幅图像
for i = 1:n
   name = allnames{1, i}; % allnames{1,i}表示的是图像名
   img{i} = imread(name); % 建立一个cell数组img{},依次读取图像
end

for idx = 1:n  % 在一个figure中依次显示这n幅图像
   subplot(2,3,idx), imshow(img{idx});  
end

%%
filename = 'vein.gif'; % 保存的gif名
for idx = 1:5  % for idx = 1:n
   [A, map] = gray2ind(img{idx}, 256); 
%  [A, map] = rgb2ind(img{idx}, 256);
   if idx == 1
      imwrite(A, map, filename, 'gif', 'LoopCount', Inf, 'DelayTime', 1); % 针对第一幅图像
      % 将索引图像保存为vein.gif,LoopCount表示重复动画的次数,Inf的LoopCount值可使动画连续循环,DelayTime为1,表示第一帧图像显示的时间
   else % 针对后续图像
       imwrite(A, map, filename, 'gif', 'WriteMode', 'append', 'DelayTime', 1); 
      % 将索引图像保存为vein.gif,WriteMode表示写入模式,与append(或overwrite)配合使用,append模式下,imwrite会向现有文件添加单个帧
      % DelayTime为1,表示后续图像的播放时间间隔为1秒
   end    
end