MATLAB: Rotating and saving images to folder: error during loop

MATLABrotatesave

Hi folks,
I'm trying to read all files in a folder, rotatet them 90 degrees, then save them to the same folder. I need to do this 3 times (90, 180, 270 degrees).
The following is my code.
folder = "C:\Users\ME\Pictures\Filler\";
S = dir(fullfile(folder,'*.png'));
for k = 1:250
currentfilename = fullfile(folder,S(k).name);
I = imread(currentfilename);
I2 = imrotate(I, 90);
I2Name = sprintf('%d -1.png', k);
I2Path = fullfile(folder, I2Name);
imwrite(I2, I2Path);
I3 = imrotate(I, 180);
I3Name = sprintf('%d -2.png', k);
I3Path = fullfile(folder, I3Name);
imwrite(I3, I3Path);
I4 = imrotate(I, 270);
I4Name = sprintf('%d -3.png', k);
I4Path = fullfile(folder, I4Name);
imwrite(I4, I4Path);
end
Running it seems to throw up some errors. Some of the files are repeated or rotated incorrectly. Can anyone spot the reason please? I don't really know enough about matlab to see what I've done wrong!

Best Answer

  • Teshan:
    I believe the problem comes about because you are, in subsequent runs, processing images from a prior run. You should either skip those images, like I did in my code below, or write those images to a folder different than your input folder.
    folder = pwd;
    S = dir(fullfile(folder,'*.png'));
    fprintf('Found %d PNG files.\n', length(S));
    hFig = figure;
    hFig.WindowState = 'maximized';
    angles = [90, 180, 270];
    for k = 1 : 3
    originalFilename = fullfile(folder, S(k).name);
    [~, baseFileNameNoExt, ~] = fileparts(lower(originalFilename))
    originalImage = imread(originalFilename);
    fprintf('\nRead in %s.\n', originalFilename);
    subplot(2, 2, 1);
    imshow(originalImage);
    title(['Original image : ', S(k).name], 'FontSize', 15);
    % Skip files that are the outputs from prior runs.
    % They will contain '-n.png'
    if endsWith(baseFileNameNoExt, ' -1') || ...
    endsWith(baseFileNameNoExt, ' -2') || ...
    endsWith(baseFileNameNoExt, ' -3')
    continue; % Skip this image.
    end
    for angleIndex = 1 : 3
    thisAngle = angles(angleIndex);
    rotatedImage = imrotate(originalImage, thisAngle);
    subplot(2, 2, angleIndex + 1);
    imshow(rotatedImage);
    % Create new name with -1, -2, or -3 appended to the original base file name.
    rotatedName = sprintf('%s -%d.png', baseFileNameNoExt, angleIndex);
    title(rotatedName, 'FontSize', 15);
    fullFileName = fullfile(folder, rotatedName);
    imwrite(rotatedImage, fullFileName);
    fprintf(' Wrote out %s.\n', fullFileName);
    end
    promptMessage = sprintf('Do you want to Continue processing,\nor Quit processing?');
    titleBarCaption = 'Continue?';
    buttonText = questdlg(promptMessage, titleBarCaption, 'Continue', 'Quit', 'Continue');
    if contains(buttonText, 'Quit')
    break;
    end
    end
    close(hFig);