28 高斯模糊

opencv知识点:

  • 高斯模糊 - GaussianBlur

本课所解决的问题:

  • 如何理解高斯模糊?
  • 如果实现高斯模糊?

1.高斯模糊

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

模糊

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

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

均值模糊可以做到让图片模糊,但是它的模糊不是很平滑。
不平滑主要在于距离中心点很远的点与距离中心点很近的所带的权重值相同,产生的模糊效果一样。

高斯平滑和高斯滤波 高斯模糊和高斯平滑_权重

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

高斯模糊

引用文章: 高斯模糊与图像卷积滤波一些知识点

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

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

高斯平滑和高斯滤波 高斯模糊和高斯平滑_正态分布_02

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

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

高斯平滑和高斯滤波 高斯模糊和高斯平滑_正态分布_03

正态分布的密度函数叫做"高斯函数"(Gaussian function)。
它的一维形式是:

高斯平滑和高斯滤波 高斯模糊和高斯平滑_卷积核_04

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

高斯平滑和高斯滤波 高斯模糊和高斯平滑_卷积核_05

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

高斯平滑和高斯滤波 高斯模糊和高斯平滑_高斯平滑和高斯滤波_06

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

高斯模糊示例

高斯平滑和高斯滤波 高斯模糊和高斯平滑_卷积核_07

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

高斯平滑和高斯滤波 高斯模糊和高斯平滑_正态分布_08

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

2.高斯模糊演示

在opencv中,如果我们想要实现高斯模糊,就要用到这样一个API

  • GaussianBlur

具体介绍如下

GaussianBlur
	使用高斯滤镜模糊图像
		共6个参数 
			第1个参数 输入
			第2个参数 输出
			第3个参数 高斯卷积核size(必须是整数和奇数,可以是0,然后根据sigma计算他们)
			
			第4个参数 x方向的高斯核标准差
			第5个参数 y方向的高斯核标准差(如果sigmaY = 0,则设置其 = sigmaX)
					(如果两个标准差都为0,则根据高斯卷积核size计算)
					(官方文档建议:三个参数最好都指定)
					
					 虽然size和sigma都可以实现模糊,但sigma的影响更大
					
			第6个参数 图像边缘处理方式
					(超出初学者范围,暂不学习)

演示如下

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

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

	imshow("原图", image);
	
	Mat dst;
	GaussianBlur(image, dst, Size(5, 5), 15);

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

}

高斯平滑和高斯滤波 高斯模糊和高斯平滑_卷积核_09

本课所用API查阅

GaussianBlur