根据种子点识别多边形边界的最佳方法是啥?
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 东西。
如果您真正需要的只是基于图像,则您的填充方法可能会起作用(如果边界确实完全关闭)。
【讨论】:
是的,我只是使用公开可用的数据 - 不幸的是,我需要“边界化”一些不是世界地图的图像。以上是关于根据种子点识别多边形边界的最佳方法是啥?的主要内容,如果未能解决你的问题,请参考以下文章