Вы уже вычислили среднее изображение.Тем не менее, вы должны помнить все интенсивности изображения для всех изображений, если вы хотите вычислить стандартное отклонение.Помните, что стандартное отклонение определяется как квадратный корень из суммы квадратов разностей между интенсивностями изображения для строки и местоположения столбца со средней интенсивностью в этом месте, деленной на число изображений, вычтенных на 1. Поэтому я рекомендую вам сохранитьизображения в виде матрицы 4D, где четвертое измерение представляет цветовую версию каждого изображения.Нам также понадобится другая похожая переменная, но это будет трехмерная матрица, в которой будет храниться версия изображения в градациях серого в третьем измерении.После этого мы можем наконец вычислить стандартное отклонение каждого пространственного местоположения.Вы даже можете использовать функцию std
в третьем измерении, поэтому вам даже не нужно использовать среднее изображение, но я предполагаю, что вы должны сделать это самостоятельно.
Предполагая, что вы не можете использовать std
, что-то вроде этого будет работать:
% Loop through all the image files in one directory and store in the matrix
filelist = dir('set1\*.jpg');
% Matrix initialization
% New - Make the fourth channel as long as the total number of images
setsum1 = zeros(215, 300, 3, numel(filelist), 'double');
% New - Store the grayscale images too
% Make the third channel as long as the total number of images
setsum1_gray = zeros(215, 300, numel(filelist), 'double');
for i=1:length(filelist)
imname = ['\set1\' filelist(i).name];
nextim = imread(imname);
setsum1(:,:,:,i) = im2double(nextim); % New - Store the image per channel
setsum1_gray(:,:,i) = rgb2gray(setsum1(:,:,:,i)); % New - Grayscale convert the colour image and save it
end
% Compute the average image in grayscale and colour
% Note - I would just use mean if possible
% setsum1_gray_avg = mean(setsum1_gray, 3);
% setsum1_rgb = mean(setsum1, 4);
% ... or
% setsum1_gray_avg = sum(setsum1_gray, 3) / numel(filelist);
% setsum1_rgb = sum(setsum1, 4) / numel(filelist);
setsum1_rgb = zeros(215, 300, 3);
setsum1_gray_avg = zeros(215, 300);
for i = 1 : numel(filelist)
setsum1_rgb = setsum1_rgb + setsum1(:,:,:,i);
setsum1_gray_avg = setsum1_gray_avg + setsum1_gray(:,:,i);
end
setsum1_rgb = setsum1_rgb / numel(filelist);
setsum1_gray_avg = setsum1_gray_avg / numel(filelist);
% Now compute standard deviation for each pixel
% Note - I would use std if possible
% setsum1_stddev = std(setsum1_gray, [], 3);
setsum1_stddev = zeros(215, 300);
for i = 1 : numel(filelist)
setsum1_stddev = setsum1_stddev + (setsum1_gray(:,:,i) - setsum1_gray_avg).^2;
end
setsum1_stddev = sqrt((1 / (numel(filelist) - 1)) * setsum1_stddev);