按文件名中的数字顺序读取文件
问题描述:
我有一些图像需要加载和处理。这些图像命名如下: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' .....
答
单元阵列image_files
排序:
- 保留的只是一部分每个已知只包含数字的字符串
- Con将其转换为数字
- 对所有这些数字进行排序并获得排序索引
- 使用该索引排序原始单元格数组。
代码:
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'
答
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
油滑使用'cellfun',毫无疑问的。 +1但我喜欢'regexp'进行模式匹配。 – chappjc 2014-10-20 02:02:28