如何使用OpenCV Python近似图像中的轮廓形状?
函数 cv2.approxPolyDP() 将轮廓形状近似为另一个顶点更少的形状。接受以下参数−
- cnt − 轮廓点的数组。
-
epsilon − 轮廓到近似轮廓的最大距离。需要明智选择epsilon以获得正确的输出。
语法
以下语法可用于近似轮廓形状
epsilon = 0.01*cv2.arcLength(cnt,True)
approx = cv2.approxPolyDP(cnt,epsilon,True)
步骤
您可以使用以下步骤来近似图像中的轮廓形状 −
导入所需库。在以下所有Python示例中,所需的Python库是 OpenCV 。确保您已经安装了它。
import cv2
使用 cv2.imread() 读取输入图像,并将其转换为灰度。
img = cv2.imread('approx1.png')
gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
对灰度图像应用阈值,以创建二进制图像。调整第二个参数以获得更好的轮廓检测。
ret,thresh = cv2.threshold(gray,150,255,0)
使用 cv2.findContours() 函数在图像中找到轮廓。
contours, _ = cv2.findContours(thresh, cv2.RETR_TREE, cv2.CHAIN_APPROX_SIMPLE)
从轮廓列表中选择轮廓(假设第一个轮廓) cnt 。
cnt = contours[0]
定义精度, epsilon 。这一步非常重要。轮廓的正确近似取决于epsilon的选择。
epsilon = 0.01*cv2.arcLength(cnt,True)
使用 cv2.approxPolyDP() 函数计算近似轮廓点。
approx = cv2.approxPolyDP(cnt,epsilon,True)
使用不同颜色在输入图像上绘制两个轮廓和近似轮廓。
cv2.drawContours(img, [cnt], -1, (0,255,255), 3)
cv2.drawContours(img, [approx], -1, (0,0,255), 3)
显示带有绘制的轮廓和近似轮廓的图像。
cv2.imshow("Approximate Contour", img)
cv2.waitKey(0)
cv2.destroyAllWindows()
示例
在下面的Python代码中,我们发现输入图像中对象的近似轮廓。我们还在输入图像上绘制了近似轮廓。
import cv2
import numpy as np
# 读取输入图像
img = cv2.imread('approx1.png')
# 将图像转换为灰度图像
gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
# 应用阈值化方法,将灰度图像转换为二值图像
ret,thresh = cv2.threshold(gray,150,255,0)
# 查找轮廓
contours,hierarchy = cv2.findContours(thresh, cv2.RETR_TREE,cv2.CHAIN_APPROX_SIMPLE)
print("检测到的轮廓数量:",len(contours))
# 取第一个轮廓
cnt = contours[0]
# 定义精度值
epsilon = 0.01*cv2.arcLength(cnt,True)
# 近似轮廓
approx = cv2.approxPolyDP(cnt,epsilon,True)
# 在输入图像上绘制轮廓
cv2.drawContours(img, [cnt], -1, (0,255,255), 3)
# 在输入图像上绘制近似轮廓
cv2.drawContours(img, [approx], -1, (0,0,255), 3)
# 显示带有绘制轮廓和近似轮廓的图像
cv2.imshow("近似轮廓", img)
cv2.waitKey(0)
cv2.destroyAllWindows()
我们将使用以下图像作为 输入文件 在上面的程序代码中。
输出
当你执行上面的代码时,它会产生以下 输出 。
检测到的轮廓数量: 1
然后我们得到以下窗口,显示了 输出 −
在上面的输出图像中,对象的轮廓以黄色显示,对象的近似轮廓以红色显示。请注意两个轮廓之间的差异。