如何使用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 # Read the input image img = cv2.imread('approx1.png') # convert the image to grayscale gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY) # apply thresholding to convert the grayscale image to a binary image ret,thresh = cv2.threshold(gray,150,255,0) # find the contours contours,hierarchy = cv2.findContours(thresh, cv2.RETR_TREE,cv2.CHAIN_APPROX_SIMPLE) print("Number of contours detected:",len(contours)) # take first contour cnt = contours[0] # define the precision epsilon = 0.01*cv2.arcLength(cnt,True) # approximate the contour approx = cv2.approxPolyDP(cnt,epsilon,True) # draw the contour on the input image cv2.drawContours(img, [cnt], -1, (0,255,255), 3) # draw the approximate contour on the input image cv2.drawContours(img, [approx], -1, (0,0,255), 3) # display the image with drawn contours and approximate contours cv2.imshow("Approximate Contour", img) cv2.waitKey(0) cv2.destroyAllWindows()

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

输出

执行上述代码后,将产生以下**输出**。

Number of contours detected: 1

我们将得到以下窗口,显示**输出**:

在上述输出图像中,对象的轮廓以黄色显示,对象的近似轮廓以红色显示。注意这两个轮廓之间的区别。

更新于:2022年9月28日

6000+ 次浏览

启动你的职业生涯

完成课程获得认证

开始学习
广告