基于种子点识别多边形边界的最佳方法是什么?

时间:2011-07-25 08:06:17

标签: algorithm image image-processing

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

A map of the world

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

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

有没有更好的方法来做我不知道的事情?我的方法根本错了吗?任何建议将不胜感激!

2 个答案:

答案 0 :(得分:4)

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

首先从世界地图创建二进制图像:

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

enter image description here

然后计算连接的组件:

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

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

Colorize[components]

enter image description here

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

masks = ComponentMeasurements[components, "Mask"];

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

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

enter image description here

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

pos = Position[ImageData[border], 1]

enter image description here

答案 1 :(得分:1)

如果可能的话;尝试从另一个来源获取地图背后的矢量数据。我知道这不能回答你的问题,但对于世界(和许多其他人),你可以在互联网上公开发现它们(google为“world borders shapefile”)。这将为您提供更精确的数据,允许您在任何级别进行缩放,重新投影地图,使用谷歌地图或其他图层等。您可以很好地显示矢量数据与openlayers等库,但随后你慢慢走向更复杂的GIS内容。

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