从图像生成多边形(填充形状)

时间:2015-02-05 17:52:29

标签: java c# image-processing graphics polygons

我正在尝试从预处理的世界地图生成多边形, 到目前为止我所做的是:

1:为每个国家生成等值线图,如下所示: Countour of each of the world countries

  1. 从这里我用这样的随机颜色填充这些国家: Filled World map
  2. 到目前为止,我已经尝试在countour图像中选择一个随机像素,然后沿着这条线走,直到我到达起点。这确实给了我一个相对好的结果,多边形没有大约90%的准确率,但有些国家完全消失了。

    Drawing generated polygons

    所以我想做的是以排序的方式为该地图中的每个国家/地区设置一个坐标数组,以便它可以表示为多边形。有谁知道如何实现这个目标?

    我还没有找到适合我的问题的算法。

    谢谢!

1 个答案:

答案 0 :(得分:2)

有矢量化工具,但如果你想编码(这是一项艰巨的任务),请执行以下操作:

  1. 扫描图像以获取黑点

    将所有积分存储在list坐标

  2. 的某些(x,y)
  3. 向所有点添加连接信息

    如果编码不正确,这将需要大量内存,因此添加分组信息,每个点连接点(请记住索引)。

  4. 将使用标记添加到指向

  5. 在关节之间找到折线

    联合指向多个2连接点,所以

    1. 找到这样的观点i
    2. 通过其连接点,直到另一个连接点j被击中而没有经过任何一点。这就是你需要使用标志的原因。将此路径存储为polyline
  6. 找到闭环

    类似于#4 ,但您需要单步执行polylines才能返回起点。请记住polylinespolygons

  7. 所以你需要类似的结构:

    struct pnt
     {
     int x,y; // coordinate fo point
     int used; // usage flag for later use
     List<int> ix; // list of indexes of all points connected to this point
     };
    
    struct polylin
     {
     List<int> ix; // list of point indexes
     };
    
    struct polygon
     {
     List<int> lin; // list of polyline indexes
     List<int> dir; // direction of polyline (forward/backward)
     };
    
    List<pnt> pnts;
    List<polylin> plins;
    List<polygon> faces;
    

    如果您的图像点内部有洞,则需要通过额外的图像处理或通过连接点找到一些阈值距离来处理它们。