参考任明武老师的文章,把均值滤波以模板形式实现,真是很快
图片
对于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);
}