比较两条相似路径

时间:2016-03-19 20:08:50

标签: algorithm vector-graphics

我有路径集A和路径集B.我试图找到一个算法来比较两个路径集的相似性。

路径特征:

  1. 路径集是一行或多行,每行有两个或多个点。不必连接线。
  2. 路径集可能自身重叠(即X)。
  3. 路径集可能包含不同数量的顶点(即一条路径可能看起来与另一条路径相似,但其中有更多的点)。
  4. 不保证两个路径集都符合要求。
  5. 应该考虑比例,即小X应该与大X匹配。任何路径都不需要考虑转换,因为任何路径的最底部点的y都是0,最左边的点是任何路径都有x为0.

    是否有最佳做法或众所周知的算法(我在Google搜索中找不到)来比较这些类型的路径集以获得相似性?

2 个答案:

答案 0 :(得分:3)

在算法上,我想我会尝试这样的事情:

  1. 对于每条路径,将包含路径的连续点对转换为向量列表,其中向量定义为幅度(长度)和方向(相对于X-的角度)的配对轴)。您可以像这样计算这些值(C#):

    double dx = endPoint.X - startPoint.X;
    double dy = endPoint.Y - startPoint.Y;
    double magnitude = Math.Sqrt((dx * dx) + (dy * dy));
    double direction = Math.Atan2(dy, dx) * (180 / Math.PI);
    
  2. 接下来,通过组合具有相同*方向的连续向量来“归一化”每个向量序列。换句话说,用具有相同方向和大小总和的新矢量替换那些。这将处理路径上任何位置的同一行上有两个以上点的情况。在此步骤之后,每个序列中的矢量数应相同。 (如果没有,路径不相似。)

  3. 找出比例因子。取第一个序列中第一个向量的大小,并将其除以第二个序列中第一个向量的大小。

  4. 现在,您可以通过串联迭代两个序列来比较相似性序列。对于每个序列中的每个相应向量,检查它们的方向是否相等*并且它们的大小的比率与缩放因子相等*。如果没有,则路径不相似。

  5. *当检查两个双精度值是否“相等”时,您必须记住,并非每个实数都可以用双精度准确表示,因此您不能直接比较两个双精度数并期望精确结果。相反,您应该根据您的情况决定容差,并确定您要比较的值之间的差异是否在该容差范围内。有关该主题的广泛治疗,请参阅What is the most effective way for float and double comparison?

答案 1 :(得分:0)

免责声明:我是图像处理的门外汉。本答案中的所有内容均基于我的猜想,未经文献测试和支持。

我认为我们可以利用对象vertices的概念。这里涉及的对象是一维线,因此顶点应该是线的终点。

例如,对于图像" X",假设有两条线,应该有四个顶点,每行两个。

现在对于图像" X",它实际上可以从四条线到达,每条线在中心处连接。然后天真的顶点计数将给出八个顶点,这不是我们想要的。将此计数结果减少到四的一种方法是将线与邻域遍历合并。想象一下,如果它们位于垂直,水平和对角线跃点内,则我们在点之间形成边缘。然后我们从随机顶点开始并在图形上运行DFS,这将给出一组作为顶点的死点。这将给出四个顶点而不是八个顶点。

要使两个图像在您的问题中相同,至少它们需要具有相同数量的顶点。当它们最佳对齐时,顶点之间的距离应该很小,因此我们可以贪婪地配对顶点以找到最佳对齐。找到图像之间最接近的一对,然后是下一个最接近的对,直到所有顶点都配对。然后,图像之间的相似性可能类似于对的欧氏距离的均方根。

或者,如果顶点的数量足够小,则优化O(N ^ 3)(我认为它是减少方块的总和......)可能的对。这应该会带来更好的结果。

我不会尝试这个,因为我很懒...我的想象力像猪一样飞翔。干杯!