1
2
3
4
5
import cv2 as cv
import numpy as np
import matplotlib.pyplot as plt
import ipykernel
from IPython.display import Latex

我们来看一下矩阵
\begin{equation*}
G_x(x) =
\begin{bmatrix}
-1 & 0 & +1 \
-2 & 0 & +2 \
-1 & 0 & +1
\end{bmatrix}

  • A
    \end{equation*}
    下角标x表示横向梯度计算,矩阵右边为正表示右边的值减去左边的值,得到我们认为是梯度。

\begin{equation*}
G_y(x) =
\begin{bmatrix}
+1 & +2 & -1 \
0 & 0 & 0 \
-1 & -2 & -1
\end{bmatrix}

  • A
    \end{equation*}
    y方向梯度同理,可以看出上下的像素变化。

1
2
3
4
5
img = cv.imread("def.jpg", cv.IMREAD_GRAYSCALE)
cv.imshow("img", img)
cv.waitKey(0)
cv.destroyAllWindows()
#先转化为灰度打开。
1
2
3
4
5
6
7
8
9
10
#sobel算子
sobelx = cv.Sobel(img, cv.CV_64F, 1, 0, ksize=5)#1,0表示只计算x方向,前面的CV_64F表示矩阵做减法时,
#没有负值,截断为0;
sobely = cv.Sobel(img, cv.CV_64F, 0, 1, ksize=5)#0,1表示只计算y方向,前面的CV_64F表示矩阵做减法时,
#没有负值,截断为0;
cv.imshow("sobelx", sobelx)
cv.imshow("sobely", sobely)
cv.waitKey(0)
cv.destroyAllWindows()
#因为全部截断为0了,所以我们应该让其显示出绝对值。
1
2
3
4
5
6
sobelx = cv.convertScaleAbs(sobelx)
sobely = cv.convertScaleAbs(sobely)
cv.imshow("sobelx", sobelx)
cv.waitKey(0)
cv.destroyAllWindows()
#取绝对值之后非常好的显示出来边界。
1
2
3
4
5
6
#下面我们对两个方向做一个求和,得到一个梯度图。
sobelxy = cv.addWeighted(sobelx, 0.5, sobely, 0.5, 0)
cv.imshow("sobelxy", sobelxy)
cv.waitKey(0)
cv.destroyAllWindows()
#这种效果最好。不能xy方向都设置为1,因为这样会导致图像变暗。