[db:标题]

摘要:除了传统的IIR递归滤波器实现高斯模糊,我们还可以使用多次了均值滤波逼近高斯滤波以及扩展二项式滤波来逼近高斯滤波,他们一个比较好的有点时有着较少的浮点计算或完全么有浮点计算,因此,在一些特定的硬件条件下有着较好的应用场景。
关于高斯模糊,我在我早期的博客里也有两篇文章予以描述: SSE图像算法优化系列二:高斯模糊算法的全面优化过程分享(一)。 SSE图像算法优化系列二:高斯模糊算法的全面优化过程分享(二)。   一个是递归的IIR滤波器,一个Deriche滤波器,他们的速度都已经是顶级的了,而且都能够使用SIMD指令优化,其中有讲到《Recursive implementation of the Gaussian filter》这个方法在半径较大的时候会出现一定的瑕疵,核心原因是大半径会导致其中的某些系数特别小,因此造成浮点精度的丢失,因此,要保证效果就必须在计算过程中使用double数据类型,而使用了double,普通的sse指令集的增速效果就不是很明显了,因此,为了速度可能需要使用AVX或者更高的AVX512。   那么这两个都是从离散角度来说比较精确的算法,因为有了SIMD指令,使得他们在PC上即使有了大量的浮点计算,计算的速度也比较不错。在一些特殊的情况或者特殊的硬件中,还是存在浮点计算非常慢的情况(比如FPGA),因此,还是有不上资料和文章提出了一些近似的算法来减少计算量,在celerychen分享的文章快速高斯滤镜算法中,除了上述两个算法外,还提到了均值滤波逼近高斯滤波以及扩展二项式滤波逼近高斯滤波两个方法。 一、Binomial Filter二项式滤波滤波器 多年前我也看过这个文章,那个时候也没有怎么在意,最近在研究halcon的一些滤波器时,偶尔翻到其binomial_filter函数的说明时,突然看到其有如下的一些描述: The binomial filter is a very good approximation of a Gaussian filter that can be implemented extremely efficiently using only integer operations. Hence, binomial_filter is very fast.   他说这个binomial filter只有整形的计算,因此速度非常快。 是不是这样的呢,于是我在网络上搜索这方面的资料,大部分都指向 extended binomial filter for Fast gaussian Blur这篇文章,可以参考道客巴巴里的这篇文章:https://www.doc88.com/p-1896883955048.html   这个文章写得很详细,有着非常丰富的数学推导和公式,还有很多漂亮的曲线,比如下面这个描述了不同的半径r和不同的n阶毕竟的精度。当n=3或者n=4时,也已经相当的准确了。特别是半径比价大时(模糊程度)。   这个文章的末尾提供了相关的参考代码,但是那个参考代码有点凌乱,而且不知道是啥语言,好像是可以为PS写插件的脚本一样,不过大概还是能猜到是什么意思。 celerychen在他的文章说里面几个重要的初始参数不知道如何确定,主要可能是指的scaleFactor,这个其实因该他做界面预览时的一些缩放值,我们做算法时,他就是1。 另外,那个文章是比较早的了,作者提供的那个网站里有提供最新的一批代码,详细见:Efficient Gaussian Blur Algorithm 这个文章中提供的一个重要的计算公式即为:    其中为用户输入的标准差,n为离散的阶数,r为计算得到半径,由上式我们可以推到出:                 r= sqrtf(12.0 * Sigma * Sigma / n + 1)    注意,这里得到的r应该是浮点数,但是浮点数,我们无法进行均值模糊,所以一般需要四舍五入取整。当然,如果要求精度的,那就要去上下两个半径值分别做处理后,在对结果进行插值。   这个公式在均值滤波逼近高斯滤波 的文章里也有提到。
阅读全文