【问题标题】:Average set of color images and standard deviation平均一组彩色图像和标准偏差
【发布时间】:2017-02-07 01:06:31
【问题描述】:

我正在学习图像分析并尝试平均一组彩色图像并获得每个像素的标准偏差

我已经这样做了,但不是通过平均 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);

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

感谢任何帮助。

【问题讨论】:

  • 是什么让您认为这不正确?它对所有图像的 R、G 和 B 通道进行平均。
  • 在当今世界,它被大量用于在将图像馈送到深度网络之前对其进行预处理。将其视为标准化。
  • @Suever 我更新了我的问题,我很困惑,因为我没有考虑 RGB 通道。

标签: image matlab image-processing computer-vision


【解决方案1】:

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


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

您已分别对存储在sumrgbims 中的所有通道求和,因此您现在需要做的最后一步是获取此图像并分别对每个通道求和。在链接在一起的第一维和第二维中对sum 的两次调用将有所帮助。这将产生一个1 x 1 x 3 向量,因此在此之后使用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。这不会改变图像的实际内容。这只是为了显示目的。

【讨论】: