2014-10-20 96 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