2014-10-20 93 views
1

我有一些圖像需要加載和處理。這些圖像命名如下:image1.jpg,image2.jpg,image3.jpg等。當我處理每個圖像時,我想將輸出存儲在一個數組中。這個數組中的索引對應於圖像名稱很重要。例如,數組元素5中的值應該對應於image5.jpg按文件名中的數字順序讀取文件

問題是,當我搜索這些文件並加載它們時,它們會嚴格按字母順序加載,而不是數字加載。所以,因爲我有一個hunder圖像,前幾個要加載的是:image1.jpg,image10.jpg,image100.jpg,image101.jpg,image102.jpg等等。因此,數組元素5將對應於image102.jpg

我的問題是:我如何加載文件中的數字順序文件,而不是默認的順序?

這裏是我的代碼來獲取文件名:

my_dir = dir('C:/MyDir'); 
image_files = {my_dir(~[my_dir.isdir]).name}; 
disp(image_files); 

這給輸出:

'image1.jpg' 'image10.jpg' 'image100.jpg' 'image101.jpg' 'image102.jpg' ..... 

回答

2

單元陣列image_files排序:

  1. 保留的只是一部分每個已知只包含數字的字符串
  2. Con將其轉換爲數字
  3. 對所有這些數字進行排序並獲得排序索引
  4. 使用該索引排序原始單元格數組。

代碼:

image_files = {'image1.jpg' 'image10.jpg' 'image100.jpg' 'image2.jpg' 'image20.jpg'}; 
[~, ind] = sort(cellfun(@(c) str2num(c(6:end-4)), image_files)) 
image_files_sorted = image_files(ind); 

結果:

image_files_sorted = 
    'image1.jpg' 'image2.jpg' 'image10.jpg' 'image20.jpg' 'image100.jpg' 
+0

油滑使用'cellfun',毫無疑問的。 +1但我喜歡'regexp'進行模式匹配。 – chappjc 2014-10-20 02:02:28

3

regexp幹得太多工作:

C = regexp(image_files,'image(\d*).jpg','tokens','once'); 
[~,inds] = sort(str2double([C{:}])) 
image_files_sorted = image_files(inds) 
+0

+1我比我的回答更喜歡這個,因爲它避免了'cellfun'。另外,如果文件名模式改變,'regexp'允許更多的靈活性 – 2014-10-20 09:33:42