如何使用OpenCV Python近似图像中的轮廓形状?

如何使用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()

我们将使用以下图像作为 输入文件 在上面的程序代码中。

如何使用OpenCV Python近似图像中的轮廓形状?

输出

当你执行上面的代码时,它会产生以下 输出

检测到的轮廓数量: 1

然后我们得到以下窗口,显示了 输出

如何使用OpenCV Python近似图像中的轮廓形状?

在上面的输出图像中,对象的轮廓以黄色显示,对象的近似轮廓以红色显示。请注意两个轮廓之间的差异。

Python教程

Java教程

Web教程

数据库教程

图形图像教程

大数据教程

开发工具教程

计算机教程

Python OpenCV