用于2d路径比较的Java库

时间:2013-09-12 10:19:39

标签: java algorithm

我有一条2d线(它可以是曲线,带有环等),以及多条相似的路径。我想比较第一条路径与其余路径,并确定哪条路径最相似(如果可能,以百分比表示)。

我在考虑将路径转换为位图,然后使用库来比较位图,但这似乎有些过分。就我而言,我只有一条不间断的路径,由点组成,没有不同的颜色或任何东西。

任何人都可以帮助我吗?

编辑:

所以第一行是黑色的。我比较所有其他线条。我想要一个库或算法可以说:红线准确度为90%(因为它的形状几乎相同,并且接近黑色);蓝线准确度为5% - 此百分比由此示例组成...... - 因为它具有相似的形状,但它更小并且不接近黑色路径。

所以相似性的标准是:

  • 线条彼此之间的距离
  • 他们有什么形状
  • 他们有多大

(颜色无关紧要)

我知道找不到考虑所有这一切的图书馆是不可能的。但最重要的比较应该是:它们的形状和大小是否相同?我可以自己计算的距离。 enter image description here

1 个答案:

答案 0 :(得分:4)

我可以想到两种方法来表达两条线N之间的相似性(定义为点p0,p1 ... pr之间的直线段) M(q0,q1,... qs之间的直线段)。我假设p0和q0总是比p0和qs更接近。

1)区域

使用N和M之间所包含区域的总和,其中N和M随着区域变大而更加不同。 要使N和M形成闭合形状,您应该将p0和q0以及pr和qs与直线段连接起来。 为了能够计算封闭区域的表面,在N和M的分段之间的交叉处引入新点,以便获得一个或多个没有孔或自交叉的简单多边形。这样一个多边形的区域相对简单易于计算(在网上搜索“多边形区域计算”),对这些区域求和,你就可以测量(dis)相似度。

2)采样

取一个位于N上的预定数量(比方说1000)的采样点O(相对于整条线均匀分布,或均匀间隔) 在N)的每个线段上。对于O中的每个采样点o,我们将计算到M上最接近的对应点的距离:结果是这些距离的总和。 接下来,反转角色:从M获取采样点并计算N上每个最接近的对应点,并将它们的距离相加。 这两者中的哪一个产生最小的总和(它们可能不相同!)是(dis)相似性的度量。
注意:要找到M上最近的对应点,找到M中每个直线段的最近点(简单代数,谷歌“点与直线段之间的最短距离”) 。使用距离o最小的段的结果。

<强>比较

方法1需要几个几何图元(点,线段,多边形)和对它们的操作(例如计算交点和多边形区域), 为了实施。这是更多的工作,但产生更强大的结果,并且更容易针对由许多线段组成的线进行优化。

方法2需要选择“正确”数量的样本点,如果线条具有交替的部分而细节很少,则可能很难 和具有大量细节的部分(即许多线段紧密相连),其实现很可能很快(非常)缓慢 具有大量采样点(每个采样点与每个线段匹配的是二次运算)。 从好的方面来说,它不需要很多几何操作,而且相对容易实现。