引言

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

1、边缘检测的原理

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

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

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

        导数(梯度)的表达式:
∂ f ( x , y ) ∂ x = lim ⁡ ϵ → 0 f ( x + ϵ , y ) − f ( x , y ) ϵ ∂ f ( x , y ) ∂ y = lim ⁡ ϵ → 0 f ( x , y + ϵ ) − f ( x , y ) ϵ . (1) \frac{∂f(x,y)}{∂x}=\lim_{\epsilon \to 0}\frac{f(x+\epsilon,y)-f(x,y)}{\epsilon} \\ \frac{∂f(x,y)}{∂y}=\lim_{\epsilon \to 0}\frac{f(x,y+\epsilon)-f(x,y)}{\epsilon}.\tag{1} xf(x,y)=ϵ0limϵf(x+ϵ,y)f(x,y)yf(x,y)=ϵ0limϵf(x,y+ϵ)f(x,y).(1)
        将微分导数的概念引入到图像处理, x x x代表像素点的位置(只考虑一个方向, y y y方向同理),那么当前像素沿 x x x轴的灰度梯度值就等于后一个像素的灰度值减去当前像素的灰度值(前向差分):
∂ f ∂ x = f ′ ( x ) = f ( x + 1 ) − f ( x ) . (2) \frac{∂f}{∂x}=f'(x)=f(x+1)-f(x).\tag{2} xf=f(x)=f(x+1)f(x).(2)
        反向差分:
∂ f ∂ x = f ′ ( x ) = f ( x ) − f ( x − 1 ) . (3) \frac{∂f}{∂x}=f'(x)=f(x)-f(x-1).\tag{3} xf=f(x)=f(x)f(x1).(3)
        中心差分:
∂ f ∂ x = f ′ ( x ) = f ( x + 1 ) − f ( x − 1 ) 2 . (4) \frac{∂f}{∂x}=f'(x)=\frac{f(x+1)-f(x-1)}{2}.\tag{4} xf=f(x)=2f(x+1)f(x1).(4)
        二阶导数是一阶导数的导数,描述一阶导数的变化趋势,因此,我们可以根据一阶导数推出:
∂ 2 f ( x ) ∂ x 2 = f ′ ′ ( x ) = f ( x + 1 ) − f ( x ) − [ f ( x ) − f ( x − 1 ) ]    = f ( x + 1 ) + f ( x − 1 ) − 2 f ( x ) . (5) \frac{∂^2f(x)}{∂x^2}=f''(x)=f(x+1)-f(x)-[f(x)-f(x-1)]\\ \quad\quad\quad\quad\,\,=f(x+1)+f(x-1)-2f(x).\tag{5} x22f(x)=f′′(x)=f(x+1)f(x)[f(x)f(x1)]=f(x+1)+f(x1)2f(x).(5)
        计算图像中每个像素灰度的一阶导数和二阶导数的方法是图像卷积。给定图2中的3x3算子来说,其图像卷积的过程就是计算算子系数与核覆盖区域的灰度值的乘积之和。(注:波器、掩膜、掩码、核、卷积核、模板、窗口、算子等,其实都是一个东西,在不同的领域叫法不同。在信号领域称为滤波器,在数学里称为核、算子,在图像处理领域称为掩膜、掩码,在深度学习领域称为卷积核,在本文中我们统一称为算子)

image-20220805090435389
图2:3x3的算子

        也就是说对应算子中心点的梯度值为:
Z = w 1 z 1 + w 2 z 2 + … + w 9 z 9 = ∑ k = 1 9 w k z k . (6) Z=w_1z_1+w_2z_2+…+w_9z_9=\sum_{k=1}^{9}w_kz_k.\tag{6} Z=w1z1+w2z2++w9z9=k=19wkzk.(6)
         w k w_k wk是对应的系数, z k z_k zk为像素点的灰度值。

2、算子分类

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

2.1、Roberts交叉算子

        以对角差分为例,即Robert交叉算子,它可以描述为使用两个2x2的卷积模板对影像进行处理:
