MATLAB 遍历文件夹及子文件夹图片(包含深度遍历)

MATLAB遍历子文件夹及其下文件
以前从未遇到过用MATLAB批处理文件的情况,此次项目需要批量将二进制数据文件导入matlab进行svm分类,现将matlab遍历子文件夹及其文件的方法记录下来。

文件目录结构
/maindir
|– subdir1
|– datafile1.png
|– datafile2.png
|– subdir2
|– datafiel3.png
|– datafiel4.png
|– subdir3
|– datafile5.png
|– datafile6.png

主文件夹maindir下含有三个子文件夹,子文件夹分别包含两个二图片

maindir = 'D:\MATLAB\project';
right_image_dir = 'D:\MATLAB\project2';
subdir  = dir( maindir );

for i = 1 : length( subdir )
    if( isequal( subdir( i ).name, '.' )||...
        isequal( subdir( i ).name, '..')||...
        ~subdir( i ).isdir)               % 如果不是目录则跳过
        continue;
    end
    subdirpath = fullfile( maindir, subdir( i ).name, '*.jpg' );
    dat = dir( subdirpath )               % 子文件夹下找后缀为jpg的文件

    for j = 1 : length( dat )
        datpath = fullfile( maindir, subdir( i ).name, dat( j ).name);
        im=imread(datpath);
        % 此处添加你的对文件读写操作 %
         k= k+1;
         image_name3=strcat(right_image_dir,num2str(k),'.jpg');
         imwrite(im,image_name3,'jpg');      %写图片     
    end
end

函数dir
可以使用函数dir,D = DIR(‘directory_name’)返回一个结构数组,包含了文件夹directory_name下的子文件夹和子文件的一些信息,第1个成员是文件名,第4个成员表示是否为文件夹。

要注意的是第1个数组元素和第2个数组元素分别是’.’和’..’,表示当前目录和上层目录。

函数uigetdir
由于前面maindir需要指定路径,可能不是太方便。

使用uigetdir可以方便的通过对话框选择文件夹,返回值为文件夹路径名。代码如下:

maindir = uigetdir( ‘选择一个文件夹’ );这里写代码片
上面的例子比较简单,只涉及到两层目录以及指定格式的文件。

对于多层目录,以及多种格式文件的处理,则可以采用层次遍历与深度遍历两种方法实现。
深度遍历。

p=genpath('Z:\jxq\ATM+RTM+DTM\');%获取指定文件夹下所有子文件的路径  
%这些路径存在于字符串p中,以';'分割  
% 镜像图像保存  
des_path='C:\Users\123\Desktop\DTMATM\';   
length_p=size(p,2);%字符串p的长度  
path={};%建立一个元胞数组,数组的每个单元中包含一个目录  
temp=[];  
for i=1:length_p %寻找分隔符';',一旦找到,则将路径temp写入path数组中  
    if p(i)~=';'  
        temp=[temp p(i)];  
    else  
        temp=[temp '\'];%在路径的后面加上\  
        path=[path;temp];  
        temp=[];  
    end  
end  
clear p length_p temp  
%至此,获得了指定文件夹及其所有子文件夹,接下来就是逐一文件夹读取图像,利用上面的path数组,将路径取出来  
file_num=size(path,1);%获取子文件夹的个数  
for i=1:file_num  
    file_path=path{i}; %获取每个文件夹路径  
    img_path_list=dir(strcat(file_path,'*.jpg')); %获取每个文件夹下的图像列表  
    img_num=length(img_path_list);%获取文件夹下图像的数量  
    if img_num > 0  
        for j=1:img_num %img_num 
            image_name=img_path_list(j).name;%获取图像名  
                        % 注意,这里的图像读取并不是按照图像的编号顺序读取  
            image=imread(strcat(file_path,image_name));%读取文件夹下的每一帧图像  
            fprintf('%d %d %s\n',i,j,strcat(file_path,image_name));%显示正在读取的图像  
            savedname=strcat(des_path,image_name);   
            imwrite(image,savedname,'jpg');  

        end  
    end  
end 

其他遍历方式可以查看[Matlab对文件夹的层次遍历和深度遍历],我这里就不进行阐述了。(https://blog.csdn.net/guoxiaojie_415/article/details/21317323)

猜你喜欢

转载自blog.csdn.net/fengzhongluoleidehua/article/details/80424297