平均彩色图像集和标准偏差

Average set of color images and standard deviation

我正在学习图像分析并尝试对彩色图像集进行平均并获得每个像素的标准差

我这样做过,但不是通过平均RGB通道。 (对于前 rchannel = I(:,:,1))

filelist = dir('dir1/*.jpg');
ims = zeros(215, 300, 3);
for i=1:length(filelist)
    imname = ['dir1/' filelist(i).name];
    rgbim = im2double(imread(imname));
    ims = ims + rgbim;
end

avgset1 = ims/length(filelist);
figure;
imshow(avgset1);

我不确定这是否正确。我对平均图像有何用处感到困惑。 另外,我无法得到包含标准偏差的矩阵。

感谢任何帮助。

如果您担心找到平均 RGB 图像,那么您的代码是正确的。我喜欢的是,您在累积平均值之前使用 im2double 转换了图像,因此您使所有内容都变得 double 精确。正如 Parag 所说,找到平均图像非常有用,尤其是在机器学习中。在进行图像分类之前找到一组图像的平均图像是很常见的,因为它允许每个像素的动态范围在归一化范围内。这使得学习算法的训练能够快速收敛到最优解,并提供最佳参数集以促进分类的最佳准确性。


如果您想找到均值 RGB 颜色,这是所有图像的平均颜色,那么您的代码不正确。

您已经对存储在 sumrgbims 中的所有通道分别求和,因此您现在需要做的最后一步是拍摄此图像并分别对每个通道求和。在此之后两次调用 sum in the first and second dimensions chained together will help. This will produce a 1 x 1 x 3 vector, so using squeeze 以删除单例维度并获得表示所有图像的平均 RGB 颜色的 3 x 1 向量。

因此:

mean_colour = squeeze(sum(sum(sumrgbims, 1), 2));

为了回答你的第二个问题,我假设你想找出所有图像中每个像素值的标准差。除了在循环内累积每个图像之外,您需要做的是累积每个图像的 square。之后就知道标准差是方差的平方根,方差等于平均平方和减去均方。我们有了平均图像,现在您只需对平均图像进行平方,然后用平均平方和减去它。只是为了确保我们的数学是正确的,假设我们有一个信号 X,均值为 mu。鉴于我们的信号中有 N 个值,因此方差等于:

来源:Science Buddies

标准差就是上述结果的平方根。因此,我们将为每个像素独立计算。因此你可以修改你的循环来为你做这件事:

filelist = dir('set1/*.jpg');
sumrgbims = zeros(215, 300, 3);
sum2rgbims = sumrgbims; % New - for standard deviation
for i=1:length(filelist)
    imname = ['set1/' filelist(i).name];
    rgbim = im2double(imread(imname));
    sumrgbims = sumrgbims + rgbim;
    sum2rgbims = sum2rgbims + rgbim.^2; % New
end

rgbavgset1 = sumrgbims/length(filelist);

% New - find standard deviation
rgbstdset1 = ((sum2rgbims / length(filelist)) - rgbavgset.^2).^(0.5);

figure;
imshow(rgbavgset1, []);

% New - display standard deviation image
figure;
imshow(rgbstdset1, []);

另外为了确保,我缩放了每个 imshow 调用的显示,因此最小值被映射到 0,最大值被映射到 1。这不会改变实际内容图片。这仅用于显示目的。