我试图在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
}
}
答案 0 :(得分:3)
这是一个研究得很好的话题,例如this Wikipedia article on variance calculations。
有时会提到的一个问题是累积数值误差;你需要决定这可能是一个问题。如果您计算的值在范围内相似,则可能不是问题。
答案 1 :(得分:3)
关于计算效率,我建议使用卷积在傅立叶域而不是时间(图像)域中执行此操作。请记住,卷积是傅里叶域中的简单乘法。就像频谱密度函数是作为频率函数分解的方差的时间序列一样,可以将其扩展为图像的二维。应该比嵌套的for循环好得多。
目前我没有关于我的代码。但是这种技术已被用于像“快速模板匹配”这样的算法中,用于物体检测或图像配准。
答案 2 :(得分:0)
即使在如此少量的像素上使用浮点数也应该没问题。通常,如果你在整个图像上做这种事情,你需要双打。
答案 3 :(得分:0)
您应该更好地使用图像积分来快速进行局部均值和标准差计算! 在这种情况下,您只需要正确计算图像每个位置的遮罩窗口的边界。它会快得多。 如果您需要示例代码,请询问。