高斯模糊算法是一种把高斯原理运用到模糊领域的一种算法。我们都知道,图像中微分和查分操作能够消除掉高频的信息,从而留下低频的信息已达到模糊的效果。所以简单的模糊算法有均值、中值模糊等等。
对于均值和中值模糊而言,我们丢失的信息更多。如中值而言,kernel模板中对应的大部分像素值都没有对center中心点有贡献。换句话说,整个kernel范围内的像素点只有一个像素点对处理点产生了作用。所以,随着模糊kernel尺寸的增大,模糊效果越明显,但丢失的信息和细节也就越多。对于均值滤波器而言,虽然整个kernel范围内的像素点都对最终的结果起到了一定的作用(贡献)。但是每个像素点的贡献出力是一样的。很明显这是不合理的。因为如果两个像素点的离得很远时,一般我们认为这两个像素的相关性较小。离得越远相关性越小,这是符合我们直觉,也具有物理意义的。但是在均值滤波中,无论离得多远的像素,都将得到相同的权重(平均)。也就是基于这个点,先贤们提出了一系列新的算法。其中,高斯滤波器是其中的一种。
高斯滤波是如何来解决上述的问题的呢?高斯滤波把正太分布(高斯分布)引入到图像处理中来。下面是标准正太分布(高斯分布中的一种)的分布图:
我们可以看到,高斯分布是可以拿来作为权重分布的。因为离中心点 0 越远的点对应的值越小。所以我们用来做模糊的kernel中的权重值就可以用高斯分布来取值。然后用这个kernel来处理我们的图像。每个像素点的值是其周围像素点以及本身的加权平均数。这就是高斯模糊的思想。
下面是高斯分布的1d的公式:
我们可以看出,只要我们确定了标准差sigma,我们就可以通过 x 和 μ 的距离来求解当前 x 对应的权重值。一般为了方便表示和计算机的算法实现,我们采用模板来表示。如果我们取 sigma = 1.5,我们可以得到下面的模板:
接着就是类似滑动窗口一般,扫过我们的图像并且求解每个对应点的加权平均值。这就是模糊算法的核心思想以及它的算法原理和计算过程。
下面是我自己c++复现的高斯模糊算法效果图(左边是原图,右边是模糊图。kernel size 为3*3):