【问题标题】:Computing grayscale images' standard deviation at each pixel计算每个像素的灰度图像标准差
【发布时间】:2019-07-10 01:01:10
【问题描述】:

以下是家庭作业的一部分:

计算一个矩阵,保存灰度图像在每个像素处的标准偏差(即,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)));

我正在试图弄清楚如何获得应该代替 ??? 的内容。非常感谢您提出正确方向的建议。

【问题讨论】:

    标签: image matlab image-processing computer-vision


    【解决方案1】:

    您已经计算了平均图像。但是,如果要计算标准差,则必须记住所有图像的所有图像强度。请记住,标准偏差定义为每行和列位置的图像强度与该位置的平均强度之间的平方差之和的平方根除以减去 1 的图像数量。因此,我建议您存储图像作为 4D 矩阵,其中第四维表示每个图像的颜色版本。我们还需要另一个类似的变量,但它将是一个 3D 矩阵,将存储每个图像在三维上的灰度版本。之后,我们终于可以计算出每个空间位置的标准差。你甚至可以在三维中使用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);
    

    【讨论】:

    • 感谢您的帮助。我将遍历每一行并尝试完全理解您编写的代码。之后,我会将您的答案标记为正确。谢谢!
    • @user3727648 不客气!如果您需要更多说明,请告诉我。我很乐意为您提供任何进一步的帮助。
    • 在循环中,您将存储每个通道的灰度图像,但这会弄乱我需要计算平均彩色图像的代码部分(每个 RGB 通道的平均值)。想法?
    • @user3727648 你说你不需要彩色的平均图像。我可以改变它,这样你就可以保留两者。最初的问题是在灰度图像上计算这个。你需要实际的彩色图像吗?
    • 好的,我可以计算彩色图像的平均值,但我们可以将其分开。它不会影响其余代码。
    猜你喜欢
    • 2021-04-18
    • 2017-09-01
    • 1970-01-01
    • 1970-01-01
    • 2022-01-19
    • 1970-01-01
    • 2016-03-22
    • 1970-01-01
    • 2012-04-24
    相关资源
    最近更新 更多