探究Canny算法中高斯滤波器的实现原理

很不幸的是Typecho并不支持Latex公式,无法显示公式内容;
更不幸的是,我也懒得再上传图床了,就这样吧~
感兴趣的可以直接点下面的button,可以直接下载

引言

对于图像识别过程,在图像的获取、运输、转换过程中, 由于环境(光、磁等干扰)的复杂,图像都会收到不同程度的噪声污染。这些噪音分为电子噪声、 光子噪声、 斑点噪声等。 若信噪过低, 噪声逐渐变成可见的颗粒形状, 造成十分难受的颗粒感。 除了主观观感下降之外,绝大多数的噪声都是肉眼不可见的,但是这些污染会遮盖图像中重要的细节,对于图像识别产生巨大的影响,造成卷积模型训练准确率高但实际准确率低等问题。

所以对于所获取的图像在进行卷积训练和测试之前需要对图像进行去噪操作,以保证图像的干净,减少污染。本论文探讨课题中Canny边缘检测算法中高斯滤波器的实现原理。

高斯滤波器

Canny算法的第一步就是利用高斯平滑滤波(也叫高斯模糊/高斯平滑/高斯滤波)去除噪音,因为噪声就是灰度变化很大的地方,所以容易被识别为伪边缘。高斯滤波是一种线性平滑滤波,适用于消除高斯噪声,比均值滤波处理图像更平滑,边界保留效果更好,能保留更多的特征;广泛应用于图像处理的减噪过程。

简单来说,所谓的“模糊”就是让中心点取四周点的平均值,但是如果简单的直接取平均值(即均值滤波)未免有些不合理。正态分布显然是一种可取的权重分配模式(以中心点为原点,离中心点越远所分配的权重越小),让图像的过渡更为的平滑。但是图像都是二位的,所以我们需要使用到正态分布的二维形式,也就是“高斯函数”

​例如:像素值和卷积核的乘积

$$ \begin{array}{lll} 13 * 0.0123 & 17 * 0.1183 & 15 * 0.00123 \\ 14 * 0.1183 & 19 * 0.1523 & 20 * 0.1183 \\ 16 * 0.0123 & 12 * 0.1183 & 21 * 0.00123 \end{array} \\ 从中我们很明显的看到,距离中心核19越远的卷积核,其系数越小。这意味着,对图像的模糊程度越小。 $$

1、首先需要计算卷积核

​假定我们在这里使用一个3*3的卷积滑动,并且计算坐标为(x,y)的像素点,如下图:

$$ \begin{array}{|l|l|l|} \hline(x-1,y+1) & (x,y+1) & (x+1,y+1) \\ \hline(x-1,y) & {\color{Red} (x,y)} & (x-1,y) \\ \hline(x-1,y-1) & (x,y-1) & (x+1,y-1)\\ \hline \end{array} $$

​ 利用公式(x-u),u=(x,y)化简,可得:

$$ \begin{array}{|l|l|l|} \hline(-1,1) & (0,1) & (1,1) \\ \hline(-1,0) & {\color{Red}(0,0)} & (1,0) \\ \hline(-1,-1) & (0,-1) & (1,-1) \\ \hline \end{array} $$

2、计算权重矩阵

​ 利用“高斯函数”,假定σ = 1.5,并设置模糊半径为1,得到以下权重矩阵:

$$ \begin{array}{|l|l|l|} \hline 0.0453542 & 0.0566406 & 0.0453542 \\ \hline 0.0566406 & {\color{Red}0.0707355} & 0.0566406 \\ \hline 0.0453542 & 0.0566406 & 0.0453542 \\ \hline \end{array} $$

​ 再进行归一化处理(使9个点的权重加起来的总和 = 1),即可得到最终的权重矩阵:

$$ \begin{array}{|c|c|c|} \hline 0.0947416 & 0.118318 & 0.0947416 \\ \hline 0.118318 & {\color{Red} 0.147761} & 0.118318 \\ \hline 0.0947416 & 0.118318 & 0.0947416 \\ \hline \end{array} $$

3、计算高斯模糊值

​ 使每个点的灰度值*对应的权重值,即

$$ \begin{array}{|c|c|c|} \hline x_1*0.0947416 & x_2*0.118318 & x_3*0.0947416 \\ \hline x_4*0.118318 & {\color{Red}x_5 * 0.147761} & x_6*0.118318 \\ \hline x_7*0.0947416 & x_8*0.118318 & x_9*0.0947416 \\ \hline \end{array} $$

​ 最后,再将这九个点加起来,就是中心点(x,y)的高斯模糊值

上面的过程可以重复多遍,重复的遍数越多,图像就越模糊,但是噪声也越小,所以在实际操作中需要多次实验尝试出最佳的处理次数。

高斯滤波器的应用

GaussianBlur () 函数解析

利用高斯滤波器平滑图像,使用指定的高斯核输入图像进行卷积。

  • C++ 代码实现:

  1. GaussianBlur (InputArray src, OutputArray dst, Size ksize, double sigmaX, double sigmaY=0, int borderType = BORDER_DEFAULT )

  • Python参数一致,调用OpenCV中cv2.GaussianBlur即可,故不做演示;
  • 参数解析:

    1. src – 输入图像; 可以有任意数量的信道(即如果输入图像为未做灰度化处理的RGB颜色空间,这个函数可以对RGB三个通道分别进行高斯模糊),但是深度必须符合 CV_8U, CV_16U, CV_16S, CV_32F or CV_64F.
    2. dst – 输出图像;尺寸和类型需和输入图像src一致
    3. ksize – 表示卷积核(高斯核)大小 ( ksize(w,h) , w-像素宽度,h-像素高度)
    4. sigmaX – 表示卷积核在X方向上的标准差,控制的是权重比例;
    5. sigmaY – 表示卷积核在Y方向上的标准差;默认为None,如果sigmaY=0,则它将被设置为与sigmaX相等的值。如果这两者都为0,则它们的值会从ksize中计算得到

$$ \text { sigma }=0.3 *((\text { ksize }-1) * 0.5-1)+0.8 $$

 **即**

$$ sigmaX =0.3 \times((k s i z e . width-1) \times 0.5-1)+0.8 \\ sigmaY =0.3 \times((k s i z e . height-1 ) \times 0.5-1)+0.8 $$

  1. borderType – 推断图像外部像素的某种边界模式。有默认值BORDER_DEFAULT
最后修改:2022 年 06 月 21 日 12 : 04 AM
如果觉得我的文章对你有用,请随意赞赏