目录

  1. 高斯模糊GaussianBlur()中参数详解
    1.1. 由参数解释产生的问题
  2. 深入理解前的准备:高斯函数、图像滤波处理及卷积核
  3. 解释1.1的问题
  4. 权重矩阵、高斯模糊的流程

摘要

  1. 高斯滤波是一种线性平滑滤波
  2. 高斯滤波是对整幅图像进行加权平均的过程,每一个像素点的值都由其本身和邻域内的其他像素值经过加权平均后得到。高斯滤波的具体操作是:用一个模板(或称卷积、掩模)扫描图像中的每一个像素,用模板确定的邻域内像素的加权平均灰度值去替代模板中心像素点的值。
  3. 基于二维高斯函数,构建权重矩阵,进而构建高斯核,最终对每个像素点进行滤波处理(平滑、去噪)

1.高斯模糊GaussianBlur()中参数详解

1)原型:

  • cv2.GaussianBlur( SRC,ksize,sigmaX [,DST [,sigmaY [,borderType ] ] ] ) →DST

2)参数:

  • src –输入图像;图像可以具有任何数量的信道,其独立地处理的,但深度应CV_8U,CV_16U,CV_16S,CV_32F或CV_64F。
  • dst –输出与图像大小和类型相同的图像src。
  • ksize –高斯核大小。 ksize.width 并且 ksize.height 可以有所不同,但它们都必须是正数和奇数。或者,它们可以为零,然后从计算 sigma*。
  • sigmaX – X方向上的高斯核标准偏差。
  • sigmaY – Y方向上的高斯核标准差;如果 sigmaY 为零,则将其设置为等于 sigmaX;如果两个西格玛均为零,则分别根据ksize.width 和 进行计算 ksize.height(getGaussianKernel()有关详细信息,请参见 link);完全控制的结果,无论这一切的语义未来可能的修改,建议指定所有的ksize,sigmaX和sigmaY。
    borderType –像素外推方法。
1.1.由参数解释产生的问题

    不知道你初次看到这些参数是否很迷惑,是否能迅速理解其代表的含义和作用,反正我是迷的很,在我们对GaussianBlur()进行简单使用时,很多时候我们并不理解我们所设置的参数的内涵及其背后的处理是怎么样的,在我的学习过程中,我提出了如下的几个问题

  1. 高斯核是什么?ksize作用是什么或者说起到什么效果?
  2. 为什么存在对两个标准差的设置?二维高斯函数不也只有一个标准差吗?
  3. 高斯模糊的具体实现流程

这些问题先放一下,先来看一下必要的准备知识

2.高斯函数、卷积核

首先来看高斯分布(即正态分布):
正态分布:
X ~ N(\mu, \sigma^2):随机变量X的取值x_i和其对应的概率值P(X = x_i) 满足正态分布(高斯函数)

2.1 一维高斯分布

概率密度函数(高斯函数):在这里插入图片描述在这里插入图片描述

2.2二维高斯分布

概率密度函数:这里的u、v对应图像坐标系下像素点的坐标
在这里插入图片描述
可视化图片为:该图来源于link
在这里插入图片描述

2.3线性滤波处理及卷积核
线性滤波与卷积的基本概念

        线性滤波可以说是图像处理最基本的方法,它可以允许我们对图像进行处理,产生很多不同的效果。做法很简单。首先,我们有一个二维的滤波器矩阵(有个高大上的名字叫卷积核)和一个要处理的二维图像。然后,对于图像的每一个像素点,计算它的邻域像素和滤波器矩阵的对应元素的乘积,然后加起来,作为该像素位置的值。这样就完成了滤波过程。
在这里插入图片描述
关于卷积核的具体处理实例可在这里查看,便于理解:link
贴一张那篇文章中的实例图:
在这里插入图片描述

3.解释1.1的问题

3.1高斯核是什么?ksize作用是什么或者说起到什么效果?
  • 高斯核可看作卷积核,同样为二维滤波器矩阵,不同的是高斯核在普通卷积核的基础上进行了加权处理(后面会讲的权重矩阵)
  • ksize即规定这个二维滤波器矩阵的形状
3.2为什么存在对两个标准差的设置?二维高斯函数不也只有一个标准差吗?

        由cv2.GaussianBlur()原型我们知道,存在两个标准差sigmaX和sigmaY的设置,部分博客中会提到这两个sigma分别是对X,Y方向(也可说u、v方向,都是针对图像坐标系)的标准差,但基本均未给出其处理逻辑、过程,让人很是迷惑。

关于参数的问题,当然要看官方文档/源代码

首先,cv2.GaussianBlur中调用了getGaussianKernel()接口

那么来看getGaussianKernel
在这里插入图片描述
        这个函数可以根据ksize和sigma求出对应的高斯核,而返回值是一个一维高斯核。
        其中需要注意的是,如果sigma为非正数(负数或0)的话,就会根据ksize来自动计算sigma,计算公式为sigma = 0.3*((ksize-1)*0.5-1)+0.8

        在官方解释中,我们可以看到:两个这样产生的一维高斯核可以传递给sepFilter2D函数

那我们来看看这个函数是怎么处理这俩个一维高斯核的:
在这里插入图片描述
        cv2.sepFilter2D函数传入两个一维kernel,然后对图像的每一行以kernelX为卷积核做卷积,对结果的每一列以kernelY为卷积核做卷积,最后归一化得到的高斯滤波后的图像。

对 这 个 问 题 我 们 得 出 结 论 : \color{#FF3030}{对这个问题我们得出结论:} opencv实现的高斯滤波,是对传入的sigmaX,
sigmaY分别产生两个一维卷积核,然后分别再行和列上做卷积,其中sigmaX和sigmaY如果没有传入参数,则由ksize计算得到。

4.权重矩阵、高斯模糊的过程

        高斯模糊或者说高斯滤波(高斯核)对图像进行滤波处理的一大特点就是对中心点邻域像素值进行‘加权平均’后将值赋予中心像素点,这里便用到了权重矩阵,该矩阵就是基于二维高斯函数(概率密度函数)得到的。

偷懒一下,这部分基本未更改,来自link

权重矩阵:
假设高斯核(3*3),即对中心点领域内8个点进行加权平均,那么原始矩阵如下:
在这里插入图片描述
假定在此矩阵中的中心点的坐标是(0,0),那么距离它最近的8个点的坐标如上图所示。

为了计算权重矩阵,需要自己设定σ模糊半径(指的就是你中心点与周围像素的距离取值后所确定的值)。我们来定σ=1.5,则模糊半径为1.5的权重矩阵如下:
在这里插入图片描述

为了完成权重矩阵的归一化,我们还需要对上面的各值进行除于他们的总值的计算,目的是让最终的图像通道的权重总值为1,不然使用总值大于1的卷积滤镜会让图像偏亮,小于1的卷积滤镜会让图像偏暗。这九个权重值的总和等于0.4787147,所以我们直接进行除法运算,得到以下的权重矩阵。
这个权重矩阵就是我们最终得到的高斯核!!即滤波器矩阵
在这里插入图片描述
假设我们有一个图像矩阵也就是未经过处理的图像矩阵,他们的灰度值如下图所示(如果是彩色RGB图像则需要分别计算3个通道的色值):
在这里插入图片描述
高斯模糊后的灰度值矩阵,有效数据是中心点数值
在这里插入图片描述
一个图像的所有点都进行如上过程,就能最终得到高斯模糊后的图像。

参考文档:
link1
link2
link3
link4
link5

Logo

为开发者提供学习成长、分享交流、生态实践、资源工具等服务,帮助开发者快速成长。

更多推荐