根据种子点识别多边形边界的最佳方法是啥?

Posted

技术标签:

【中文标题】根据种子点识别多边形边界的最佳方法是啥?【英文标题】:What's the best way to identify the borders of a polygon based on a seed point?根据种子点识别多边形边界的最佳方法是什么? 【发布时间】:2011-07-25 08:06:16 【问题描述】:

这是我的问题 - 我有一张世界地图或某个区域的地图,如下所示:

我需要为此区域地图生成一个“边界点”表,以便生成图像地图并动态突出显示某些区域。所有地图的区域都将具有一种颜色的边界来定义它们(在示例图像中为白色)。

到目前为止,我正在考虑某种基于洪水填充的方法 - 请注意,速度和效率并不那么重要,因为该脚本绝不打算实时使用。

有没有我不知道的更好的方法来做到这一点?我的方法从根本上是错误的吗?任何建议将不胜感激!

【问题讨论】:

我认为洪水填充正是这样做的。 我认为这是一个有效的答案...... 【参考方案1】:

如果这些区域彼此完全隔离,那么查看连接的组件就可以解决问题。在 Mathematica 中,它看起来像:

首先从世界地图创建一个二值图像:

regions = ColorNegate[Binarize[img, .9]]

然后计算连通分量:

components = MorphologicalComponents[regions, CornerNeighbors -> False];

现在您可以提取每个组件(遮罩、周长等)的属性。在这里,我用独特的颜色为每个区域着色:

Colorize[components]

要获取给定组件的边框,可以查询组件的二进制掩码,然后计算周长。 这得到了所有的面具:

masks = ComponentMeasurements[components, "Mask"];

例如,获取一个区域的边框或轮廓:

country = Image[masks[[708, 2]], "Bit"]
border = MorphologicalPerimeter[country]

获取边框的 2D 位置只需提取图像中的白色像素:

pos = Position[ImageData[border], 1]

【讨论】:

哇!我不知道 Mathematica 可以做到这一点!不过,它可以输出边框吗? 我编辑了我的答案以显示如何输出边框,无论是作为二进制掩码还是作为二维位置列表。 这似乎是迄今为止最实用的答案。谢谢!【参考方案2】:

如果可能的话;尝试从其他来源获取地图背后的矢量数据。我知道这不能回答您的问题,但是对于世界边界(以及许多其他问题),您可以在互联网上公开找到它们(谷歌搜索“世界边界 shapefile”)。这将为您提供更精确的数据,允许您在任何级别缩放,重新投影地图,使用谷歌地图或其他图层等。您可以使用 openlayers 等库很好地显示矢量数据,但随后您正在慢慢走向更复杂的 GIS 东西。

如果您真正需要的只是基于图像,则您的填充方法可能会起作用(如果边界确实完全关闭)。

【讨论】:

是的,我只是使用公开可用的数据 - 不幸的是,我需要“边界化”一些不是世界地图的图像。

以上是关于根据种子点识别多边形边界的最佳方法是啥?的主要内容,如果未能解决你的问题,请参考以下文章

图形填充之种子填充算法

从空间点数据创建边界多边形,以便在传单中绘图

查找给定多边形 w.r.t 的两个“边界”顶点。已知(光源)点

求一个C语言实现的种子填充多边形算法程序

多边形建模的简介

地理围栏:如何识别对象(特征),使用 Oracle Spatial 重叠地理围栏边界?