将坐标点排序为路径

时间:2014-06-25 09:19:20

标签: image algorithm path iteration coordinates

我得到一组坐标。坐标的顺序有些随机,但坐标聚集到一起以形成不同的区域。我正在努力创建一个算法来创建具有正确顺序坐标的单个路径。我一直在寻找寻路和图像处理解决方案来解决这个问题,但到目前为止还没有运气。

坐标可以如下所示。

enter image description here

任何人都可以提供一些帮助来创建算法来将这些坐标(按照正确的顺序)排序到路径中吗?

2 个答案:

答案 0 :(得分:1)

一个解决方案:

  • 取一个随机点并将其从图像中删除
  • 虽然当前点有邻居,但移动到它(新当前点=邻居并将其从图像中删除)
  • 您现在拥有一系列形成路径的节点。

重复此操作,直到图像为空。

然后您将拥有一组路径。

答案 1 :(得分:1)

这个问题看起来有点挑战,因为其中一条路径实际上是由两个循环组成的。如果选择了正确的起始位置,在此图像中仍然可行,但请考虑这一点:

   XXX     XX   XXX   XXXXX
  X   X   X  XXX   X X     X
  X   X   X  X  X  XXXXX   X
   XXX     XX    XX  X  XXXX
     XXXXXXX          XX

很容易看出,通过任意路径,我们最终会得到Königsberg的七座桥。(顺便说一下,由于桥梁数量的一些变化,现在可以解决这个问题......)

如何更改问题以使其可解决至少有两种可能性:

  1. 允许多次遍历同一路径。
  2. 仅考虑循环。
  3. 仅使用可以绘制的路径为其提供,而不会多次遍历任何点。
  4. 查找路径段并不是很具挑战性,但是将它们组合成循环需要更详细地定义问题。


    在路径寻找中,我们需要能够确定路径将从属于路径的单个点的所有方向。这可以通过考虑像素的所有可能的3x3邻域来完成。

    还有一个要求:如果路径从像素A到相邻像素B,则这两者之间必须存在反向路径。这一要求缩小了可能性。此外,还有很多对称性(旋转90°,镜像)。

    应该注意,最多可能有4个近邻(在以下配置中):

    .X.  X.X
    XXX  .X.
    .X.  X.X
    

    上述评论中引入的优先级规则是一个很好的规则。所以:

    • 所有直接邻居代表指向/来自某一点的路径
    • 对角线邻居代表路径,如果他们旁边没有直接邻居

    后一条规则可以通过以下方式说明:

    .XX     .N.
    XX.  => N .
    ..X     ..N
    

    其中N代表邻居。

    因此,每个点都有一个0..4相邻点的列表。相邻点具有相似的列表,因此连接是一对一的。


    但现在我们遇到了挑战。如何将连接信息组合到列表中?

    简单案例:

    • 如果没有邻居(0),该点自行形成路径
    • 如果有一个邻居,则它们属于同一条路径
    • 如果有两个邻居,则所有三个点属于同一路径

    在此之后我们有分段和交叉点。通过这个答案开头的例子我们有:

       111     33   666   AAAAA
      1   1   3  X5X   6 A     A
      1   1   3  4  7  X8X99   A
       11X     X4    77  B  XAAA
         2222222          BB
    

    这里0..B表示段,X表示3或4个交叉点。

    似乎至少有一条有用的规则可用于简化结果:

    • 如果有一个3个交叉点,其中两个分支属于同一个循环,则可以通过启动交叉点旁边的路径将其连接成一个循环

    在我们的示例图中,这可以应用于最左边的循环:

       111     33   666   AAAAA
      1   1   3  X5X   6 A     A
      1   1   3  4  7  X8X99   A
       111     X4    77  B  XAAA
         1111111          BB
    

    然后对于每个3个交叉点,有三种方法可以连接它:

            /        /        /     
           /        /        /
                   /        /
      -----     ---     --  |
           \                \
            \       \        \
             \       \        \
    

    对于每个4个交叉点,有四种不同的可能性:

         |          |           |           |
                               /             \
     ---------  ---   ---   ---   ---   ---   ---
                                 /         \
         |          |           |           |
    

    由于我的图表有五个3个交叉点和一个4个交叉点,因此有3 ^ 5 x 4 = 972种不同的方式来连接这些段。这可以通过详尽的搜索来完成,但是必须决定哪种解决方案是最好的。可能需要最小化路径的数量,但是最好是最大化最长路径还是最大化最短路径?或其他什么?

    有一些优化空间,因为几种不同的组合方式可能会产生基本相同的结果(三端交叉处的所有末端的循环可以两种方式运行)。


    总结:

    • 找到相邻的连接

      • 所有隔壁邻居都是邻居
      • 对角线邻居只有在他们旁边没有隔壁邻居时才是邻居
    • 将简单案例连接到段(0,1或2个邻居)

    • 创建一个交叉列表
    • 对细分进行分组,以便分别处理完全独立的细分受众群(单独的路径)
    • 消除琐碎的3交叉(属于同一段的两个邻居)
    • 搜索剩余交叉点的所有可能性,选择您最喜欢的结果

    问题中显示的案例不需要最后一条规则,因为只有两个平凡的三字交叉。