打开CV等高线将凹多边形拆分为多个凸多边形

2024-10-01 02:40:21 发布

您现在位置:Python中文网/ 问答频道 /正文

我有一个numpy数组中的下图

enter image description here

我想

  1. 将块分离为单独的等高线或任何坐标表示

  2. 然后我想把任何凹多边形转换成多个凸多边形

像这样

enter image description here

到目前为止,我已经设法用opencv将每个块隔离成等高线。。。但是有没有一种简单的方法可以将L形对象分割成两个或更多的正方形块呢。如果需要,每个形状的新轮廓可以重叠

也可能是这样,我有一个这样的图像,没有这样的直线

enter image description here

我用cv2.approxPolyDP来画这个形状,但是它们是凹的,我需要它们分开

谢谢你的帮助


Tags: 对象方法图像numpy数组多边形cv2opencv
2条回答

好的,谢谢拉胡尔的回答

我最终找到了一个软件包,帮助我转换多边形,解决了我的问题

下载时附带:

pip install sect 

然后:

from sect.triangulation import constrained_delaunay_triangles

以openCV生成的等高线为例,如下所示

enter image description here

然后“平滑”颜色,以减少颜色。我用过这个

epsilon = 0.005 * cv2.arcLength(contour, True)
approx = cv2.approxPolyDP(contour, epsilon, True)

然后在门派中运行它

constrained_delaunay_triangles([tuple(x) for x in approx.squeeze()])

输出将多边形拆分为三角形,完全删除所有凹多边形

enter image description here

我能想到的一种方法是,对于每个轮廓,首先找到它的凸包

现在找到轮廓与其凸包之间的缺陷点See this link

现在使用缺陷距离数据,找到距离最大的点。该点是两个对象以L形连接的点。现在从该点开始,在该点绘制一条与轮廓切线垂直的直线,然后再次查找轮廓。生成的轮廓将是L形的两个轮廓

注意:在这种方法中,一个对象的某些部分可能在边界处分割时进入另一个对象

相关问题 更多 >