在图像处理中,经常要做矩形平滑滤波或其它操作,要用到模板运算。其中可能会遇到窗口的求和问题。
对每个窗口都要求和,然后求均值,而且是对每个像素点进行遍历,当然是个费时的过程。一般的操作可能是这样的:
sum=0;
for(i=0;i<w;i++)
{
for(j=0;j<w;j++)
{
sum+=Array[m+i][n+j];
}
}
mean=sum/(w*w);
其中Array是图像的灰度矩阵,w是窗口的大小(w*w)。后来因为在特征提取的过程中用的时间太长了,于是思考如何减小这些特征提取的时间(在w比较大时)。窗口在滑动的过程中,只是改变了一部分数据,即前面出去了一列,后面进来了一列。如果保存原来的和,只加减这两部分,可以减小很多求加运算的循环。就改成了下面的代码:只在第一次求一个总和,后面就在前面的基础上求两列的和,再加减就行了。
for(m=0;m<m_Height;m++)
{
for(n=0;n<m_Width;n++)
{
if(n==0)
{
sum=0;
for(i=0;i<w;i++)
{
for(j=0;j<w;j++)
{
sum+=Array[m+i][n+j];
}
}
}
else
{
a=b=0;
for(i=0;i<w;i++)
{
a+=Array[m+i][n+w-1];
b+=Array[m+i][n-1];
}
sum=sum+a-b;
}
mean=sum/(w*w);
}
}
开始我还为自己的发现欣喜不已,后来无意之中看到有文献已经讨论了该问题,而且研究了更一般的情况。不过是哪篇文献,自己也记不清了。现在有如此多的研究工作者,有些非常的细节的问题都被研究到了。