边缘检测包括三个基本内容:
抽取出反映灰度变化的边缘点
剔除某些边界点或填补边界间断点
将这些边缘连接成完整的线
边缘检测算子
基于一阶导数
梯度:
G
(
x
,
y
)
=
[
G
x
G
y
]
=
[
∂
f
∂
x
∂
f
∂
y
]
G(x,y)= \begin{bmatrix} G_x\\ G_y \end{bmatrix}= \begin{bmatrix} \dfrac{\partial f}{\partial x}\\ \\ \dfrac{\partial f}{\partial y} \end{bmatrix}
G ( x , y ) = [ G x G y ] = ⎣ ⎢ ⎢ ⎢ ⎡ ∂ x ∂ f ∂ y ∂ f ⎦ ⎥ ⎥ ⎥ ⎤
可以用三种范数衡量梯度的幅值:
∣
G
(
x
,
y
)
∣
=
G
x
2
+
G
y
2
,
2
范
数
梯
度
|G(x,y)|=\sqrt {G_x^2+G_y^2},2范数梯度
∣ G ( x , y ) ∣ = G x 2 + G y 2
, 2 范 数 梯 度
∣
G
(
x
,
y
)
∣
=
∣
G
x
∣
+
∣
G
y
∣
,
1
范
数
梯
度
|G(x,y)|=|G_x|+|G_y|,1范数梯度
∣ G ( x , y ) ∣ = ∣ G x ∣ + ∣ G y ∣ , 1 范 数 梯 度
∣
G
(
x
,
y
)
∣
≈
m
a
x
(
∣
G
x
∣
,
∣
G
y
∣
)
,
∞
范
数
梯
度
|G(x,y)|\approx max(|G_x|,|G_y|),\infty范数梯度
∣ G ( x , y ) ∣ ≈ m a x ( ∣ G x ∣ , ∣ G y ∣ ) , ∞ 范 数 梯 度
(1)Roberts交叉算子:利用局部差分算子寻找边缘,两个卷积核分别为
G
x
=
[
1
0
0
−
1
]
,
G
y
=
[
0
1
−
1
0
]
G_x=\begin{bmatrix}1&0\\0&-1\end{bmatrix},G_y=\begin{bmatrix}0&1\\-1&0\end{bmatrix}
G x = [ 1 0 0 − 1 ] , G y = [ 0 − 1 1 0 ]
采用1范数衡量梯度的幅度,对具有陡峭的低噪声图像处理效果较好。
(2)Prewitt算子:卷积核:
G
x
=
[
−
1
0
1
−
1
0
1
−
1
0
1
]
,
G
y
=
[
1
1
1
0
0
0
−
1
−
1
−
1
]
G_x=\begin{bmatrix}-1&0&1\\-1&0&1\\-1&0&1\end{bmatrix},G_y=\begin{bmatrix}1&1&1\\0&0&0\\-1&-1&-1\end{bmatrix}
G x = ⎣ ⎡ − 1 − 1 − 1 0 0 0 1 1 1 ⎦ ⎤ , G y = ⎣ ⎡ 1 0 − 1 1 0 − 1 1 0 − 1 ⎦ ⎤
采用第三个范数衡量梯度的幅度,对灰度渐变和噪声较多的图像效果较好。
(3)Sobel算子:卷积核:
G
x
=
[
−
1
0
1
−
2
0
2
−
1
0
1
]
,
G
y
=
[
1
2
1
0
0
0
−
1
−
2
−
1
]
G_x=\begin{bmatrix}-1&0&1\\-2&0&2\\-1&0&1\end{bmatrix},G_y=\begin{bmatrix}1&2&1\\0&0&0\\-1&-2&-1\end{bmatrix}
G x = ⎣ ⎡ − 1 − 2 − 1 0 0 0 1 2 1 ⎦ ⎤ , G y = ⎣ ⎡ 1 0 − 1 2 0 − 2 1 0 − 1 ⎦ ⎤
采用第三个范数衡量梯度的幅度,对灰度渐变和噪声较多的图像效果较好。
(4)Canny算子:使用高斯滤波器的导数计算的,以寻找图像梯度的局部极大值。使用两个阈值分别来检测强边缘与弱边缘,当且仅当强弱边缘相连时,弱边缘才包含在输出中。因此该方法不易受噪声干扰,但其检测边界连续性不如LOG算子。
Canny算法步骤如下: ① 用高斯滤波器平滑图像; ② 计算滤波后图像梯度的幅值和方向; ③ 对梯度幅值应用非极大值抑制,其过程为找出图像梯度中的局部极大值点,把其他非局部极大值点置零以得到细化的边缘; ④ 用双阈值算法检测和连续边缘,使用两个阈值T1和T2(T1>T2),T1用来找到每条线段,T2用来在这些线段的两个方向上延伸寻找边缘的断裂处,并连接这些边缘。
(5)零交叉方法:先用指定滤波器对图像滤波,然后寻找零交叉点作为边缘。
基于二阶导数
图像灰度二阶导数的过零点对应边缘点 (1)Laplacian算子
∇
2
f
=
∂
2
f
∂
x
2
+
∂
2
f
∂
y
2
\nabla^2f=\frac{\partial^2f}{\partial x^2}+\frac{ \partial^2f}{\partial y^2}
∇ 2 f = ∂ x 2 ∂ 2 f + ∂ y 2 ∂ 2 f
∂
2
f
∂
x
2
=
[
f
(
i
,
j
+
1
)
−
2
f
(
i
,
j
)
]
+
f
(
i
,
j
−
1
)
\frac{\partial^2f}{\partial x^2}=[f(i,j+1)-2f(i,j)]+f(i,j-1)
∂ x 2 ∂ 2 f = [ f ( i , j + 1 ) − 2 f ( i , j ) ] + f ( i , j − 1 )
∂
2
f
∂
y
2
=
[
f
(
i
+
1
,
j
)
−
2
f
(
i
,
j
)
]
+
f
(
i
−
1
,
j
)
\frac{ \partial^2f}{\partial y^2}=[f(i+1,j)-2f(i,j)]+f(i-1,j)
∂ y 2 ∂ 2 f = [ f ( i + 1 , j ) − 2 f ( i , j ) ] + f ( i − 1 , j )
表示为卷积模板:
∇
2
=
[
0
1
0
1
−
4
1
0
1
0
]
\nabla^2=\begin{bmatrix}0&1&0\\1&-4&1\\0&1&0\end{bmatrix}
∇ 2 = ⎣ ⎡ 0 1 0 1 − 4 1 0 1 0 ⎦ ⎤
由于是二阶导数,因此它对于噪声有极高的敏感性,而且对双边缘带不易检测出边缘的方向。
(2)LOG算子:先用高斯函数滤波,然后进行拉普拉斯运算,算得的值等于0的点认为是边界点。
LOG运算:
h
(
x
,
y
)
=
∇
2
[
g
(
x
,
y
)
]
∗
f
(
x
,
y
)
h(x,y)=\nabla^2[g(x,y)]*f(x,y)
h ( x , y ) = ∇ 2 [ g ( x , y ) ] ∗ f ( x , y )
根据卷积求导法则:
h
(
x
,
y
)
=
[
∇
2
g
(
x
,
y
)
]
∗
f
(
x
,
y
)
h(x,y)=[\nabla^2g(x,y)]*f(x,y)
h ( x , y ) = [ ∇ 2 g ( x , y ) ] ∗ f ( x , y )
其中,f 为图像,g 为高斯函数,
g
(
x
,
y
)
=
1
2
π
σ
2
e
x
p
[
−
x
2
+
y
2
2
σ
2
]
g(x,y)=\frac{1}{2\pi\sigma^2}exp\left[-\frac{x^2+y^2}{2\sigma^2}\right]
g ( x , y ) = 2 π σ 2 1 e x p [ − 2 σ 2 x 2 + y 2 ]
∇
2
g
(
x
,
y
)
=
(
x
2
+
y
2
−
2
σ
2
σ
4
)
e
−
x
2
+
y
2
2
σ
2
\nabla^2g(x,y)=\left(\frac{x^2+y^2-2\sigma^2}{\sigma^4}\right)e^{-\dfrac{x^2+y^2}{2\sigma^2}}
∇ 2 g ( x , y ) = ( σ 4 x 2 + y 2 − 2 σ 2 ) e − 2 σ 2 x 2 + y 2
∂
2
G
(
x
,
y
)
∂
x
2
=
1
2
π
σ
4
e
x
p
[
−
x
2
+
y
2
2
σ
2
]
(
x
2
σ
2
−
1
)
\frac{\partial^2 G(x,y)}{\partial x^2}=\frac{1}{2\pi\sigma^4}exp\left[-\frac{x^2+y^2}{2\sigma^2}\right]\left(\frac{x^2}{\sigma^2}-1\right)
∂ x 2 ∂ 2 G ( x , y ) = 2 π σ 4 1 e x p [ − 2 σ 2 x 2 + y 2 ] ( σ 2 x 2 − 1 )
∂
2
G
(
x
,
y
)
∂
y
2
=
1
2
π
σ
4
e
x
p
[
−
x
2
+
y
2
2
σ
2
]
(
y
2
σ
2
−
1
)
\frac{\partial^2 G(x,y)}{\partial y^2}=\frac{1}{2\pi\sigma^4}exp\left[-\frac{x^2+y^2}{2\sigma^2}\right]\left(\frac{y^2}{\sigma^2}-1\right)
∂ y 2 ∂ 2 G ( x , y ) = 2 π σ 4 1 e x p [ − 2 σ 2 x 2 + y 2 ] ( σ 2 y 2 − 1 )
故:
∇
2
G
(
x
,
y
)
=
1
2
π
σ
4
(
x
2
+
y
2
σ
2
−
2
)
e
x
p
[
−
x
2
+
y
2
2
σ
2
]
\nabla^2G(x,y)=\frac{1}{2\pi\sigma^4}\left(\frac{x^2+y^2}{\sigma^2}-2\right)exp\left[-\frac{x^2+y^2}{2\sigma^2}\right]
∇ 2 G ( x , y ) = 2 π σ 4 1 ( σ 2 x 2 + y 2 − 2 ) e x p [ − 2 σ 2 x 2 + y 2 ]
用差分高斯函数(DOG)简化代替LOG算子:
D
O
G
(
σ
1
,
σ
2
)
=
1
2
π
σ
1
e
x
p
[
−
x
2
+
y
2
2
σ
1
2
]
−
1
2
π
σ
2
e
x
p
[
−
x
2
+
y
2
2
σ
2
2
]
DOG(\sigma_1,\sigma_2)=\frac{1}{\sqrt{2\pi}\sigma_1}exp\left[-\frac{x^2+y^2}{2\sigma_1^2}\right]-\frac{1}{\sqrt{2\pi}\sigma_2}exp\left[-\frac{x^2+y^2}{2\sigma_2^2}\right]
D O G ( σ 1 , σ 2 ) = 2 π
σ 1 1 e x p [ − 2 σ 1 2 x 2 + y 2 ] − 2 π
σ 2 1 e x p [ − 2 σ 2 2 x 2 + y 2 ]
差分高斯算子较好地符合人的视觉特性。根据二阶导数性质,检测边界就是寻找▽^2*f的过零点。有两种等效计算方法: ①图像与高斯函数卷积,再求卷积的Laplace微分; ②求高斯函数的Laplace微分,再与图像卷积。
LOG算子能有效检测边界,但存在两个问题: ①会产生虚假边界; ②定位精度不高。
实际中,应考虑:σ的选择,模板尺寸N的确定,边界强度和方向,提取边界的精度。
Matlab实现
BW= edge( I, 'method' , thresh, direction)
采用method的方法进行边缘检测,指定阈值thresh,可指定算子的方向direction=‘horizontal’、‘vertical’、‘both’。各详细参数含义参见Matlab官方页面。
算子比较
(1)Roberts算子
边缘定位精度较高,但容易丢失一部分边缘,同时图像未经平滑处理,不能抑制噪声。对具有陡峭边缘且噪声低的图像处理效果较好。
(2)Prewitt和Sobel算子
都是对图像先做加权平滑处理,然后再微分,所拨通的是平滑部分的权值有差异,因此对噪声具有抑制作用,但不能完全排除检测结果中出现的徐家边缘。边缘定位效果不错,但是检测的边缘易出现多像素宽度。
(3)Laplacian算子
是不依赖于边缘方向的二阶微分算子,对图像中的阶跃型边缘点定位准确,对噪声非常敏感,使噪声成分得到加强。因此使得该算子易丢失一部分边缘的方向信息,造成一些不连续的检测边缘,抗噪能力差。
(4)LOG算子
克服了Laplacian算子抗噪能力差的缺点,但在抑制噪声的同时也将原有的尖锐边缘平滑化了,造成尖锐边缘无法被检测出。
(5)Canny算子
虽然是基于最优化思想而推导出来的,但是实际效果并不一定最优。同样采用高斯函数对图像平滑化,因此具有较强的抑制噪声能力,但也会将高频边缘平滑掉,造成边缘丢失。Canny算子采用双阈值算法检测和连接边缘,采用的多尺度检测和方向性搜索比LOG算子好。
Reference 张德丰 数字图像处理(MATLAB版)第二版 2015年