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)

(三)

新需求,原来文件名格式为a_b_num,需要将文件名改为a_b_(num+100),将最后的数字增加100.

Original_image_dir  =  'I:\jxq\jxq\daset\guesture\1\atm\atmleft\left_1\';%需要重命名的文件
right_image_dir = 'I:\jxq\jxq\daset\guesture\1\atm\atmleft\';  %保存新文件的路径
path = gain_file_dir(Original_image_dir);

count = 0;
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;%获取图像名  
                        % 注意,这里的图像读取并不是按照图像的编号顺序读取  
            img_dir = strcat(file_path,image_name);
            image=imread(strcat(file_path,image_name));%读取文件夹下的每一帧图像 
            num = 9;%atm_left_ 分割出前面一部分 ,第几位
            qian = image_name(1:num) % 前半部分,atm_left_
            new_num = str2num(image_name(num+1:length(image_name)-4)) + 100;%取得前半部分之后到后缀之前部分的数字加100
            new_image_name = strcat(qian,sprintf('%05d',new_num),'.jpg')%将三部分拼接,得到新的文件名
            imwrite(ir,strcat(right_image_dir,new_image_name),'jpg'); 
            count = count + 1
        end
        

    end
end

  • 2
    点赞
  • 45
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
要在Matlab遍历文件夹,可以使用dir函数来获取文件夹中的所有文件文件夹的信息。可以像这样使用dir函数来遍历某个路径下的所有文件夹文件: ```matlab path = 'E:/matlabTest'; files = dir(path); for i = 1:length(files) if files(i).isdir && ~strcmp(files(i).name,'.') && ~strcmp(files(i).name,'..') folder_path = fullfile(path, files(i).name); % 对文件夹的处理操作 % 如果需要遍历文件夹中的文件 folder_files = dir(fullfile(folder_path, '*.mat')); for j = 1:length(folder_files) file_path = fullfile(folder_files(j).folder, folder_files(j).name); % 对文件的处理操作 end end end ``` 上述代码会遍历指定路径下的所有文件夹文件。你可以根据需要在对文件夹文件进行处理的部分添加自己的代码。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* *2* [使用MATLAB遍历文件](https://blog.csdn.net/weixin_45404593/article/details/123914077)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_1"}}] [.reference_item style="max-width: 50%"] - *3* [【Matlab学习】 遍历文件夹下的所有文件](https://blog.csdn.net/chenriwei2/article/details/42321851)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_1"}}] [.reference_item style="max-width: 50%"] [ .reference_list ]
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值