python 2、要获取一幅灰度图像的边缘和轮廓,分别使用基于梯度的方法和形态学的方法来实现,要求显示原图像和所得到的边缘图像。
时间: 2024-03-23 07:40:08 浏览: 56
使用opencv与pyqt5实现的图像处理程序,已实现转灰度图、图像平滑、形态学操作、梯度计算、阈值处理、边缘检测、轮廓检测
5星 · 资源好评率100%
好的,我来为您解答。
首先,我们需要导入相关的库。
```python
import cv2
import numpy as np
```
然后,读取一幅灰度图像。
```python
img = cv2.imread('gray_image.jpg', 0)
```
接下来,使用基于梯度的方法来获取边缘。
```python
# 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)
sobel = cv2.addWeighted(sobel_x, 0.5, sobel_y, 0.5, 0)
# Scharr算子
scharr_x = cv2.Scharr(img, cv2.CV_64F, 1, 0)
scharr_y = cv2.Scharr(img, cv2.CV_64F, 0, 1)
scharr = cv2.addWeighted(scharr_x, 0.5, scharr_y, 0.5, 0)
# Laplacian算子
laplacian = cv2.Laplacian(img, cv2.CV_64F)
```
然后,使用形态学的方法来获取边缘。
```python
# 膨胀
kernel = np.ones((3, 3), np.uint8)
dilation = cv2.dilate(img, kernel, iterations=1)
# 腐蚀
erosion = cv2.erode(img, kernel, iterations=1)
# 开运算
opening = cv2.morphologyEx(img, cv2.MORPH_OPEN, kernel)
# 闭运算
closing = cv2.morphologyEx(img, cv2.MORPH_CLOSE, kernel)
# 梯度
gradient = cv2.morphologyEx(img, cv2.MORPH_GRADIENT, kernel)
# 顶帽
tophat = cv2.morphologyEx(img, cv2.MORPH_TOPHAT, kernel)
# 黑帽
blackhat = cv2.morphologyEx(img, cv2.MORPH_BLACKHAT, kernel)
```
最后,将原图像和所得到的边缘图像显示出来。
```python
cv2.imshow('Original Image', img)
cv2.imshow('Sobel Edge', sobel)
cv2.imshow('Scharr Edge', scharr)
cv2.imshow('Laplacian Edge', laplacian)
cv2.imshow('Dilation', dilation)
cv2.imshow('Erosion', erosion)
cv2.imshow('Opening', opening)
cv2.imshow('Closing', closing)
cv2.imshow('Gradient', gradient)
cv2.imshow('Tophat', tophat)
cv2.imshow('Blackhat', blackhat)
cv2.waitKey(0)
cv2.destroyAllWindows()
```
至此,我们就完成了一幅灰度图像的边缘和轮廓的获取,并且使用基于梯度的方法和形态学的方法分别实现了这一过程。
阅读全文