平均彩色图像集和标准差

时间:2017-02-07 01:06:32

标签: image matlab image-processing computer-vision

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

我已经这样做了,但不是通过平均RGB通道。 (对于ex 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);

我不确定这是否正确。我对平均图像如何有用感到困惑。 而且,我无法获得保持标准偏差的矩阵。

感谢任何帮助。

1 个答案:

答案 0 :(得分:3)

如果您担心找到平均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));

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

Variance http://www.cdn.sciencebuddies.org/Files/475/9/DerivVarEqn.jpg

来源: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.这不会更改图像的实际内容。这仅用于显示目的。