Код должен просматривать определенную папку для любых подпапок. Затем в каждой подпапке предполагается искать каждое изображение и усреднять их все вместе. Затем это усредненное изображение сохраняется в отдельной папке и повторяется для всех оставшихся подпапок.
Вы можете напрямую протестировать этот код, скопировав и вставив в собственную программу MatLab и изменив заданные каталоги, нет никаких зависимостей.
Моя проблема: переменная sumImage перехватывает ошибку в самом конце цикла for.
finImage = uint8(sumImage / numberOfImages);
Несмотря на то, что sumImage часто использовался в предыдущем коде без ошибок.
Я предположил, что это была загвоздка с циклами for внутри друг друга, однако, когда я впервые запустил программу, она работала в основном безупречно. Однако дальнейшие попытки запустить код привели к ошибке компилятора. Я попытался изменить имя переменной и даже объявить его как двойное в начале, но безрезультатно.
folder1 = dir('C:\Users\slenka\Desktop\Image_Analysis\Original');
numberOfFolders = length(folder1);
for z = 1 : numberOfFolders
currD = folder1(z).name;
cd(currD);
imageFiles = [dir(fullfile(currD,'*.TIF')); dir(fullfile(currD,'*.PNG')); dir(fullfile(currD,'*.BMP')); dir(fullfile(currD,'*.jpg'))];
numberOfImages = length(imageFiles);
for k = 1 : numberOfImages
fullFileName = fullfile(currD, imageFiles(k).name);
fprintf('About to read %s\n', fullFileName);
thisImage=imread(fullFileName);
[thisRows, thisColumns, thisNumberOfColorChannels] = size(thisImage);
if k == 1
% Save the first image.
sumImage = double(thisImage);
% Save its dimensions so we can match later images' sizes to this first one.
rows1 = thisRows;
columns1 = thisColumns;
numberOfColorChannels1 = thisNumberOfColorChannels;
theyreColorImages = numberOfColorChannels1 >= 3;
else
% It's the second, or later, image.
if rows1 ~= thisRows || columns1 ~= thisColumns
% It's not the same size, so resize it to the size of the first image.
thisImage = imresize(thisImage, [rows1, columns1]);
end
% Make sure the colors match - either all color or all gray scale, according to the first one.
if thisNumberOfColorChannels == 3 && numberOfColorChannels1 == 1
% We have color. Need to change it to grayscale to match the first one.
thisImage = rgb2gray(thisImage);
theyreColorImages = false;
elseif thisNumberOfColorChannels == 1 && numberOfColorChannels1 == 3
% We have grayscale. Need to change it to RGB to match the first one.
thisImage = cat(3, thisImage, thisImage, thisImage);
theyreColorImages = true;
end
% Now do the summation.
sumImage = sumImage + double(thisImage); % Be sure to cast to double to prevent clipping. [rows, columns, numberOfColorBands]=size(thisImage);
% It can't display an RGB image if it's floating point and more than 255.
% So divide it by the number of images to get it into the 0-255 range.
if theyreColorImages
displayedImage = uint8(sumImage / k);
else
displayedImage = sumImage;
end
imshow(displayedImage, []);
drawnow;
end
end
%--------------------------------------------------------------------------------
% Compute and display the final image:
finImage = uint8(sumImage / numberOfImages);
baseFileName = sprintf('Image #%d.png', z);
fullFileName = fullfile('C:\Users\slenka\Desktop\Image_Analysis\Averaged', baseFileName);
imwrite(finImage, fullFileName);
end
Ожидаемые результаты: выходная папка с усредненным изображением для каждой папки (всего 10 папок), к которой обращается программа
Фактические результаты: ошибка компилятора и два искаженных изображения в выходной папке
Редактировать: я получил его из-за комментариев, однако теперь, когда он работает, он усредняет все изображения на моем рабочем столе. Есть идеи? Я только хочу усреднить изображения в определенной папке.