要获取一幅灰度图像的边缘和轮廓,分别使用基于梯度的方法和形态学的方法来实现,要求显示原图像和所得到的边缘图像。python代码及注释
时间: 2024-03-23 12:40:23 浏览: 96
好的,我会给你提供Python代码和注释来实现这个任务。首先,我们需要导入`cv2`库和`numpy`库。
```
import cv2
import numpy as np
```
然后,我们读取灰度图像并显示它:
```
img = cv2.imread('gray_image.jpg', 0)
cv2.imshow('Original Image', img)
cv2.waitKey(0)
```
接下来,我们使用基于梯度的方法来获取边缘。我们可以使用`cv2.Canny()`函数来实现这个任务。该函数需要两个阈值作为输入参数,用于确定强边缘和弱边缘。在这里,我们将使用自适应阈值来自动确定这些阈值。
```
# 自适应阈值来确定强边缘和弱边缘
sigma = 0.33
v = np.median(img)
lower_thresh = int(max(0, (1.0 - sigma) * v))
upper_thresh = int(min(255, (1.0 + sigma) * v))
# 使用Canny函数来获取边缘
edges = cv2.Canny(img, lower_thresh, upper_thresh)
cv2.imshow('Canny Edges', edges)
cv2.waitKey(0)
```
现在,我们使用形态学方法来获取轮廓。我们可以使用`cv2.morphologyEx()`函数来实现这个任务。在这里,我们将使用一个结构元素来腐蚀图像,然后使用一个结构元素来膨胀图像,以便填充边缘并获取轮廓。
```
# 创建一个结构元素
kernel = cv2.getStructuringElement(cv2.MORPH_RECT, (5, 5))
# 使用腐蚀和膨胀操作来获取轮廓
erosion = cv2.erode(edges, kernel, iterations=1)
dilation = cv2.dilate(erosion, kernel, iterations=1)
cv2.imshow('Contours', dilation)
cv2.waitKey(0)
```
最后,我们显示所有的图像并释放内存。
```
# 显示所有的图像并释放内存
cv2.imshow('Original Image', img)
cv2.imshow('Canny Edges', edges)
cv2.imshow('Contours', dilation)
cv2.waitKey(0)
cv2.destroyAllWindows()
```
完整的代码如下所示:
```
import cv2
import numpy as np
# 读取灰度图像并显示
img = cv2.imread('gray_image.jpg', 0)
cv2.imshow('Original Image', img)
cv2.waitKey(0)
# 使用Canny函数来获取边缘
sigma = 0.33
v = np.median(img)
lower_thresh = int(max(0, (1.0 - sigma) * v))
upper_thresh = int(min(255, (1.0 + sigma) * v))
edges = cv2.Canny(img, lower_thresh, upper_thresh)
cv2.imshow('Canny Edges', edges)
cv2.waitKey(0)
# 使用腐蚀和膨胀操作来获取轮廓
kernel = cv2.getStructuringElement(cv2.MORPH_RECT, (5, 5))
erosion = cv2.erode(edges, kernel, iterations=1)
dilation = cv2.dilate(erosion, kernel, iterations=1)
cv2.imshow('Contours', dilation)
cv2.waitKey(0)
# 显示所有的图像并释放内存
cv2.imshow('Original Image', img)
cv2.imshow('Canny Edges', edges)
cv2.imshow('Contours', dilation)
cv2.waitKey(0)
cv2.destroyAllWindows()
```
你可以将代码中的`gray_image.jpg`替换为你自己的灰度图像文件名,并尝试运行它。希望这个代码对你有所帮助!
阅读全文