Sobel算子是一种常用的图像处理算法,用于边缘检测。它利用了图像中灰度值的变化来识别边缘的位置。在OpenCV中,Sobel算子通常用于图像梯度计算,其中包括水平方向和垂直方向的梯度。这两个方向的梯度合并后可以得到图像的边缘信息。
Sobel算子的原理基于图像中的灰度变化。它使用了一个小的卷积核(3x3的矩阵)对图像进行卷积操作,以检测图像中像素值的梯度。对于水平方向和垂直方向的梯度,Sobel算子使用以下两个核:
水平方向的Sobel算子核:
SobelX
=
[
−
1
0
1
−
2
0
2
−
1
0
1
]
\text{SobelX} =
垂直方向的Sobel算子核:
SobelY
=
[
−
1
−
2
−
1
0
0
0
1
2
1
]
\text{SobelY} =
这两个核分别对图像进行水平和垂直方向的卷积运算,得到了水平方向和垂直方向上的梯度。
Sobel算子在水平方向(x轴)的应用:
G
x
=
SobelX
∗
图像
G_x = \text{SobelX} * \text{图像}
Gx=SobelX∗图像
Sobel算子在垂直方向(y轴)的应用:
G
y
=
SobelY
∗
图像
G_y = \text{SobelY} * \text{图像}
Gy=SobelY∗图像
最终梯度图像的合并:
梯度图像
=
G
x
2
+
G
y
2
\text{梯度图像} = \sqrt{{G_x}^2 + {G_y}^2}
梯度图像=Gx2+Gy2
import cv2
import numpy as np
def show_images(image):
cv2.namedWindow('image',cv2.WINDOW_KEEPRATIO)
cv2.imshow('image',image)
cv2.waitKey()
cv2.destroyAllWindows()
def Sobel(image):
# 使用Sobel算子计算水平方向和垂直方向的梯度
sobel_x = cv2.Sobel(img, cv2.CV_64F, 1, 0, ksize=3)
sobel_y = cv2.Sobel(img, cv2.CV_64F, 0, 1, ksize=3)
# 计算梯度的幅值
gradient_img = np.sqrt(sobel_x ** 2 + sobel_y ** 2)
return sobel_x,sobel_y,gradient_img
if __name__ == '__main__':
# 读取图像
img = cv2.imread('cat-dog.png', flags=0)
re_img=Sobel(img)
# 将四张图像连接成一个大图像
top_row = np.hstack((img, re_img[0]))
bottom_row = np.hstack((re_img[1], re_img[2]))
combined_img = np.vstack((top_row, bottom_row))
show_images(combined_img)