高斯滤波原理剖析

高斯滤波和高斯模糊一样吗

答:一样。不加“高斯”这个限定词时,滤波的范畴要远远大于模糊,后者只是前者的一个子集。当加上“高斯”限定以后,所指代的卷积操作就是同一个操作了,因为根据方程 滤波 = 卷积( 输入信号 ,卷积模板 ),当两个操作的输入信号和卷积模板都一样时,这两个操作就是一个操作了。

 

那为什么不直接叫高斯滤波,还起个高斯模糊的名字呢?

那是因为这个滤波的效果看起来像是把图像给弄模糊了,所以又有了“高斯模糊”的叫法。

 

平滑也是类似的道理。

 

首先请记住一句话:滤波是掩膜(mask)和图像的卷积。

再记住第二句话:滤波过程分两步: 1)计算掩膜 2)卷积——掩膜上每一个位置的值和图像上对应位置的像素值的乘加运算

 

讲课开始:

 

1. 高斯分布不是高斯模糊/滤波

看起来很好笑,但对于当时初学者的我来说,确实被坑的不浅。

高斯模糊,听起来很高大上,其实就是一种很基础的数学算法应用,不要被“高斯”迷惑了双眼,它并没有高斯本人那么深不可测。。
高斯模糊之所以叫高斯模糊,是因为它运用了高斯的正态分布的密度函数,我记得是大二时候学的:

其中,μ是x的均值,σ是x的标准差(评论提醒)。由于每次计算都以当前计算点为原点,所以μ等于0。于是公式进一步简化为:

在图形上,正态分布是一种钟形曲线,越接近中心,取值越大,越远离中心,取值越小。
计算平均值的时候,我们只需要将"中心点"作为原点,其他点按照其在正态曲线上的位置,分配权重,就可以得到一个加权平均值。
而他的二维方程是:



也就是说,把它运用于图像算法中,就会使图像出现模糊的效果:




 

1.1 高斯分布

绝大多数讲高斯滤波的文章或者博客都会给出下面的公式:

高斯分布公式:

以及告诉你它的形状和性质:

(如图为一维高斯分布示意图,决定了分布对称中心,决定了分布的形状——越小形状越瘦高,\sigma越大越矮胖)

 

然而在这里高斯分布公式到底是做什么的?

答:计算高斯滤波用的掩膜(Mask)

1.2 利用高斯分布求高斯掩膜

1.2.1 均值掩膜

首先看一下掩膜到底长什么样子,我们来一个最简单的——3x3均值滤波的掩膜:

(对,就这个样子)可以看到,均值掩膜内所有系数均相等——为1/9,且他们的和为1。同理可知5x5均值滤波的掩膜。

1.2.2 高斯掩膜

高斯分布公式终于要出场了!

有个小问题:我们上面给出的高斯分布公式是一维的,但掩膜是二维的怎么办?很简单,只需要把数值变为向量即可:(其中不必纠结于系数,因为它只是!一个! 常数!并不会影响互相之间的比例关系并且最终都要进行归一化,所以在实际计算时我们是忽略它而只计算后半部分的)当为二维时,。这个公式其实可以表示任意维度的高斯分布。需要特别注意的是:本质上都是二维空间中的坐标:是掩膜内任一点的坐标,是掩膜中心的坐标!(统计学中称为均值,即坐标的均值)

敲黑板再说一遍: x和u, 是位置,是坐标!

于是乎,对于图像中任意一点(x,y),它周围的坐标为:

中间的(x,y)就是我们公式中的了, 当遍历(x-1,y-1)...(x+1,y+1)时,

 向量计算然后求平方得出

(这里取sigma为1.0)

归一化就得到高!斯!掩!膜!了

<img src="https://pic3.zhimg.com/50/v2-0d1b6a4c714641309b05a89343425cac_hd.jpg" data-rawwidth="305" data-rawheight="146" class="content_image" width="305">如何归一化?作者:祥子
链接:https://www.zhihu.com/question/54918332/answer/141738672
来源:知乎
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

我从最基础的开始举例子,以一维方程做起,将x,y轴分别进行高斯模糊。

我们假设σ为1.5吧,假设有x轴上三个像素点,中间点为原点:
 


带入公式后,三个点的值为:

