高斯模糊、Canny边缘检测

一、 高斯模糊

1.1 图像卷积滤波

对于滤波来说,它可以说是图像处理最基本的方法,可以产生很多不同的效果。以下图来说

图中矩阵分别为二维原图像素矩阵,二维的图像滤波矩阵(也叫做卷积核,下面讲到滤波器和卷积核都是同个概念),以及最后滤波后的新像素图。

对于原图像的每一个像素点,计算它的领域像素和滤波器矩阵的对应元素的成绩,然后加起来,作为当前中心像素位置的值,这样就完成了滤波的过程了。

可以看到,一个原图像通过一定的卷积核处理后就可以变换为另一个图像了。而对于滤波器来说,也是有一定的规则要求的。

  • ① 滤波器的大小应该是奇数,这样它才有一个中心,例如3x3,5x5或者7x7。有中心了,也有了半径的称呼,例如5x5大小的核的半径就是2。
  • 滤波器矩阵所有的元素之和应该要等于1,这是为了保证滤波前后图像的亮度保持不变。当然了,这不是硬性要求了。
  • ③ 如果滤波器矩阵所有元素之和大于1,那么滤波后的图像就会比原图像更亮,反之,如果小于1,那么得到的图像就会变暗。如果和为0,图像不会变黑,但也会非常暗。
  • ④ 对于滤波后的结构,可能会出现负数或者大于255的数值。对这种情况,我们将他们直接截断到0和255之间即可。对于负数,也可以取绝对值。

1.2 高斯模糊

有了前面的知识,我们知道如果要想实现高斯模糊的特点,则需要通过构建对应的权重矩阵来进行滤波。通常,采用高斯函数进行权重矩阵的构建。

  一维高斯函数

 正态分布中,越接*中心点,取值越大,越远离中心,取值越小。

 可以看到,G(x)的跟sigma的取值有极大的关系。sigma取值越大,图像越*缓,sigma取值越小,图像越尖锐。


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

  二维高斯函数

二维高斯是构建高斯滤波器的基础。可以看到,G(x,y)在x轴y轴上的分布是一个突起的帽子的形状。这里的sigma可以看作两个值,一个是x轴上的分量sigmaX,另一个是y轴上的分量sigmaY。

对图像处理可以直接使用sigma并对图像的行列操作,也可以用sigmaX对图像的行操作,再用sigmaY对图像的列操作。它们是等价的。
当sigmaX和sigmaY取值越大,整个形状趋*于扁*;当sigmaX和sigmaY取值越小,整个形状越突起

其中,μ是x的均值,σ是x的方差。因为计算*均值的时候,中心点就是原点,所以μ等于0。

(1)在核大小固定的情况下,sigma值越大,权值分布越*缓。因此,邻域各个点的值对输出值的影响越大,最终结果造成图像越模糊。
(2)在核大小固定的情况下,sigma值越小,权值分布越突起。因此,邻域各个点的值对输出值的影响越小,图像变化也越小。假如中心点权值为1,其他点权值为0,那么最终结果是图像没有任何变化。
(3)sigma固定时,核越大图像越模糊。
(4)sigma固定时,核越小图像变化越小

  构建权重矩阵

假定中心点的坐标是(0,0),那么距离它最*的8个点的坐标如下:

 为了计算权重矩阵,需要设定σ的值。假定σ=1.5,则模糊半径为1的权重矩阵如下:

 这9个点的权重总和等于0.4787147,如果只计算这9个点的加权*均,还必须让它们的权重之和等于1,因此上面9个值还要分别除以0.4787147,得到最终的权重矩阵。

  计算高斯模糊

权重矩阵,就可以计算高斯模糊的值了, 假设现有9个像素点,灰度值(0-255)如下:

  ×  = 

将这9个值加起来,就是中心点的高斯模糊的值。

对所有点重复这个过程,就得到了高斯模糊后的图像。如果原图是彩色图片,可以对RGB三个通道分别做高斯模糊。

  函数原型:

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

  参数:
    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 :边缘扩展点插值类型(borderInterpolate()有关详细信息,请参见link )

  边缘点的处理

如果一个点处于边界,周边没有足够的点,怎么办?

一个变通方法,就是把已有的点拷贝到另一面的对应位置,模拟出完整的矩阵。

二、Canny边缘检测

 图像分割的应用十分普遍,它是指将数字图像细分为多个图像子区域的过程。图像分割的目的是简化或改变图像的表示形式,使得图像更容易理解和分析。

图像分割方法主要包括阈值处理(二值化)、聚类法、边缘检测和区域生长等。对于图像分割问题的求解没有统一范式,通常要与领域知识充分结合,才能更为有效地解决。

边缘检测是基于灰度突变来分割图像的常用方法,其实质是提取图像中不连续部分的特征。

这些包括(i)深度上的不连续、(ii)表面方向不连续、(iii)物质属性变化和(iv)场景照明变化。 边缘检测是图像处理和计算机视觉中,尤其是特征提取中的一个研究领域。

