这是我的问题 - 我有一张世界地图或某种地区,如下所示:
我需要为该地区的地图生成“边界点”表,以便生成图像地图并动态突出显示某些区域。所有地图的区域都将有一种颜色的边框来定义它们(在示例图像中为白色)。
到目前为止,我正在考虑某种基于泛洪填充的方法 - 请注意速度和效率并不重要,因为脚本绝不是为了实时使用。
有没有更好的方法来做我不知道的事情?我的方法根本错了吗?任何建议将不胜感激!
答案 0 :(得分:4)
如果这些区域彼此完全隔离,那么查看连通组件就可以了。在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]
答案 1 :(得分:1)
如果可能的话;尝试从另一个来源获取地图背后的矢量数据。我知道这不能回答你的问题,但对于世界(和许多其他人),你可以在互联网上公开发现它们(google为“world borders shapefile”)。这将为您提供更精确的数据,允许您在任何级别进行缩放,重新投影地图,使用谷歌地图或其他图层等。您可以很好地显示矢量数据与openlayers等库,但随后你慢慢走向更复杂的GIS内容。
如果你真正需要的是基于图像,你的洪水填充方法可能会起作用(如果边界确实完全关闭)。