G x = [ 1 0 0 − 1 ] ∗ f G y = [ 0 1 − 1 0 ] ∗ f . (7) G_x = \begin{bmatrix} 1 & 0\\ 0 & -1 \end{bmatrix} * f\quad\quad\quad\quad G_y = \begin{bmatrix} 0 & 1\\ -1 & 0 \end{bmatrix} * f.\tag{7} Gx=[1001]fGy=[0110]f.(7)
        由公式7展开:
g x = ∂ f ∂ x = f ( x + 1 , y + 1 ) − f ( x , y ) g y = ∂ f ∂ y = f ( x + 1 , y ) − f ( x , y + 1 ) . (8) g_x=\frac{∂f}{∂x}=f(x+1,y+1)-f(x,y)\\ g_y=\frac{∂f}{∂y}=f(x+1,y)-f(x,y+1).\tag{8} gx=xf=f(x+1,y+1)f(x,y)gy=yf=f(x+1,y)f(x,y+1).(8)
        算子模板(图3):

image-20220805090525532
图3:Roberts交叉算子模板
2.2、Prewitt算子

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

        prewitt算子定义:

G x = [ − 1 − 1 − 1 0 0 0 1 1 1 ] ∗ f G y = [ − 1 0 1 − 1 0 1 − 1 0 1 ] ∗ f . (7) G_x = \begin{bmatrix} -1 & -1 & -1\\ 0 & 0 & 0\\ 1 & 1 & 1 \end{bmatrix} * f \quad\quad\quad\quad G_y = \begin{bmatrix} -1 & 0 & 1\\ -1 & 0 & 1\\ -1 & 0 & 1 \end{bmatrix} * f .\tag{7} Gx= 101101101 fGy= 111000111 f.(7)

        水平方向的梯度:
g x = ∂ f ∂ x = ( z 7 + z 8 + z 9 ) − ( z 1 + z 2 + z 3 ) . (8) g_x=\frac{∂f}{∂x}=(z_7+z_8+z_9)-(z_1+z_2+z_3).\tag{8} gx=xf=(z7+z8+z9)(z1+z2+z3).(8)
        垂直方向的梯度:
g y = ∂ f ∂ y = ( z 3 + z 6 + z 9 ) − ( z 1 + z 4 + z 7 ) . (9) g_y=\frac{∂f}{∂y}=(z_3+z_6+z_9)-(z_1+z_4+z_7).\tag{9} gy=yf=(z3+z6+z9)(z1+z4+z7).(9)
        对角线方向的梯度:
g x = ( z 2 + z 3 + z 6 ) − ( z 4 + z 7 + z 8 ) g y = ( z 6 + z 8 + z 9 ) − ( z 1 + z 2 + z 4 ) . (10) g_x=(z_2+z_3+z_6)-(z_4+z_7+z_8)\\ g_y=(z_6+z_8+z_9)-(z_1+z_2+z_4).\tag{10} gx=(z2+z3+z6)(z4+z7+z8)gy=(z6+z8+z9)(z1+z2+z4).(10)
        Prewitt算子的模板:

image-20220805090614756
图4:Prewitt算子模板
2.3、Sobel算子

        Sobel算子是在Prewitt算子的基础上改进而来:在中心系数上使用一个权值2,相比较Prewitt算子Sobel算子能够较好地抑制(平滑)噪声。Sobel算子的定义:
S x = [ 1 0 − 1 2 0 − 2 1 0 − 1 ] ∗ f S y = [ 1 2 1 0 0 0 − 1 − 2 − 1 ] ∗ f . (11) S_x= \begin{bmatrix} 1 & 0 & -1\\ 2 & 0 & -2\\ 1 & 0 & -1 \end{bmatrix} * f \quad\quad\quad\quad S_y= \begin{bmatrix} 1 & 2 & 1\\ 0 & 0 & 0\\ -1 & -2 & -1 \end{bmatrix} * f .\tag{11} Sx= 121000121 fSy= 101202101 f.(11)
        水平梯度:
g x = ∂ f ∂ x = ( z 7 + z 8 + z 9 ) − ( z 1 + z 2 + z 3 ) . (12) g_x=\frac{∂f}{∂x}=(z_7+z_8+z_9)-(z_1+z_2+z_3).\tag{12} gx=xf=(z7+z8+z9)(z1+z2+z3).(12)
        垂直梯度:
