如果您担心寻找平均RGB图像,那么您的代码是正确的。我喜欢的是,在积累平均值之前使用im2double
来转换图像,因此您将精确度设置为double
。正如Parag所说,寻找平均图像在机器学习中非常有用。通常在进行图像分类之前找到一组图像的平均图像,因为它允许每个像素的动态范围在标准化的范围内。这使得学习算法的训练能够快速收敛到最佳解决方案,并提供最佳参数集合以促进分类的最佳准确性。
如果你想找到的平均RGB颜色这是平均颜色上的所有图像,则没有你的代码是不正确的。
您已经对所有存储在sumrgbims
中的频道进行了总结,因此您现在需要执行的最后一步是拍摄该图像并分别对每个频道进行求和。在链接在一起的第一维和第二维中拨打sum
的两个电话将有所帮助。这将产生一个1 x 1 x 3
矢量,所以在此之后使用squeeze
删除单例尺寸并得到代表所有图像上平均RGB颜色的矢量即为您获得的矢量。
因此:
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的显示这并不会改变图像的实际内容。这仅用于显示目的。
是什么让你觉得这是不正确的?它对所有图像的R,G和B通道取平均值。 – Suever
在当今世界,它被广泛用于在将图像馈送到深度网络之前预处理图像。把它看作正常化。 –
@Suever我更新了我的问题,我很困惑,因为我没有采取RGB通道的意思。 – user2769614