不使用cv2.Sobel实现Sobel算子计算梯度的Python代码
时间: 2023-10-17 17:05:36 浏览: 194
以下是不使用cv2.Sobel实现Sobel算子计算梯度的Python代码:
```python
import numpy as np
import cv2
def sobel_edge_detection(img):
# Sobel算子
sobel_x = np.array([[-1, 0, 1], [-2, 0, 2], [-1, 0, 1]])
sobel_y = np.array([[-1, -2, -1], [0, 0, 0], [1, 2, 1]])
# 图像尺寸
height, width = img.shape
# 计算x方向和y方向上的梯度
gradient_x = np.zeros((height, width))
gradient_y = np.zeros((height, width))
for i in range(1, height - 1):
for j in range(1, width - 1):
# 计算x方向上的梯度
gx = np.sum(np.multiply(sobel_x, img[i-1:i+2, j-1:j+2]))
gradient_x[i, j] = gx
# 计算y方向上的梯度
gy = np.sum(np.multiply(sobel_y, img[i-1:i+2, j-1:j+2]))
gradient_y[i, j] = gy
# 计算梯度幅值
gradient_mag = np.sqrt(np.square(gradient_x) + np.square(gradient_y))
# 计算梯度方向
gradient_dir = np.arctan2(gradient_y, gradient_x)
return gradient_mag, gradient_dir
# 读取灰度图像
img = cv2.imread('lena.jpg', cv2.IMREAD_GRAYSCALE)
# 使用自定义函数计算梯度
gradient_mag, gradient_dir = sobel_edge_detection(img)
# 显示结果
cv2.imshow('Original Image', img)
cv2.imshow('Gradient Magnitude', gradient_mag.astype(np.uint8))
cv2.imshow('Gradient Direction', gradient_dir.astype(np.uint8))
cv2.waitKey(0)
cv2.destroyAllWindows()
```
该代码使用numpy库中的multiply函数计算卷积,实现了Sobel算子的计算过程。最后计算了梯度幅值和梯度方向,并将结果显示出来。
阅读全文