参考任明武老师的文章,把均值滤波以模板形式实现,真是很快
对于500*376的图像,以大小15的半径做的滤波,速度竟然3个毫秒。如果代码有不足之处,希望批评。
代码:
template<typename M,typename N>
void meanFilter(M* data,N* outputData,int width,int height,int r)
{
assert(data!=NULL);
int i,j,k;
int block=(r<<1)+1;
int winSize=block*block;
double sum;
double* temp=(double*)calloc(width,sizeof(double));
for (k=0;k<block;k++)
{
M* data_ptr=data+k*width;
for (j=0;j<width;j++)
{
temp[j]+=data_ptr[j];
}
}
for (i=r;i<height-r;i++)
{
sum=0;
N* ave_ptr=outputData+i*width;
for (j=0;j<block;j++)
{
sum+=temp[j];
}
for (j=r;j<width-r;j++)
{
ave_ptr[j]=sum/winSize;
if(j<width-r-1)
sum=sum-temp[j-r]+temp[j+r+1];
}
if (i<height-r-1)
{
M* data_ptr1=data+(i-r)*width;
M* data_ptr2=data+(i+r+1)*width;
for(k=0;k<width;k++)
{
temp[k]=temp[k]-data_ptr1[k]+data_ptr2[k];
}
}
}
free(temp);
}
转载于:https://blog.51cto.com/4410175/1441464