Canny 边缘检测算子是John F. Canny于 1986 年开发出来的一个多级边缘检测算法。更为重要的是 Canny 创立了边缘检测计(Computational theory of edge detection)解释这项技术如何工作。

Canny 的目标是找到一个最优的边缘检测算法,最优边缘检测的含义是:

  • 好的检测 - 算法能够尽可能多地标识出图像中的实际边缘。
  • 好的定位 - 标识出的边缘要尽可能与实际图像中的实际边缘尽可能接*。
  • 最小响应 - 图像中的边缘只能标识一次,并且可能存在的图像噪声不应标识为边缘。

Canny算法实现过程

1、图像灰度化:只有灰度图才能进行边缘检测

2、去噪:噪声点将影响边缘检测的准确性

3、求解梯度幅度和方向:利用sobel算子求解

4、非极大值抑制:定位准确的边缘同时可缩小边缘线宽

5、双阀值算法检测及连接边缘

  1. 图像灰度化

Canny算法通常处理的图像为灰度图,因此如果摄像机获取的是彩色图像,那首先就得进行灰度化。对一幅彩色图进行灰度化,就是根据图像各个通道的采样值进行加权*均。以RGB格式的彩图为例,通常灰度化采用的方法主要有:

        方法1:Gray=(R+G+B)/3;

        方法2:Gray=0.299R+0.587G+0.114B;

注意1:至于其他格式的彩色图像,可以根据相应的转换关系转为RGB然后再进行灰度化;

注意2:在编程时要注意图像格式中RGB的顺序通常为BGR

  2、去噪

噪声的存在影响到边缘的检测,首先将图片进行高斯去噪,高斯去噪其实就是一个低通滤波器,滤除高频噪声。

高斯滤波,即使用即使用某一尺寸的二维高斯核与图像进行卷积。由于数字图像的数据形式为离散矩阵,高斯核是对连续高斯函数的离散*似,通过对高斯曲面进行离散采样和归一化得出。例如,尺寸为 [公式] ,标准差为 [公式] 的高斯核为:

 在确定高斯核后,将其与图像进行离散卷积即可。

  3、求解梯度幅度和方向

Sobel算子是两个 [公式] 的矩阵,分别为 [公式]和 [公式]。前者用于计算图像 [公式] 方向像素梯度矩阵 [公式] ,后者用于计算图像 [公式] 方向像素梯度矩阵 [公式]。具体形式为:

 

 其中, [公式] 为灰度图像矩阵,且此处的 [公式] 表示互相关运算(卷积运算可视为将卷积核旋转180°后的互相关运算)。

需要说明的是,图像矩阵坐标系原点在左上角,且 [公式] 正方向为从左到右, [公式] 正方向为从上到下。则由

 可计算得到梯度强度矩阵 [公式] 。

  4、非极大值抑制

在求出的幅值图像中,可能存在多个较大幅值临*的情况,但真正的边缘点只有一个,针对这样的情况我们进行非极大值抑制,找出局部最大值,从而可以剔除大部分非边缘点

如上图所示,我们对每一像素点做如下处理:

根据该像素点的梯度方向,确定需进行比较的临*像素点位置,如上图所示(过像素点方向为梯度方向的直线与该像素点临*的八像素点所组成的矩形,相交于dTmp1和dTmp2,根据g1,g2a和g3,g4估算出交点像素,

如果该像素点均大于两交点像素则为极大值边缘点,否则为非边缘点)。

  5、双阀值算法检测及连接边缘

  1. 滞后阈值: 最后一步,Canny 使用了滞后阈值,滞后阈值需要两个阈值(高阈值和低阈值):

    1. 如果某一像素位置的幅值超过 高 阈值, 该像素被保留为边缘像素。
    2. 如果某一像素位置的幅值小于 低 阈值, 该像素被排除。
    3. 如果某一像素位置的幅值在两个阈值之间,该像素仅仅在连接到一个高于 高 阈值的像素时被保留。

    Canny 推荐的 高:低 阈值比在 2:1 到3:1之间。

算法流程图

 函数原型:

edge = cv2.Canny(image, threshold1, threshold2[, edges[, apertureSize[, L2gradient ]]]) 
参数解释
  • image:源图像
  • threshold1:阈值1
  • threshold2:阈值2
  • apertureSize:可选参数,Sobel算子的大小
  • L2gradient:一个布尔值,如果为真,则使用更精确的L2范数进行计算(即两个方向的倒数的*方和再开放),否则使用L1范数(直接将两个方向导数的绝对值相加)
其中,较大的阈值2用于检测图像中明显的边缘,但一般情况下检测的效果不会那么完美,边缘检测出来是断断续续的。所以这时候用较小的第一个阈值用于将这些间断的边缘连接起来。
函数返回的是二值图,包含检测出的边缘

参考链接

Canny边缘检测算法

Canny算法 边缘检测

高斯模糊的算法

高斯模糊原理,算法

原文地址:https://www.cnblogs.com/saseng/p/13513289.html