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

Posted

技术标签:

【中文标题】来自 Emgu CV(或 OpenCV)中多边形集的 Voronoi 图【英文标题】:Voronoi graph from set of polygons in Emgu CV (or OpenCV) 【发布时间】:2016-07-29 20:18:47 【问题描述】:

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

一组表示道路轮廓的多边形:

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

我尝试计算由集合中所有多边形定义的 的 Voronoi 图(每个多边形都是一个点列表),但这给了我一个极其复杂的 Voronoi 图,作为一个可能期望:

点集的Voronoi图:

这张图片显示了第一张图片的一小部分(为了清楚起见,因为它非常复杂)。的确,图中的某些线似乎代表了道路中心线,但还有很多其他线,很难找到提取“好”线的标准。

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

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

【问题讨论】:

因此,您需要从 1) 图像开始计算街道的“中心”,使用 像素形式(简单)或 2) 使用点坐标 lat、lng ?对于 1)您可以绘制填充的多边形,并使用距离变换。街道的中心将具有最大距离值。非极大值抑制会给你结果 来自图像是我所需要的。使用距离变换是个好主意,谢谢。事实上,我可以将距离变换应用于我的原始二进制图像,这是我最初通过找到轮廓来计算多边形的地方!这很棒,因为这样我就不需要处理包含其他多边形的多边形的问题。你能帮我解决非最大值抑制 - 我将如何在 Emgu CV 中实现这一点?我可以通过搜索找到最接近的是 Harris 边缘检测。 也就是说,我需要的最终结果是代表道路中心线的纬度/经度图......原则上我可以从中心线像素中找到,但也许这不是最好的方法.也许 Voronoi 图仍然是一种更好的方法。 @Miki 请问你能给我一些关于如何实现非最大值抑制的帮助吗? 嘿,克里斯,对此感到抱歉,因为它不是一个真正的答案,但您是如何使用 Emgu CV 设法在地图中获得道路的。这正是我一直在尝试做的。你的是我找到的最接近的东西。干杯,谢谢。 【参考方案1】:

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

我没试过,但 CGAL 有一个implementation。请注意,此特定功能 license 是 GPL。

一个可能的问题可能是:

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

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

【讨论】:

以上是关于来自 Emgu CV(或 OpenCV)中多边形集的 Voronoi 图的主要内容,如果未能解决你的问题,请参考以下文章

OpenCV和Emgu CV啥关系?

“Emgu.CV.CvInvoke”的类型初始值设定项引发异常。

Emgu.CV

如何将轮廓层次结构从 python openCV 转换为 emgu cv 以查找封闭轮廓

如何使用 twain/emgu/open cv 获得良好的清晰度?

如何调用emgu cv的capture类创建变量