Вычисление стандартного отклонения изображений в градациях серого в каждом пикселе - PullRequest
0 голосов
/ 15 февраля 2019

Следующее является частью задачи домашней работы:

Вычислить матрицу, содержащую стандартное отклонение изображений в градациях серого в каждом пикселе (т. Е. X (i, j) содержит стандартное отклонение для всех серых изображений)интенсивность пикселей в строке i, столбце j).

У меня есть (или, кажется, есть) среднее изображение в оттенках серого.У меня тоже среднее изображение в цвете, но не думаю, что имеет отношение к этой проблеме.Я знаю, что стандартное отклонение требует, чтобы я прошел и суммировал разницу между каждым значением и средним значением, но не уверен, как туда добраться.

% Matrix initialization
setsum1 = zeros(215, 300, 3, 'double');
% Loop through all the image files in one directory and store in the matrix
filelist = dir('set1\*.jpg');
for i=1:length(filelist)
imname = ['\set1\' filelist(i).name];
nextim = imread(imname);
setsum1 = setsum1 + im2double(nextim);
end
% Compute the average image in color
setsum1_rgb = setsum1./length(filelist);
% Compute the average image in grayscale
setsum1_gray = rgb2gray(setsum1_rgb);
% grayscale images’ standard deviation at each pixel
deviation_setsum1_gray = sqrt(sum(power(??? - setsum1_gray, 2)));

Я пытаюсь выяснить, как получить то, что должно идтина месте ???.Предложения в правильном направлении будут высоко оценены.

1 Ответ

0 голосов
/ 16 февраля 2019

Вы уже вычислили среднее изображение.Тем не менее, вы должны помнить все интенсивности изображения для всех изображений, если вы хотите вычислить стандартное отклонение.Помните, что стандартное отклонение определяется как квадратный корень из суммы квадратов разностей между интенсивностями изображения для строки и местоположения столбца со средней интенсивностью в этом месте, деленной на число изображений, вычтенных на 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);
...