程序实现对灰度图进行Sobel算子、Roberts算子、Prewitt算子、Laplacian算子和Canny算子边缘检测并生成效果对比图
时间: 2023-12-30 16:01:57 浏览: 87
以下是Python代码实现对灰度图进行Sobel算子、Roberts算子、Prewitt算子、Laplacian算子和Canny算子边缘检测并生成效果对比图的例子:
```python
import cv2
import numpy as np
from matplotlib import pyplot as plt
# 读取灰度图像
img = cv2.imread('lena.jpg', 0)
# Sobel算子
sobelx = cv2.Sobel(img, cv2.CV_64F, 1, 0, ksize=5)
sobely = cv2.Sobel(img, cv2.CV_64F, 0, 1, ksize=5)
sobel = cv2.addWeighted(sobelx, 0.5, sobely, 0.5, 0)
# Roberts算子
roberts_cross_v = np.array([[0, 0, 0], [0, 1, 0], [0, -1, 0]], dtype=np.float32)
roberts_cross_h = np.array([[0, 0, 0], [0, 0, 1], [0, -1, 0]], dtype=np.float32)
roberts_v = cv2.filter2D(img, -1, roberts_cross_v)
roberts_h = cv2.filter2D(img, -1, roberts_cross_h)
roberts = cv2.addWeighted(roberts_v, 0.5, roberts_h, 0.5, 0)
# Prewitt算子
kernelx = np.array([[1, 1, 1], [0, 0, 0], [-1, -1, -1]], dtype=np.float32)
kernely = np.array([[-1, 0, 1], [-1, 0, 1], [-1, 0, 1]], dtype=np.float32)
prewittx = cv2.filter2D(img, -1, kernelx)
prewitty = cv2.filter2D(img, -1, kernely)
prewitt = cv2.addWeighted(prewittx, 0.5, prewitty, 0.5, 0)
# Laplacian算子
laplacian = cv2.Laplacian(img, cv2.CV_64F)
# Canny算子
canny = cv2.Canny(img, 100, 200)
# 显示图像
plt.subplot(2, 3, 1), plt.imshow(img, cmap='gray')
plt.title('Original'), plt.xticks([]), plt.yticks([])
plt.subplot(2, 3, 2), plt.imshow(sobel, cmap='gray')
plt.title('Sobel'), plt.xticks([]), plt.yticks([])
plt.subplot(2, 3, 3), plt.imshow(roberts, cmap='gray')
plt.title('Roberts'), plt.xticks([]), plt.yticks([])
plt.subplot(2, 3, 4), plt.imshow(prewitt, cmap='gray')
plt.title('Prewitt'), plt.xticks([]), plt.yticks([])
plt.subplot(2, 3, 5), plt.imshow(laplacian, cmap='gray')
plt.title('Laplacian'), plt.xticks([]), plt.yticks([])
plt.subplot(2, 3, 6), plt.imshow(canny, cmap='gray')
plt.title('Canny'), plt.xticks([]), plt.yticks([])
plt.show()
```
运行上述代码,会显示原图和五种边缘检测算子的效果对比图。
阅读全文