用Python写一段代码,实现以下功能:用 Python 读入一幅灰度图像(缩放到 50x50 像素),计算该图像每个像素的 水平和垂直梯度,梯度幅值和梯度角,观察输出矩阵值,并进行可视化。
时间: 2023-06-04 12:05:45 浏览: 110
好的,以下是实现该功能的Python代码:
```python
import cv2
import numpy as np
import math
import matplotlib.pyplot as plt
# 读入灰度图像并缩放
img = cv2.imread("image.jpg", cv2.IMREAD_GRAYSCALE)
img = cv2.resize(img, (50, 50))
# 水平和垂直梯度的卷积核
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]])
# 计算梯度的幅值和角度,并输出矩阵
grad_mag = np.zeros(img.shape)
grad_dir = np.zeros(img.shape)
for y in range(1, img.shape[0]-1):
for x in range(1, img.shape[1]-1):
# 计算每个像素点的水平和垂直梯度
gx = np.sum(Sobel_x * img[y-1:y+2, x-1:x+2])
gy = np.sum(Sobel_y * img[y-1:y+2, x-1:x+2])
grad_mag[y, x] = math.sqrt(gx**2 + gy**2)
grad_dir[y, x] = math.atan2(gy, gx) * 180 / np.pi
print("梯度幅值:")
print(grad_mag)
print("梯度角度:")
print(grad_dir)
# 可视化梯度幅值和角度
plt.figure(figsize=(10, 10))
plt.subplot(2, 1, 1)
plt.imshow(grad_mag, cmap='gray')
plt.title("Gradient Magnitude")
plt.axis('off')
plt.subplot(2, 1, 2)
plt.imshow(grad_dir, cmap='hsv')
plt.title("Gradient Direction")
plt.axis('off')
plt.show()
```
该代码中通过OpenCV库读入灰度图像,并缩放到50x50像素。然后,定义Sobel算子的卷积核,通过卷积计算出每个像素的水平和垂直梯度,并计算出梯度的幅值和角度,输出矩阵值。最后,使用Matplotlib库进行可视化,分别展示梯度幅值和角度的热图。
阅读全文