引言

        在对图像的处理中,我们常常需要识别图像中的边缘:列如在自动化驾驶中,需要对道路的边线进行识别检测;在特征提取的时候,我们也需要识别出特定物体的边缘,方便后续进行特征提取。边缘检测是图像处理中的重要一环,本篇文章将围绕边缘检测进行讨论。

1、边缘检测的原理

        图像的边缘也就是图像中像素灰度值发生变化的像素点的集合。对于一幅图像,如果我们将图像像素的每一行和每一列的灰度值都描述成一个函数(图1),那么就可以通过计算函数导数的方式来找到灰度值发生变化的点。导数值大,则说明灰度值变化大;导数值等于0,则说明灰度值没有发生变化;导数值小,则说明灰度值变化小。图像边缘也就是对应着灰度函数图像中函数值发生突然改变的区域(点的集合)。


android图像边缘检测 图像识别边缘检测_图像处理

图1:将图像中的一行像素的灰度值描述成一个函数

        可能读者会注意到:上文提到的导数——也就是图像的梯度——是微分中的概念,而微分针对于连续可导的函数,但我们的像素灰度值实际上只是一个离散的函数,因此对应着差分。微分和差分的核心思想一致,我们在边缘检测的过程中,会运用微分的思想来进行指导,但在实际操作中,我们会用差分的方式来实现边缘检测。

        导数(梯度)的表达式:
android图像边缘检测 图像识别边缘检测_灰度值_02
        将微分导数的概念引入到图像处理,android图像边缘检测 图像识别边缘检测_图像处理_03代表像素点的位置(只考虑一个方向,android图像边缘检测 图像识别边缘检测_灰度值_04方向同理),那么当前像素沿android图像边缘检测 图像识别边缘检测_图像处理_03轴的灰度梯度值就等于后一个像素的灰度值减去当前像素的灰度值(前向差分):
android图像边缘检测 图像识别边缘检测_图像处理_06
        反向差分:
android图像边缘检测 图像识别边缘检测_灰度值_07
        中心差分:
android图像边缘检测 图像识别边缘检测_计算机视觉_08
        二阶导数是一阶导数的导数,描述一阶导数的变化趋势,因此,我们可以根据一阶导数推出:
android图像边缘检测 图像识别边缘检测_计算机视觉_09
        计算图像中每个像素灰度的一阶导数和二阶导数的方法是图像卷积。给定图2中的3x3算子来说,其图像卷积的过程就是计算算子系数与核覆盖区域的灰度值的乘积之和。(注:波器、掩膜、掩码、核、卷积核、模板、窗口、算子等,其实都是一个东西,在不同的领域叫法不同。在信号领域称为滤波器,在数学里称为核、算子,在图像处理领域称为掩膜、掩码,在深度学习领域称为卷积核,在本文中我们统一称为算子)


android图像边缘检测 图像识别边缘检测_灰度值_10

图2:3x3的算子

        也就是说对应算子中心点的梯度值为:
android图像边缘检测 图像识别边缘检测_计算机视觉_11
        android图像边缘检测 图像识别边缘检测_灰度值_12是对应的系数,android图像边缘检测 图像识别边缘检测_android图像边缘检测_13为像素点的灰度值。

2、算子分类

        算子就是边缘检测的核心,在进行边缘检测的时候,我们常常会根据实际情况选择合理的算子来进行边缘检测,接下来我们将深入讨论各类算子。

2.1、Roberts交叉算子

        以对角差分为例,即Robert交叉算子,它可以描述为使用两个2x2的卷积模板对影像进行处理:
android图像边缘检测 图像识别边缘检测_差分_14
        由公式7展开:
android图像边缘检测 图像识别边缘检测_图像处理_15
        算子模板(图3):


android图像边缘检测 图像识别边缘检测_图像处理_16

图3:Roberts交叉算子模板

2.2、Prewitt算子

        Prewitt算子是一种一阶微分算子的边缘检测,利用像素点上下、左右邻点的灰度差,在边缘处达到极值检测边缘,去掉部分伪边缘,对噪声具有平滑作用 。其原理是在图像空间利用两个方向模板与图像进行邻域卷积来完成的,这两个方向模板一个检测水平边缘,一个检测垂直边缘。

        prewitt算子定义:

