单次通过图像的均值和方差

时间:2010-04-09 15:42:15

标签: c image-processing statistics opencv

我试图在opencv中使用3X3窗口覆盖图像(hXw)来计算均值和方差...这是我的代码...这有任何准确性问题吗?或者是否有任何其他有效的方法来执行它一遍。?

int pi,a,b;

for(i=1;i<h-1;i++)
{
    for(j=1;j<w-1;j++)
    {   int sq=0,sum=0;
        double mean=0;
        double var=0;
        for(a=-1;a<=1;a++)
        {
            for(b=-1;b<=1;b++)
            {
                pi=data[(i+a)*step+(j+b)];
                sq=pi*pi;
                sum=sum+sq;
                mean=mean+pi;
            }
        }
        mean=mean/9;
        double soa=mean*mean;//square of average
        double aos=sum/9;//mean of squares
        double var=aos-soa;//variance
    }
}

4 个答案:

答案 0 :(得分:3)

这是一个研究得很好的话题,例如this Wikipedia article on variance calculations

有时会提到的一个问题是累积数值误差;你需要决定这可能是一个问题。如果您计算的值在范围内相似,则可能不是问题。

答案 1 :(得分:3)

关于计算效率,我建议使用卷积在傅立叶域而不是时间(图像)域中执行此操作。请记住,卷积是傅里叶域中的简单乘法。就像频谱密度函数是作为频率函数分解的方差的时间序列一样,可以将其扩展为图像的二维。应该比嵌套的for循环好得多。

目前我没有关于我的代码。但是这种技术已被用于像“快速模板匹配”这样的算法中,用于物体检测或图像配准。

答案 2 :(得分:0)

即使在如此少量的像素上使用浮点数也应该没问题。通常,如果你在整个图像上做这种事情,你需要双打。

答案 3 :(得分:0)

您应该更好地使用图像积分来快速进行局部均值和标准差计算! 在这种情况下,您只需要正确计算图像每个位置的遮罩窗口的边界。它会快得多。 如果您需要示例代码,请询问。