Matlab 同一文件夾下圖片批量處理的兩種簡單方法
最近因爲實驗中有許多圖片需要處理,本來的做法是一張張讀取圖片,這是相當麻煩的,因爲每處理一張圖片就需要修改相應的圖片名。於是就想着要是可以批量處理就好了,這樣就可以大大提高效率。通過閱讀文章和自己親身的實踐,下面總結兩種方法,希望可以給其他人做參考,也方便自己以後使用。
1. 幾個函數的介紹
在這之前需要首先介紹幾個用到的函數:
1.1 strcat函數
這個函數就是字符串連接函數,舉個例子:
a='Good';
b='morning';
c=strcat(a,b)
運行結果:
c =
Goodmorning
1.2 dir函數
dir的功能就是列出指定文件夾下的文件,並將其放在一個結構體當中。有如下幾種用法:d
dir(‘.’)列出當前目錄下所有子文件夾和文件
dir(‘G:\實驗圖片’)列出指定目錄下所有子文件夾和文件
dir(‘*.m’)列出當前目錄下符合正則表達式的文件夾和文件
2. 兩種實現方法
介紹完上面的函數下面就介紹兩種實現的方法
2.1 方法一
直接看代碼:
file_path = 'G:\實驗圖片-2018-8-15\';% 圖像文件夾路徑
img_path_list = dir(strcat(file_path,'*.jpg'));%獲取該文件夾中所有.jpg格式的圖像
img_num = length(img_path_list);%獲取圖像總數
if img_num > 0 %有滿足條件的圖像
for pn = 1:img_num %逐一讀取圖像
image_name = img_path_list(pn).name;% 圖像名
img_origin = imread(strcat(file_path,image_name));%讀取圖像
fprintf('%d %s\n',pn,strcat(file_path,image_name));% 顯示正在處理的圖像名
%%此處添加具體的圖像處理程序
end
end
這種方法就是先將指定路徑下的“.jpg”圖片通過dir函數放到結構體當中,再逐一地對圖像進行讀取和處理。
fprintf('%d %s\n',pn,strcat(file_path,image_name));
這句代碼其實很有用的,可以實時打印消息,告訴你目前處理到哪個圖片了,也方便我們判斷程序有沒有問題。
2.2 方法二
還是先看代碼:
fig_path='G:\實驗圖片-2018-8-15\';
cd (fig_path); %切換到指定路徑下
allfigs=struct2cell(dir('*.jpg')); %只處理jpg文件
[w,img_num]=size(allfigs); %獲得jpg文件的個數
for pn=1:img_num %逐次取出圖片
image_name=allfigs{1,pn}; %allfigs{1,pn}存儲每個圖片的名字
img_origin=imread(image_name); %讀取圖片
fprintf('%d %s\n',pn,strcat(fig_path,image_name));
%%此處添加具體的圖像處理程序
end
這種方法本質上和上面是相似的,差別主要在於這裏通過struct2cell函數,將.jpg文件列表轉換成了胞元數組形式,通過胞元數組處理每個圖片。
3. 含有子文件夾的情況
這種方法只是針對文件夾當中不含有子文件夾的情況,如果子文件夾當中也有圖片需要處理,那麼就需要修改了。但是本人由於處理過程不涉及這種情況,就沒有深究了。只是看到一篇文章中提供了一種辦法,但本人也沒有去驗證,在這裏就先貼出來。含有子文件夾的處理辦法