如何在matlab中按顺序处理图像

时间:2015-03-18 06:18:13

标签: matlab

我有一个包含大约1000张图片的目录。在我的matlab代码中,我必须按名称顺序处理这些图像。(img1.jpg,img2.jpg等)。有没有办法从图像directrory读取顺序所以img1.jpg将被处理,然后img2.jpg等等?提前谢谢。

imgFilesDir =dir('pics/*.jpg');

for n=1:length(imgFilesDir)
%read Target image and convert into single
   rgb2= im2single(imread(strcat('pics/',imgFilesDir(n).name)));
   I2 = rgb2gray(rgb2);
end

3 个答案:

答案 0 :(得分:2)

使用正则表达式提取数字部分,从字符串转换为数字,按数字排序,并将该顺序应用于字符串:

imgFilesDirName = {imgFilesDir.name};
[~, ind] = sort(cellfun(@str2double, regexp(imgFilesDirName,'\d+(?=\..*)','match')));
imgFilesDirSorted = imgFilesDir(ind); %// sorted struct
imgFilesDirNameSorted = imgFilesDirName(ind); %// sorted names

假设数字部分是文件扩展名之前的一个或多个数字。

例如,给定

imgFilesDirName = {'imag1.jpg', 'imag10.jpg', 'imag11.jpg', 'img2.jpg', 'img20.jpg'};

你得到了

imgFilesDirNameSorted = 
    'imag1.jpg'    'img2.jpg'    'imag10.jpg'    'imag11.jpg'    'img20.jpg'

答案 1 :(得分:1)

在这种情况下,您可以使用 [~, intVecSort] = sort(arrayfun(@(x) x.name, r, 'Uniformoutput', false));

按日期排序甚至更短 [~, intVecSort] = sort(arrayfun(@(x) x.name, r);

如果你想将img3作为第三个名字,这是有效的 names = arrayfun(@(x) x.name, r, 'Uniformoutput', false); names(:, 2) = cellfun(@(x) {length(x)}, names(:, 1)); [~, intVecSort] = sortrows(names, [2, 1]);

答案 2 :(得分:0)

file exchange submission也可以派上用场 -

sort_nat

它可以作为文件名的输入字符串获取并按自然顺序排序。

>> imgFilesDirName = {'imag1.jpg', 'imag10.jpg', 'imag11.jpg', 'img2.jpg', 'img20.jpg'};
>> sort_nat(imgFilesDirName)

ans = 

    'imag1.jpg'    'imag10.jpg'    'imag11.jpg'    'img2.jpg'    'img20.jpg'

免责声明:我直接从Matlab文件交换中复制了文本,它不是我的任何方式

function [cs,index] = sort_nat(c,mode)
    % Set default value for mode if necessary.
    if nargin < 2
        mode = 'ascend';
    end

    % Make sure mode is either 'ascend' or 'descend'.
    modes = strcmpi(mode,{'ascend','descend'});
    is_descend = modes(2);
    if ~any(modes)
        error('sort_nat:sortDirection',...
            'sorting direction must be ''ascend'' or ''descend''.')
    end

    % Replace runs of digits with '0'.
    c2 = regexprep(c,'\d+','0');

    % Compute char version of c2 and locations of zeros.
    s1 = char(c2);
    z = s1 == '0';

    % Extract the runs of digits and their start and end indices.
    [digruns,first,last] = regexp(c,'\d+','match','start','end');

    % Create matrix of numerical values of runs of digits and a matrix of the
    % number of digits in each run.
    num_str = length(c);
    max_len = size(s1,2);
    num_val = NaN(num_str,max_len);
    num_dig = NaN(num_str,max_len);
    for i = 1:num_str
        num_val(i,z(i,:)) = sscanf(sprintf('%s ',digruns{i}{:}),'%f');
        num_dig(i,z(i,:)) = last{i} - first{i} + 1;
    end

    % Find columns that have at least one non-NaN.  Make sure activecols is a
    % 1-by-n vector even if n = 0.
    activecols = reshape(find(~all(isnan(num_val))),1,[]);
    n = length(activecols);

    % Compute which columns in the composite matrix get the numbers.
    numcols = activecols + (1:2:2*n);

    % Compute which columns in the composite matrix get the number of digits.
    ndigcols = numcols + 1;

    % Compute which columns in the composite matrix get chars.
    charcols = true(1,max_len + 2*n);
    charcols(numcols) = false;
    charcols(ndigcols) = false;

    % Create and fill composite matrix, comp.
    comp = zeros(num_str,max_len + 2*n);
    comp(:,charcols) = double(s1);
    comp(:,numcols) = num_val(:,activecols);
    comp(:,ndigcols) = num_dig(:,activecols);

    % Sort rows of composite matrix and use index to sort c in ascending or
    % descending order, depending on mode.
    [unused,index] = sortrows(comp);
    if is_descend
        index = index(end:-1:1);
    end
    index = reshape(index,size(c));
    cs = c(index);
end