基于积分图的均值滤波算法

来源:互联网 发布:安顺大数据徐杰 编辑:程序博客网 时间:2024/06/06 16:27

均值滤波是典型的线性滤波算法,它是指在图像上对目标像素给一个模板,该模板包括了其周围的临近像素(以目标像素为中心的周围N个像素,构成一个滤波模板,即去掉目标像素本身),再用模板中的全体像素的平均值来代替原来像素值。(百度百科)

我们使用一个模板对图像进行卷积的时候,其效率是非常低的。均值滤波算法也是如此。

在处理不同的卷积的时候,根据模板和算法的特点,总会采取一些加速算法。下面我们就分析一下“基于积分图的均值滤波算法”。

先讲一下积分图的概念:

对于一幅灰度的图像,积分图像中的任意一点(x,y)的值是指从图像的左上角到这个点的所构成的矩形区域内所有的点的灰度值之和。(来自百度百科)

图解:



像素位置为(8,8)的像素值的计算过程为:红色区域像素值的和 +绿色区域像素值的和 + (9,9)像素本身大小

在进行积分图运算后,值为288 + 28 + 8 = 324.

假设模板大小为(9*9),卷积中心为(4,4),那么点像素位置为(4,4)的均值滤波的值 = 324/ (9*9) = 4。

这个例子滤波后的值恰好没有变化!

算法过程:

1)计算图像的积分图(具体编程的时候,一定是计算积分图的同时,把均值计算出来,这样速度会更快)

2)根据积分图的特点计算均值,会省去大量的重复计算

3)尽量规避最后除以模板大小的操作以int类型的乘法和位运算来代替(openCV里的做法)

如:本例最后求均值必须除以9*9=81;324/ (9*9) = 342/81 = 4.0;

1 / (9*9) * pow(2,12)=1/81*4096 =  50.567;  50.567 约等于50

约等于:(324 * 50 + 1 << 11) >>12 = (324 * 50 + 2048) / 4096 = 4.455 取整数为4

结论,算法运行的效率是高于openCV自带的函数的,cvSmooth(src, dst, CV_BLUR, param1, param2);