这3个像素的权重总和等于0.80858986,如果只计算这3个点的加权平均,还必须让它们的权重之和等于1,因此上面3个值还要分别除以0.80858986。

那么,这个数字有什么用呢?

我们都知道,每一个像素点,决定它色差的是RGB值,计算加权平均的时候要分别计算;

现在我们把GB设为0,只计算R,我们来假设一个点,R值为27,125,22:


将三个数字乘以加权平均值后,分别为6.8391,61.6725,6.8391

而中心点的R值就变为 6.8391+61.6725+6.8391 = 75.5137 记为75;

变为:
 


就使像素点相对于旁边两点更加柔和了。

所以你看,高斯掩膜的求解与位置(x,y)无关,因为在计算过程中x,y被抵消掉了,

因!此!——

所以你看,高斯掩膜的求解与位置(x,y)无关,因为在计算过程中x,y被抵消掉了,

因!此!——

高斯掩膜只要求解一次就够了! 当得到了这个模板,对图像的所有像素用这同一套模板去卷积就OK了!

1.3 利用高斯掩膜和图像进行卷积求解高斯模糊

这个过程就很简单了,如下图所示,没有别的,就是卷积:

117 = 102 * 0.075 + 108 * 0.124 + 110 * 0.075 +119 * 0.124 + 120 * 0.204 + 110 * 0.124 +129 0.075 + 130 * 0.124 + 132 * 0.075

 

130 = 172 * 0.075 + 175 * 0.124 + 172 * 0.075 +112 * 0.124 + 123 * 0.204 + 88 * 0.124 +98 0.075 + 115 * 0.124 + 128 * 0.075

所有像素都用图上的那一套模板进行卷积运算,最终得到滤波的结果。

 

 

2. 算法实现

原理如果懂了,算法实现应该很简单,而且opencv也有现成函数可以调用,但opencv的效率其实也不高,可以看这个回答OpenCV已经将图像处理(识别)的算法写成函数了,那我们还有必要去学习这些算法不? - mpcv 的回答 - 知乎在这里提两个可以加速的地方:1)把二维高斯滤波拆成两个一维高斯滤波——先x方向再y方向 他们是等价的,有兴趣的同学可以自行查找下相关证明。例如:一个5x5的二维高斯滤波,每个像素需要进行25次乘、 24次加 运算;变为2个1x5的高斯滤波后,每个像素进行 10次乘 、8次加 运算;

2)利用查表代替乘运算可以看到,在卷积的过程中,所有的乘运算都是发生在掩膜系数和像素值之间。而且: ① 掩膜系数是固定的:对于1x5的掩膜,只有3个不同的参数; ② 像素值的范围也是固定的: 0~255,256个值;

 

因此,所有系数和像素值的乘积只有3x256=768种不同的结果。 所以,这768个结果我们直接把它保存在一张表中即可!等用时直接查表!!!

 

于是上文的10次乘、8次加运算进一步缩减为了只剩8!次!加 !运 ! 算 !

 

最终我们的运算量改变为:

25次乘、24次加 -------------> 8次加!!!

 

3. 双边滤波

双边滤波其实很简单,它只是比高斯滤波多了一种掩膜而已。两种掩膜都是套用高斯分布公式得出来的,只是其中的代表的含义不同而已。求第一个掩膜所用的高斯分布中,代表掩膜中每一个点的位置,其中为掩膜中心的位置;求第二个掩膜所用的高斯分布中,代表掩膜中每一个点的像素亮度值,其中为掩膜中心的像素亮度值;(这里有一个是需要注意的:第二个掩膜是需要每次都求取的,因为像素的亮度值无法预先确定,不是维持一个固定不变的pattern)

对这就是双边滤波,不光考虑了像素在空间中位置远近程度的影响,还考虑了像素亮度相近程度的影响。

仅此而已。

 

作者:mpcv
链接:https://www.zhihu.com/question/54918332/answer/142137732
来源:知乎
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

c代码实现:

循环遍历各个点,归一化之后放入临时数据:

在x轴方向上进行高斯模糊:

y轴同理:

代码出自:作者:祥子
链接:https://www.zhihu.com/question/54918332/answer/141738672
来源:知乎
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

  • 26
    点赞
  • 122
    收藏
    觉得还不错? 一键收藏
  • 8
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 8
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值