利用Matlab将多张图片转化为AVI

前段时间,无所事事,就帮人写了一个将多张图片转化为AVI的程序,因为图方便就采用了Matlab语言!

其实整个程序和流程都很简单,就是将一个文件夹中的图片依次读入,并将其数据存储到AVI容器中!

 

整个程序包括两个子程序:getallfile.m-----查找文件夹下包含的所有图片

                                                pic2avi.m  -----图片的显示并储存为AVI文件

 

下面直接上代码:

 

%%
% 功能:程序实现了将多幅图片转换为AVI格式
% 说明:1.可以选择是否对图片进行预处理,如果图片都是尺寸相同,图片格式相同,
%         那么可以直接跳过这一步,否则对图片进行预处理操作
%       2.步骤:
%          step1: 参数设置
%          step2: 遍历目标文件夹下的所有图片,将图片的路径信息保存为结构体
%          step3: 按照设定的参数读取图片,并进行预处理操作
%          step4: 得到图片信息,转化为AVI,并进行保存


%% step1:参数的设置

clear 
clc
disp('第一步,基本参数的设置...................')

%待处理图片的存放文件夹,可以存在子文件夹的情况
dirName = 'D:\MATLAB\work\Study\DATA';

%处理后的文件夹的存放位置,可以不存在,程序会自动生成
desName = 'D:\MATLAB\work\Study\PDATA';

%最终图片的归一化尺寸
thesizex = 500;thesizey=500; thesizez=3; ischangeszie = 0;

%采用RGB还是直接使用Gray的图片
imagetype = 'Gray';

%图片的通用格式设置
fmt = '.bmp';

%% step2:遍历目标文件夹下的所有图片,将图片的路径信息保存为结构体
disp('第二步,获取文件夹下所有的图像文件...................')

%注意:不要在此文件夹下放其他类型的文件,否则会报错
%获取文件夹下所有的文件
fileList = getAllFiles(dirName);

%% step3: 开始对图片进行预处理操作
disp('第三步,开始对对每一张图片进行处理...................')

%图片的数目
img_num = length(fileList);

if img_num ==0;
    error('设定的文件夹内没有任何的图片,请重新检查...')
end

for ii = 1:img_num %开始遍历
    imgname = fileList{ii};
    I_img = imread(imgname);
    
    %转化为灰度图
    [sizex,sizey,sizez] = size(I_img);
    if sizez ==3&&strcmp(imagetype,'Gray')
        I_img = rgb2gray(I_img);
        thesizez = 1;
    end
    
    if ii==1
        disp(strcat('当前尺寸范围为: ',num2str(sizex),' *',num2str(sizey),';\n'));
    elseif (ii==1)&&(ischangeszie==1)
        disp(strcat('现将所有图片转化为:',num2str(thesizex),'*',num2str(thesizey)));
        ischange = input('是否对变换尺寸进行更改:是(1) 否(0)');
        if ischange ==1
            thesizex = input('请输入归一化图像的高度:');
            thesizey = input('请输入归一化图像的宽度:');
        end
    elseif (ii==1)&&(ischangeszie==0)
        disp('不进行图像的尺寸变换');
    end
    
    %进行尺寸的归一化操作
    if ischangeszie==1
        I_img = imresize(I_img,[thesizex,thesizey],'bilinear');
    end
    
    %对处理的图片进行统一命名的保存
    if ii==1
        if not(exist(desName,'dir'))
            mkdir(desName);
        end
    end
    imwrite(I_img,strcat(desName,'\',num2str(ii),fmt),fmt(2:end));
end
clear ii I_img sizex sizey sizez fileList 

%% step4: 得到图片信息,转化为AVI,并进行保存

%获取文件夹下所有的文件
fileList = getAllFiles(desName);

%图片的数目
img_num_out = length(fileList);

if img_num_out ==0|| img_num_out~=img_num
    error('设定的文件夹内的图片数量出现了错误,请重新检查...')
end

%创建一个AVI格式的容器,用于保存图像数据信息
aviobj = avifile('mymovie.avi','fps',1);

%Mdata = zeros(thesizex,thesizey,thesizez,img_num_out,'uint8');
for i=1:img_num_out
    %Mdata(:,:,:,i)=imread(fileList{i});
    Mdata = imread(fileList{i});
    imshow(Mdata)
    frame = getframe(gca);
    aviobj = addframe(aviobj,frame);
end
aviobj = close(aviobj);


 

function fileList = getAllFiles(dirName)
% 功能:指定文件路径,获取该路径所包含的所有文件
%       由于采用了嵌套操作,因此可以获取子文件夹的文件
dirData = dir(dirName);      %# Get the data for the current directory
dirIndex = [dirData.isdir];  %# Find the index for directories
fileList = {dirData(~dirIndex).name}';  %'# Get a list of the files
if ~isempty(fileList)
    fileList = cellfun(@(x) fullfile(dirName,x),...  %# Prepend path to files
        fileList,'UniformOutput',false);
end
subDirs = {dirData(dirIndex).name};  %# Get a list of the subdirectories
validIndex = ~ismember(subDirs,{'.','..'});  %# Find index of subdirectories
%#   that are not '.' or '..'
for iDir = find(validIndex)                  %# Loop over valid subdirectories
    nextDir = fullfile(dirName,subDirs{iDir});    %# Get the subdirectory path
    fileList = [fileList; getAllFiles(nextDir)];  %# Recursively call getAllFiles
end

end


 相应的测试程序和测试图片包括使用说明在我的资源里下载!

http://download.csdn.net/detail/me_sky_2012/4345849

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章