Finding average of images using for loop.
    9 vues (au cours des 30 derniers jours)
  
       Afficher commentaires plus anciens
    
Hi,
I have hundreds of images, I Want to read the first 3 image and then get the average and save them in a file. I want to do this for all the images. I tried to do this but I am able to find the average of only first 3 image. Can anyone please help me to implement the following code in a loop? I'm also attaching 6 image for example to try them in a loop. 
Folder='G:\trail\'
outdir = 'G:\Avg_Image';
I0 = imread('pic1_1_1.tiff');
sumImage = double(I0); % Inialize to first image.
for i=2:3 % Read first 3 image
  rgbImage = imread(['pic1_1_',num2str(i),'.tiff']);
  sumImage = sumImage + double(rgbImage);
end
meanImage = sumImage / 3;
imshow(uint8(meanImage));
outname1 = fullfile(outdir, "pic1_");
imwrite(meanImage, outname1);
I will appreciate any kind of help. 
0 commentaires
Réponse acceptée
  Image Analyst
      
      
 le 17 Mar 2023
        @Raushan your code is not very robust at all.  I've made many improvements and it's below.  I also have a demo to sum images which is even more robust and can handle resizing the images.  It's an attachment.
% Optional initialization steps
clc;    % Clear the command window.
close all;  % Close all figures (except those of imtool.)
clear;  % Erase all existing variables. Or clearvars if you want.
workspace;  % Make sure the workspace panel is showing.
format long g;
format compact;
fontSize = 18;
inputFolder= pwd; %'D:\';
outputFolder = 'D:\';
% Count the max number of files we expect to find.
files = dir(fullfile(inputFolder, '*.tif*'));
numFiles = numel(files)
sumImage = 0;
imageCounter = 0;
for k = 1 : numFiles
    inputBaseFileName = files(k).name;
    thisFileName = fullfile(inputFolder, sprintf('pic_%d.tiff', k));
    % thisFileName = fullfile(files(k).folder, files(k).name);
    fprintf('Processing #%d of %d : "%s".\n', k, numFiles, thisFileName);
    % See if the file exists.
    if ~isfile(thisFileName)
        % It doesn't exist.  Alert user and continue.
        fprintf('    "%s" does not exist.  Skipping it.\n', inputBaseFileName);
        continue; % Skip this image.
    end
    % Read in image.
    rgbImage = imread(thisFileName);
    % If the size is not 3 skip it.
    if size(rgbImage, 3) ~= 3
        fprintf('    "%s" is not RGB full color.  Skipping it.\n', inputBaseFileName);
        continue;
    end
    % Display this input image.
    subplot(1, 2, 1);
    imshow(rgbImage);
    impixelinfo;
    title(files(k).name, 'Interpreter','none');
    axis('on', 'image');
    drawnow;
    % Sum the image in.
    try
        sumImage = sumImage + double(rgbImage);
    catch ME
        % Couldn't sum, probably because the size didn't match the size of the prior image(s).
        fprintf('    "%s" could not be summed.  Skipping it.\n', inputBaseFileName);
        continue;
    end
    imageCounter = imageCounter + 1;
    % Every 10th image, write out the average picture.
    if imageCounter == 10
        baseFileName = sprintf('Average Pic starting at %d images.tiff', imageCounter);
        fullOutputFileName = fullfile(outputFolder, baseFileName);
        averageImage = uint8(sumImage / imageCounter);
        % Display average image.
        subplot(1, 2, 2);
        imshow(averageImage);
        impixelinfo;
        title(baseFileName, 'Interpreter','none');
        axis('on', 'image');
        drawnow;
        % Write out to disk.
        imwrite(averageImage, fullOutputFileName);
        % Reset everything to zero for the next set of 10 images.
        sumImage = 0;
        imageCounter = 0;
    end
end
% Print out how many average images we have
outputFiles = dir(fullfile(outputFolder, 'Average Pic*.tif*'));
numOutputFiles = numel(outputFiles);
fprintf('There are %d average pictures now.\n', numOutputFiles);
Plus de réponses (1)
  Raushan
 le 16 Mar 2023
        
      Modifié(e) : Walter Roberson
      
      
 le 17 Mar 2023
  
      
      2 commentaires
  Walter Roberson
      
      
 le 17 Mar 2023
				imwrite(uint8(sumImage/10), outname1);
That is wrong. You would want
imwrite(uint8(floor(sumImage/k)), outname1);
Voir également
Catégories
				En savoir plus sur Loops and Conditional Statements dans Help Center et File Exchange
			
	Community Treasure Hunt
Find the treasures in MATLAB Central and discover how the community can help you!
Start Hunting!


