对于连续函数
f
(
x
,
y
)
\mathrm{f}(\mathrm{x}, \mathrm{y})
f(x,y), 我们计算出了它在
(
x
,
y
)
(\mathrm{x}, \mathrm{y})
(x,y) 处的梯度, 并且用一个矢量
(
(
( 沿
x
\mathrm{x}
x 方向和沿
y
\mathrm{y}
y 方向的两个分量) 来表示, 如下:
G
(
x
,
y
)
=
[
G
x
G
y
]
=
[
∂
f
∂
x
∂
f
∂
y
]
\mathrm{G}(\mathrm{x}, \mathrm{y})=\left[\begin{array}{l} G_{x} \\ G_{y} \end{array}\right]=\left[\begin{array}{l} \frac{\partial f}{\partial x} \\ \frac{\partial f}{\partial y} \end{array}\right]
G(x,y)=[GxGy]=[∂x∂f∂y∂f] 现在我们需要衡量梯度的幅值, 可以用到以下三种范数:
∣
G
(
x
,
y
)
∣
=
G
x
2
+
G
y
2
,
2
范数梯度
∣
G
(
x
,
y
)
∣
=
∣
G
x
∣
+
∣
G
y
∣
,
1
范数梯度
∣
G
(
x
,
y
)
∣
≈
max
(
∣
G
x
∣
,
∣
G
y
∣
)
,
∞
范数梯度
\begin{array}{r} |\mathrm{G}(\mathrm{x}, \mathrm{y})|=\sqrt{G_{x}^{2}+G_{y}^{2}}, 2 \text { 范数梯度 } \\ |\mathrm{G}(\mathrm{x}, \mathrm{y})|=\left|G_{x}\right|+\left|G_{y}\right|, \quad 1 \text { 范数梯度 } \\ |\mathrm{G}(\mathrm{x}, \mathrm{y})| \approx \max \left(\left|G_{x}\right|,\left|G_{y}\right|\right) \quad, \quad \infty \text { 范数梯度 } \end{array}
∣G(x,y)∣=Gx2+Gy2,2范数梯度∣G(x,y)∣=∣Gx∣+∣Gy∣,1范数梯度∣G(x,y)∣≈max(∣Gx∣,∣Gy∣),∞范数梯度 要注意的是,由于使用2范数梯度要对图像中的每个像素点进行平方及开方运算,计算复杂度高,在实际应用中,通常取绝对值或最大值来近似代替该运算以实现简化,与平方及开方运算相比,取绝对值或最大值进行的边缘检测的准确度和边缘的精度差异都很小。
使用梯度算子实现边缘检测
原理
基于梯度算子的边缘检测大多数是基于方向导数求卷积的方法
实现
以3×3的卷积模板为例。
设定好卷积模板后,将模板在图像中移动,并将图像中的每个像素点与此模板进行卷积,得到每个像素点的响应R,用R来表征每个像素点的邻域灰度值变化率,即灰度梯度值,从而可将灰度图像经过与模板卷积后转化为梯度图像。模板系数𝑊𝑖(i=1,2,3,……9)相加的总和必须为零,以确保在灰度级不变的区域中模板的响应为零。Z表示像素的灰度值 :
R
=
W
1
Z
1
+
W
2
Z
2
+
⋯
+
W
9
Z
9
\mathrm{R}=W_{1} Z_{1}+W_{2} Z_{2}+\cdots+W_{9} Z_{9}
R=W1Z1+W2Z2+⋯+W9Z9 然后我们设定一个阈值,如果卷积的结果R大于这个阈值,那么该像素点为边缘点,输出白色;如果R小于这个阈值,那么该像素不为边缘点,输出黑色。于是最终我们就能输出一幅黑白的梯度图像,实现边缘的检测。