Emgu CV(或OpenCV)中多边形集的Voronoi图

Chr*_*ais 10 opencv voronoi polygons emgucv

使用Emgu CV我从道路网络图像中的轮廓中提取了一组闭合多边形.多边形代表道路轮廓.结果如下所示,绘制在OpenStreetMaps地图上(来自Emgu CV的'像素'形式的多边形已转换为要绘制的纬度/经度形式).

代表道路轮廓的多边形集:

在此输入图像描述

我现在想要计算这组多边形的Voronoi图,这将帮助我找到道路的中心线.但在Emgu CV中,我只能找到一种方法来获得一组点的Voronoi图.这是通过找到点集的Delaunay三角剖分(使用Subdiv2D类)然后使用GetVoronoiFacets计算voronoi面来完成的.

我已经尝试计算由集合中所有多边形定义的的Voronoi图(每个多边形是一个点列表),但这给了我一个非常复杂的Voronoi图,正如人们可能期望的那样:

点集的Voronoi图:

在此输入图像描述

该图像显示了第一张图片的较小部分(为清楚起见,因为它是如此复杂).事实上,图中的某些线条似乎代表了道路中心线,但是还有很多其他线路,很难找到提取"好"线的标准.

我面临的另一个潜在问题是,正如你应该能够从第一张图片中看出的那样,一些多边形在其他人的内部,所以我们不处于一组不相交的闭合多边形的标准情况.也就是说,有时道路位于一个多边形的外边界和另一个多边形的内边界之间.

我正在寻找关于如何使用Emgu CV(或Open CV)计算多边形集的Voronoi图的建议,希望能够克服我已经概述的第二个问题.我也对其他建议如何在不使用Emgu CV的情况下实现这一点.

use*_*618 0

如果您已经有了多边形,您可以尝试计算Straight Skeleton

我没试过,但是CGAL有一个实现。请注意,此特定功能许可证是 GPL。

一个可能的问题可能是:

该CGAL包的当前版本只能在带孔的简单多边形内部构造直骨架,即它不处理平面上的一般多边形图形。

也许有解决方法。例如,您可以将所有多边形包含在一个更大的矩形中(这样原始多边形将成为新矩形的孔)。如果原始多边形有孔,这可能无法正常工作。为了解决这个问题,您可以对每个有孔的多边形执行该算法,然后将所有多边形放入一个矩形中,删除所有孔并再次执行该算法。