量化线段路径差异的算法

时间:2010-11-05 17:30:24

标签: algorithm path shapes quantization

假设我有两个线段路径,例如下面示例的子集。我如何量化它们之间的差异?

  1. | __
  2. \ _
  3. _ _
  4. / \
  5. \ /
  6. |
  7. _
  8. 两条路径可以具有不同数量的段,并且每个段的长度和它们之间的角度是可变的。

    我认为建立一个坐标系并将这些段定义为节点和边缘会很好。差异可以通过将一个变换到另一个所需的操作来量化,类似于Levenshtein distance算法。不幸的是,操作空间巨大。有任何想法吗?谢谢!

4 个答案:

答案 0 :(得分:2)

您可以将它们绘制成固定大小的图像,然后使用欧几里德距离来比较图像。

或者您可以测量总长度并将角度的绝对值(以及可能的有符号角度)相加作为度量。基于此的东西将具有对形状方向不变的良好特性(如果你想要的话!)。

如何量化它在某种程度上取决于为什么要量化它们之间的差异。

答案 1 :(得分:1)

我会比@awoodland指出的更进一步:你如何量化它取决于完全你想要量化差异的原因。

您是否想要提供一个独特的(至少可能是唯一的)数字,就像线段路径的哈希码一样?或者您是否正在尝试量化线段路径,以表示“此路径比该路径更复杂(或更长,或具有更锐角)”?

如果你想创建一个哈希码,我建议创建两个32位的CRC(或类似的东西):一个用于段长度,一个用于角度。一旦计算出这些CRC,就将它们组合成64位值,角度为高32位,长度为低32位。根据段的数量,可能只有一个CRC值:对于每个段,添加长度,然后添加它与下一个段之间的角度。

请注意,上述内容可能会为您提供每个路径的唯一编号,但不能保证。

如果你想量化线段路径的复杂性......我没有很多想法。

答案 2 :(得分:1)

你可以看一下这篇论文:

http://www.vision.ee.ethz.ch/~calvin/Publications/ferrari07pami.pdf

在本文中,我们使用kAS(段对的概括:您可以将多个段连接到彼此)进行对象检测。我们为这些段集引入了一个描述符,您可以使用它来描述您的对。

我们的描述符不是旋转不变的,所以它可能不适合你。

答案 3 :(得分:1)

如果您使用操作:

  • 添加角落和细分
  • 删除角落和细分
  • 拉伸段(具有差异的重量)
  • 弯角(重量差异)

你仍然能够在n ^ 2时间内使用Levenshtein距离。

将片段编码为以下[片段,角落] *。所以它会是:

[length, rotation] [length, rotation]...

旋转与段指向方向相对应。

计算拉伸和弯曲非常明显。 Value[i-1, j-1] + stretch + bend

计算添加/删除。添加Value[i,j-1] + Cost of adding,删除Value[i-1, j] + cost of removal