如果您担心找到平均 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。这不会改变图像的实际内容。这只是为了显示目的。