文章目录
1 理论
Opencv提供了三种类型的梯度滤波器,又称高通滤波器,包括Sobel、Scharr和Laplacian。
1.1 Sobel和Scharr算子
Sobel算子是高斯平滑加微分运算的联合运算,能够更抗噪声。逆可以指定要采用的导数方向,垂直或水平,分别对应参数yorder和xorder。内核的大小则通过ksize指定。
特别的,当ksize设置为-1时,将使用
3
×
3
3 \times 3
3×3Scharr滤波器,比
3
×
3
3 \times 3
3×3Sobel效果更好。
1.2 Laplacian算子
Laplacian计算了由以下关系给出的图像的laplacian图:
Δ
s
r
c
=
∂
2
s
r
c
∂
x
2
+
∂
2
s
r
c
∂
y
2
\Delta src = \frac{\partial ^2{src}}{\partial x^2} + \frac{\partial ^2{src}}{\partial y^2}
Δsrc=∂x2∂2src+∂y2∂2src 如果ksize设置为1,则以上以下内核进行过滤:
k
e
r
n
e
l
=
[
0
1
0
1
−
4
1
0
1
0
]
kernel = \begin{bmatrix} 0 & 1 & 0 \\ 1 & -4 & 1 \\ 0 & 1 & 0 \end{bmatrix}
kernel=⎣⎡0101−41010⎦⎤
2 代码
import cv2 as cv
from matplotlib import pyplot as plt
img = cv.imread('1.jpg', 0)
laplacian = cv.Laplacian(img, cv.CV_64F)
sobelx = cv.Sobel(img, cv.CV_64F, 1, 0, ksize=5)
sobely = cv.Sobel(img, cv.CV_64F, 0, 1, ksize=5)
plt.subplot(2, 2, 1), plt.imshow(img, cmap='gray')
plt.title('Original'), plt.xticks([]), plt.yticks([])
plt.subplot(2, 2, 2), plt.imshow(laplacian, cmap='gray')
plt.title('Laplacian'), plt.xticks([]), plt.yticks([])
plt.subplot(2, 2, 3), plt.imshow(sobelx, cmap='gray')
plt.title('Sobel X'), plt.xticks([]), plt.yticks([])
plt.subplot(2, 2, 4), plt.imshow(sobely, cmap='gray')
plt.title('Sobel Y'), plt.xticks([]), plt.yticks([])
plt.show()
输出如下:
3 检测两个边缘
检测两个边缘时,一个好的选择是将输出数据类型保留为更高的形式,例如cv.CV_16S、cv.CV_64F等,取绝对值后再转换为cv.CV_8U:
import cv2 as cv
import numpy as np
from matplotlib import pyplot as plt
img = cv.imread('1.jpg', 0)
sobel = cv.Sobel(img, cv.CV_64F, 1, 0, ksize=5)
sobel_abs = np.absolute(sobel)
sobel_8u = np.uint8(sobel_abs)
plt.subplot(2, 2, 1), plt.imshow(img, cmap='gray')
plt.title('Original'), plt.xticks([]), plt.yticks([])
plt.subplot(2, 2, 2), plt.imshow(sobel, cmap='gray')
plt.title('Sobel'), plt.xticks([]), plt.yticks([])
plt.subplot(2, 2, 3), plt.imshow(sobel_abs, cmap='gray')
plt.title('Absolute'), plt.xticks([]), plt.yticks([])
plt.subplot(2, 2, 4), plt.imshow(sobel_8u, cmap='gray')
plt.title('Uint8'), plt.xticks([]), plt.yticks([])
plt.show()
输出如下: