图像梯度
Sobel算子
G x = [ − 1 0 + 1 − 2 0 + 2 − 1 0 + 1 ] ∗ A and G y = [ − 1 − 2 − 1 0 0 0 + 1 + 2 + 1 ] ∗ A G_{x}= \left[\begin{array}{ccccc} -1 & 0 & +1 \\ -2 & 0 & +2 \\ -1 & 0 & +1 \end{array}\right] * A \text { and } G_{y}=\left[\begin{array}{ccc} -1 & -2 & -1 \\ 0 & 0 & 0 \\ +1 & +2 & +1 \end{array}\right] * A Gx=⎣⎡−1−2−1000+1+2+1⎦⎤∗A and Gy=⎣⎡−10+1−20+2−10+1⎦⎤∗A
dst = cv2.Sobel(src,depth,dx,dy,ksize)
- depth:图像深度
- dx/dy:水平/垂直方向
- ksize:算子大小
# 分别计算x 和 y
sobelx = cv2.Sobel(img, cv2.CV_64F, 1, 0, ksize=3)
# 白色区域-黑色区域为整数,黑色区域-白色区域为负数,因此取绝对值,保留所有区域
sobelx = cv2.convertScaleAbs(sobelx)
sobely = cv2.Sobel(img, cv2.CV_64F, 0, 1, ksize=3)
sobely = cv2.convertScaleAbs(sobely)
# 再求和
sobelxy = cv2.addWeighted(sobelx, 0.5, sobely, 0.5, 0)
Scharr算子
G x = [ − 3 0 + 3 − 10 0 + 10 − 3 0 + 3 ] ∗ A and G y = [ − 3 − 10 − 3 0 0 0 + 3 + 10 + 3 ] ∗ A G_{x}= \left[\begin{array}{ccccc} -3 & 0 & +3 \\ -10 & 0 & +10 \\ -3 & 0 & +3 \end{array}\right] * A \text { and } G_{y}=\left[\begin{array}{ccc} -3 & -10 & -3 \\ 0 & 0 & 0 \\ +3 & +10 & +3 \end{array}\right] * A Gx=⎣⎡−3−10−3000+3+10+3⎦⎤∗A and Gy=⎣⎡−30+3−100+10−30+3⎦⎤∗A
scharrx = cv2.Scharr(img, cv2.CV_64F, 1, 0)
scharry = cv2.Scharr(img, cv2.CV_64F, 0, 1)
scharrx = cv2.convertScaleAbs(scharrx)
scharry = cv2.convertScaleAbs(scharry)
scharrxy = cv2.addWeighted(scharrx, 0.5, scharry, 0.5, 0)
Laplacian算子
G x = [ 0 1 0 + 1 − 4 + 1 0 1 0 ] G_{x}= \left[\begin{array}{ccccc} 0 & 1 & 0 \\ +1 & -4 & +1 \\ 0 & 1 & 0 \end{array}\right] Gx=⎣⎡0+101−410+10⎦⎤
laplacian = cv2.Laplacian(img, cv2.CV_64F)
laplacian = cv2.convertScaleAbs(laplacian)
Canny边缘检测
- 1)使用高斯滤波器,以平滑图像,滤除噪声。
- 2)计算图像中每个像素点的梯度强度和方向。
- 3)应用非极大值(Non-Maximum Suppression)抑制,以消除边缘检测带来的杂散响应。
- 4)应用双阈值(Double-Threshold)检测来确定真实的和潜在的边缘
- 5)通过抑制孤立的弱边缘最终完成边缘检测
1.高斯滤波
G
x
=
[
0.0924
0.1192
0.0924
0.1192
0.1538
0.1192
0.0924
0.1192
0.0924
]
G_{x}= \left[\begin{array}{ccccc} 0.0924 & 0.1192 & 0.0924 \\ 0.1192 & 0.1538 & 0.1192 \\ 0.0924 & 0.1192 & 0.0924 \end{array}\right]
Gx=⎣⎡0.09240.11920.09240.11920.15380.11920.09240.11920.0924⎦⎤
e
=
H
∗
A
=
[
h
11
h
12
h
13
h
21
h
22
h
23
h
31
h
32
h
33
]
∗
[
a
b
c
d
e
f
j
h
i
]
e =H * A = \left[\begin{array}{ccccc} h_{11} &h_{12} & h_{13} \\ h_{21} & h_{22} & h_{23} \\ h_{31} & h_{32} & h_{33} \end{array}\right] * \left[\begin{array}{ccccc} a & b & c \\ d & e & f \\ j & h & i \end{array}\right]
e=H∗A=⎣⎡h11h21h31h12h22h32h13h23h33⎦⎤∗⎣⎡adjbehcfi⎦⎤
2.计算梯度和方向
采用sobel计算梯度和方向
G
=
G
x
2
+
G
y
2
G = \sqrt{G x^{2}+G y^{2}}
G=Gx2+Gy2
θ
=
tan
−
1
G
y
G
x
\theta=\tan ^{-1} \frac{G y}{G x}
θ=tan−1GxGy
3.非极大值抑制
线性插值法
4.双阈值检测
梯度值>maxval:则处理为边界
minVal<梯度值<连有边界则保留否则舍弃
梯度值<minVal:则舍弃
img = cv2.imread('./images/lena.jpg', cv2.IMREAD_GRAYSCALE)
v1 = cv2.Canny(img, 80, 150)
v2 = cv2.Canny(img, 50, 100)
res = np.hstack((v1, v2))
cv2_imshow('res', res)