# 对图片分别使用Roberts、Sobel和Prewitt三种边缘检测方式，完成边缘检测并使用matplotlib展示结果

import cv2 as cv
import matplotlib.pyplot as plt
import numpy as np
from matplotlib import rcParams

# 导入图片
img = cv.imread('img.jpg', cv.IMREAD_GRAYSCALE)

# 设置中文字体
rcParams['font.sans-serif'] = ['SimHei']
rcParams['axes.unicode_minus'] = False

# Roberts 边缘检测
roberts_kernel_x = np.array([[1, 0], [0, -1]], dtype=np.float32)
roberts_kernel_y = np.array([[0, 1], [1, 0]], dtype=np.float32)
roberts_x = cv.filter2D(img.astype(np.float32), -1, roberts_kernel_x)
roberts_y = cv.filter2D(img.astype(np.float32), -1, roberts_kernel_y)
roberts = cv.magnitude(roberts_x, roberts_y)

# Sobel 边缘检测
sobel_X = cv.Sobel(img, cv.CV_64F, 1, 0, ksize=3)
Sobel_y = cv.Sobel(img, cv.CV_64F, 0, 1, ksize=3)
sobel = cv.magnitude(sobel_X, Sobel_y)

# Prewitt边缘检测
prewitt_kernel_x = np.array([[1, 0, -1], [1, 0, -1], [1, 0, -1]], dtype=np.float32)
prewitt_kernel_y = np.array([[1, 1, 1], [0, 0, 0], [-1, -1, -1]], dtype=np.float32)
prewitt_x = cv.filter2D(img.astype(np.float32), -1, prewitt_kernel_x)
prewitt_y = cv.filter2D(img.astype(np.float32), -1, prewitt_kernel_y)
prewitt = cv.magnitude(prewitt_x, prewitt_y)

# 使用 matplotlib 展示
plt.figure(figsize=(12, 8))
plt.subplot(2, 2, 1)
plt.title('原图')
plt.imshow(img, cmap='gray')
plt.axis('off')

plt.subplot(2, 2, 2)
plt.title('Roberts 边缘检测')
plt.imshow(roberts, cmap='gray')
plt.axis('off')

plt.subplot(2, 2, 3)
plt.title('Sobel 边缘检测')
plt.imshow(sobel, cmap='gray')
plt.axis('off')

plt.subplot(2, 2, 4)
plt.title('Prewitt 边缘检测')
plt.imshow(prewitt, cmap='gray')
plt.axis('off')

plt.tight_layout()
plt.show()
