2017-02-07 64 views
1

我学习图像分析,并试图平均集彩色图像,并在每个像素平均彩色图像的设置和标准偏差

我这样做得到标准差,但它不是通过平均RGB通道。 (for 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); 

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

任何帮助表示赞赏。

+0

是什么让你觉得这是不正确的?它对所有图像的R,G和B通道取平均值。 – Suever

+0

在当今世界,它被广泛用于在将图像馈送到深度网络之前预处理图像。把它看作正常化。 –

+0

@Suever我更新了我的问题,我很困惑,因为我没有采取RGB通道的意思。 – user2769614

回答

3

如果您担心寻找平均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的显示这并不会改变图像的实际内容。这仅用于显示目的。

相关问题