Search code examples
imagematlabrenamedilation

How to rename many images after processing with different parameters


Hello dear programmers, I have a sequence of images and I would like to perform dilation on each of them with different dilation parameters. Then, I would like to save the processed images with new name including both the old name and the corresponding dilation parameter. My codes are as follows.

Input_folder = 
Output_folder = 
D = dir([Input_folder '*.jpg']);
Inputs = {D.name}';
Outputs = Inputs; % preallocate
%print(length(Inputs));
for k = 1:length(Inputs)
    X = imread([Input_folder Inputs{k}]);
    dotLocations = find(Inputs{k} == '.');
    name_img = Inputs{k}(1:dotLocations(1)-1);
    image1=im2bw(X);
    vec = [3;6;10];
    vec_l = length(vec);
    for i = 1:vec_l
    %se = strel('disk',2);
        fprintf(num2str(vec(i)));
        se = strel('diamond',vec(i)); %imdilate
        im = imdilate(image1,se);
        image2 = im - image1;
   
        Outputs{k} = regexprep(Outputs{k}, name_img, strcat(name_img,'_', num2str(vec(i))));
        imwrite(image2, [Output_folder Outputs{k}])
    end
end

As it can be seen, I would like to apply dilation with parameters 3,6 and 10. Let us assume that an image has as name "image1", after processing it, I would like to have "image1_3", "image1_6" and "image1_10". However, I am getting as results "image1_3", "image1_6_3" and "image1_10_6_3". Please, how can I modify my codes to fix this problem?


Solution

  • This is because you rewrite each item of the Outputs variable three times, each time using the previous value to create a new value. Instead, you should use the values stored in Inputs new names. Another mistake in your code is that the size of Inputs and Outputs are equal, while for every file in the input folder, three files must be stored in the output folder.
    I also suggest using fileparts function, instead of string processing, to get different parts of a file path.

    vec = [3;6;10];
    vec_l = length(vec);
    Outputs = cell(size(Inputs, 1)*vec_l, 1); % preallocate
    for k = 1:length(Inputs)
        [~,name,ext] = fileparts([Input_folder Inputs{k}]);
        % load image
        for i = 1:vec_l
            % modify image
            newName = sprintf('%s_%d%s', name, vec(i), ext);
            Outputs{(k-1)*vec_l+i} = newName;
            imwrite(image2, [Output_folder newName])
        end
    end