Sobel算子主要用于计算图像梯度,其数学表达式为:
G
x
=
[
+
1
0
−
1
+
2
0
−
2
+
1
0
−
1
]
∗
A
,
G
y
=
[
+
1
+
2
+
1
0
0
0
−
1
−
2
−
1
]
∗
A
G_x=\left[\begin{matrix} +1 & 0 & -1\\ +2 & 0 & -2 \\ +1 & 0 & -1 \\ \end{matrix}\right]*A,G_y=\left[\begin{matrix} +1 & +2 & +1\\ 0 & 0 & 0 \\ -1 & -2 & -1 \\ \end{matrix}\right]*A
Gx=⎣⎡+1+2+1000−1−2−1⎦⎤∗A,Gy=⎣⎡+10−1+20−2+10−1⎦⎤∗A
梯度大小和梯度方向分别为:
G
=
G
x
2
+
G
y
2
,
Θ
=
a
t
a
n
2
(
G
y
,
G
x
)
\rm\pmb{G}=\sqrt{G_x^2+G_y^2}, \pmb\Theta=atan2(G_y,G_x)
GGG=Gx2+Gy2,ΘΘΘ=atan2(Gy,Gx)
详细说明可见维基百科,其原理如下图所示:
原图像为:
经过Sobel算法运算后的图像为:
可见边缘被明显增强了。对原理进行具体分析,Sobel算子就相当于分别求水平和垂直方向的梯度,而严格意义的梯度是相邻像素之间的灰度差,对Sobel算子来说,以水平方向为例,目标图像的中心像素梯度等于于上下行左右相邻元素灰度差+本行左右像素相邻灰度差的2倍,因此直接反应了小区域内在水平方向的灰度变化情况,且上下行水平方向的相邻像素对最终梯度计算结果也起到了作用,只是权重较少,垂直方向同理,如下图所示:
假如上下两片区域的灰度值下图所示:
橘色区域和绿色区域相连接,梯度方向相同,对与Canny边缘检测功能而言,绿色区域用Sobel算子计算出的梯度值大于橘色区域,因此Canny边缘检测算法只保留绿色区域的中心梯度值。