基于一个种子点,如何最好地确定多边形的边界?

3
这是我的问题 - 我有一张世界地图或某种区域地图,如下所示:A map of the world 我需要为该地图的一个区域生成“边界点”表格,以便生成图像地图并动态突出显示某些区域。所有地图的区域边界都将用一种颜色来定义它们(在示例图像中为白色)。
到目前为止,我正在考虑一些基于泛洪填充的方法 - 请注意,速度和效率并不重要,因为脚本绝不打算实时使用。
是否有更好的方法来做到这一点,我不知道?我的方法基本上是错误的吗?任何建议将不胜感激!

2
我认为泛洪填充正是实现这一操作的方法。 - Paweł Obrok
这是一个有效的回答,我认为… - Tim Barrass
2个回答

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


哇!我不知道Mathematica可以做到这一点!但它能输出边框吗? - Jonathan Chan
我编辑了我的答案,还展示了如何输出边框,可以作为二进制掩码或2D位置列表。 - Matthias Odisio
这似乎是迄今为止最实用的答案。谢谢! - Jonathan Chan

1

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

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


是的,我只会使用公开可用的数据 - 不幸的是,有些图片我需要“加边框”,但它们不是世界地图。 - Jonathan Chan

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接