android图像边缘检测 图像识别边缘检测_计算机视觉_17

        水平方向的梯度:
android图像边缘检测 图像识别边缘检测_图像处理_18
        垂直方向的梯度:
android图像边缘检测 图像识别边缘检测_android图像边缘检测_19
        对角线方向的梯度:
android图像边缘检测 图像识别边缘检测_android图像边缘检测_20
        Prewitt算子的模板:


android图像边缘检测 图像识别边缘检测_图像处理_21

图4:Prewitt算子模板

2.3、Sobel算子

        Sobel算子是在Prewitt算子的基础上改进而来:在中心系数上使用一个权值2,相比较Prewitt算子Sobel算子能够较好地抑制(平滑)噪声。Sobel算子的定义:
android图像边缘检测 图像识别边缘检测_计算机视觉_22
        水平梯度:
android图像边缘检测 图像识别边缘检测_android图像边缘检测_23
        垂直梯度:
android图像边缘检测 图像识别边缘检测_灰度值_24
        Robel算子的模板:


android图像边缘检测 图像识别边缘检测_灰度值_25

图5:Robel算子模板

2.4、Laplacian算子

android图像边缘检测 图像识别边缘检测_差分_26是二维空间的二阶可微的实函数,则android图像边缘检测 图像识别边缘检测_差分_26的拉普拉斯算子定义为:
KaTeX parse error: Got group of unknown type: 'internal'
        将上面的微分转换为差分形式:
android图像边缘检测 图像识别边缘检测_图像处理_28

        算子模板:
android图像边缘检测 图像识别边缘检测_差分_29

2.5、各类算子的效果比对


android图像边缘检测 图像识别边缘检测_图像处理_30

图6:算子效果对比

3、Canny边缘检测算法

        Canny边缘检测于1986年由JOHN CANNY首次提出。Canny发现,在不同视觉系统上对边缘检测的要求较为类似,因此,可以实现一种具有广泛应用意义的边缘检测技术。Canny边缘检测不是一种算子,而是基于各类算子基础上的一套边缘检测的算法。Canny边缘检测算法可以分为以下5个步骤:

        1、使用高斯滤波器,平滑图像,滤除噪声:
android图像边缘检测 图像识别边缘检测_灰度值_31
        2、计算图像中每个像素点的梯度强度和方向:
android图像边缘检测 图像识别边缘检测_灰度值_32
                其中M(x,y)为梯度强度,α(x,y)为梯度方向。

        3、应用非极大值抑制,消除边缘检测带来的杂散响应:

                (1)将当前像素的梯度强度与沿正负方向上的两个像素进行比较;

                (2)如果当前像素的梯度强度与另外两个像素相比最大,则该像素点保留为边缘点,否则该像素点将被抑制。

        非极大值抑制是一种边缘稀疏技术,主要作用在于"廋边"。

        4、应用双阈值检测来确定真实的和潜在的边缘:

                在施加非极大值抑制之后,剩余的像素可以更准确地表示图像中的实际边缘。然而,仍然存在由于噪声和颜色变化引起的一些边 缘像素。用弱梯度值过滤边缘像素,并保留具有高梯度值的边缘像素。如果边缘像素的梯度值高于高阈值,则将其标记为强边缘像 素;如果边缘像素的梯度值小于高阈值并且大于低阈值,则将其标记为弱边缘像素;如果边缘像素的梯度值小于低阈值,则会被抑 制。

        5、连接分析,抑制孤立的弱边缘:

                被划分为强边缘的像素点已经被确定为边缘,因为它们是从图像中的真实边缘中提取出来的。对于弱边缘像素,可以从真实边缘 提取也可以是因噪声或颜色变化引起的。通常,真实边缘引起的弱边缘像素能够连接到强边缘像素,而噪声响应无法连接。为了进行 边缘连接分析,我们可以通过查看弱边缘像素及其8个邻域像素,只要其中一个为强边缘像素,则该弱边缘点就保留为真实的边缘。