[ CSDN 转载 ] C++ OpenCV 高斯模糊

文章转载自 C++ opencv高斯模糊_高斯模糊 vc-CSDN博客 , 有删改

1.高斯模糊

常用的模糊算法有两种,一种是均值(盒子),一种是高斯。
现在我们来介绍一下高斯

模糊

首先我们了解一下什么是模糊

模糊就是对图像进行平滑化处理。

平滑化处理,就是用平滑滤波函数,生成卷积核对应的权重,然后对图像进行卷积操作。

均值模糊可以做到让图片模糊,但是它的模糊不是很平滑。

不平滑主要在于距离中心点很远的点与距离中心点很近的所带的权重值相同,产生的模糊效果一样。

而想要做到平滑,让权重值跟随中心点位置距离不同而不同,则可以利用正态分布(中间大,两端小)来实现。
高斯模糊之所以叫高斯模糊,就是因为它运用了高斯的正态分布的密度函数(概率论知识)。
高斯模糊保留的轮廓信息比较多,所以它的模糊平滑要好于均值模糊

高斯模糊

要想实现高斯模糊的特点,就需要通过构建对应的权重矩阵来进行滤波。
接下来我们开始介绍如何利用正态分布构建对应的权重矩阵。

正态分布中,越接近中心点,取值越大,越远离中心,取值越小。
计算平均值的时候,我们只需要将"中心点"作为原点,其他点按照其在正态曲线上的位置分配权重,
就可以得到一个加权平均值。正态分布显然是一种可取的权重分配模式。
7ee32414e39641c7966dcbbbb2430935

如何反映出正态分布?那就要用高斯函数来实现。

上面的正态分布是一维的,而对于图像都是二维的,所以我们需要二维的正态分布。

正态分布的密度函数叫做"高斯函数"(Gaussian function)。

它的一维形式是:

d7441070de3c40bfae61b9934b63239d

其中,μ是x的均值,σ是x的方差。
因为计算平均值的时候,中心点就是原点,所以μ等于0。于是公式进一步简化为:

9012d455a6544b91a57ded973fe40c5b

根据一维高斯函数,可以推导得到二维高斯函数:

13d8ad6c8e35410c824ab9a5d0e27d0f

有了这个函数 ,就可以计算每个点的权重了。

高斯模糊示例

除以总值这个过程就是问之前课上所讲的归一化,目的是让滤镜的权重总值等于1。

将这9个值加起来,就是中心点的高斯模糊的值。对所有点重复这个过程,就得到了高斯模糊后的图像。

2.高斯模糊演示

API

`

1.  GaussianBlur
    
2.      使用高斯滤镜模糊图像
    
3.          共6个参数 
    
4.              第1个参数 输入
    
5.              第2个参数 输出
    
6.              第3个参数 高斯卷积核size(必须是整数和奇数,可以是0,然后根据sigma计算他们)
    

8.              第4个参数 x方向的高斯核标准差
    
9.              第5个参数 y方向的高斯核标准差(如果sigmaY = 0,则设置其 = sigmaX)
    
10.                      (如果两个标准差都为0,则根据高斯卷积核size计算)
    
11.                      (官方文档建议:三个参数最好都指定)
    

13.                       虽然size和sigma都可以实现模糊,但sigma的影响更大
    

15.              第6个参数 图像边缘处理方式
    
16.                      (超出初学者范围,暂不学习)
    

`


示例代码

`

1.  //函数定义
    
2.  void gaussian_blur_demo(Mat& image);
    

4.  //函数实现
    
5.  void QuickDemo::gaussian_blur_demo(Mat& image) {
    

7.      imshow("原图", image);
    

9.      Mat dst;
    
10.      GaussianBlur(image, dst, Size(5, 5), 15);
    

12.      imshow("高斯模糊", dst);
    

14.  }
    

`