g y = ∂ f ∂ y = ( z 3 + z 6 + z 9 ) − ( z 1 + z 4 + z 7 ) . (13) g_y=\frac{∂f}{∂y}=(z_3+z_6+z_9)-(z_1+z_4+z_7).\tag{13} gy=yf=(z3+z6+z9)(z1+z4+z7).(13)
        Robel算子的模板:

image-20220805091321555
图5:Robel算子模板
2.4、Laplacian算子

        拉普拉斯算子(Laplacian Operator)是欧氏空间中的一个二阶微分算子。如果 f f f是二维空间的二阶可微的实函数,则 f f f的拉普拉斯算子定义为:
KaTeX parse error: Got group of unknown type: 'internal'
        将上面的微分转换为差分形式:
Δ f = [ f ( x + 1 , y ) + f ( x − 1 , y ) + f ( x , y + 1 ) + f ( x , y − 1 ) ] − 4 f ( x , y ) . (15) Δf=[f(x+1,y)+f(x-1,y)+f(x,y+1)+f(x,y-1)]-4f(x,y).\tag{15} Δf=[f(x+1,y)+f(x1,y)+f(x,y+1)+f(x,y1)]4f(x,y).(15)

        算子模板:
[ 0 1 0 1 − 4 1 0 1 0 ] [ 1 1 1 1 − 8 1 1 1 1 ] \begin{bmatrix} 0 & 1 & 0\\ 1 & -4 & 1\\ 0 & 1 & 0 \end{bmatrix} \quad\quad\quad\quad \begin{bmatrix} 1 & 1 & 1\\ 1 & -8 & 1\\ 1 & 1 & 1 \end{bmatrix} 010141010 111181111

2.5、各类算子的效果比对
image-20220805090705092

图6:算子效果对比

3、Canny边缘检测算法

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

        1、使用高斯滤波器,平滑图像,滤除噪声:
G ( x , y ) = e x 2 + y 2 2 σ f s ( x , y ) = G ( x , y ) ⊗   f ( x , y ) . (16) G(x,y)=e^{\frac{x^2+y^2}{2\sigma}}\\ f_s(x,y)=G(x,y)\otimes\,f(x,y).\tag{16} G(x,y)=e2σx2+y2fs(x,y)=G(x,y)f(x,y).(16)
        2、计算图像中每个像素点的梯度强度和方向:
g x = ∂   f s ∂   x g y = ∂   f s ∂   y M ( x , y ) = g x 2 + g y 2 α ( x , y ) = t a n − 1 [ g y g x ] . (17) g_x=\frac{\partial\,f_s}{\partial\,x} \quad\quad\quad\quad g_y=\frac{\partial\,f_s}{\partial\,y}\\ M(x,y)=\sqrt{g^2_x+g^2_y} \quad\quad\quad\quad \alpha(x,y)=tan^{-1}[\frac{g_y}{g_x}] .\tag{17} gx=xfsgy=yfsM(x,y)=gx2+gy2 α(x,y)=tan1[gxgy].(17)
                其中M(x,y)为梯度强度,α(x,y)为梯度方向。

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

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

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

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

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

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

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

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

参考文献

1、4.1 梯度信息提取续_哔哩哔哩_bilibili

2、数字图像处理(第四版)Digital Image Processing,Fourth Edition (Rafael C.Gonzalez, Richard E.Woods) (z-lib.org)—10章图像分割

3、图像边缘检测原理概述_CSDN博客_图像边缘检测

4、Prewitt算子_百度百科

5、CSDN博客_高斯滤波

6、拉普拉斯算子 - 简书 (jianshu.com)

7、Prewitt算子边缘检测原理及实现 CSDN博客

8、(卷积核——Roberts、Prewitt、Sobel、Lapacian、DoG、LoG算子

9、中心差分_百度百科 (baidu.com)

Logo

开放原子开发者工作坊旨在鼓励更多人参与开源活动,与志同道合的开发者们相互交流开发经验、分享开发心得、获取前沿技术趋势。工作坊有多种形式的开发者活动,如meetup、训练营等,主打技术交流,干货满满,真诚地邀请各位开发者共同参与!

更多推荐