三维点叠加算法

时间:2012-06-23 08:09:53

标签: algorithm 3d geometry computational-geometry

我需要将两组3D点叠加在一起;即找到旋转和平移矩阵以最小化它们坐标之间的RMSD(均方根偏差)。

我目前使用Kabsch algorithm,这对我需要处理的许多情况都不是很有用。 Kabsch在两个数据集中需要相同数量的点,而且,它需要知道哪个点预先与哪个点对齐。对于我的情况,点数将是不同的,并且我不关心哪个点对应于最终对齐中的哪个点,只要RMSD最小化。

因此,该算法(可能)会在两个点集的子集之间找到1-1映射,这样在旋转和平移后,RMSD最小化。

我知道一些处理不同点数的算法,但它们都是基于蛋白质的,也就是说,它们试图将骨架对齐在一起(一些连续的段与另一个连续的段对齐等),这是没用的对于漂浮在太空中的点,没有任何连接。 (好的,要清楚,有些点已经连接;但是有些点没有任何连接,我不想在叠加期间忽略它们。)

我发现的算法只有DIP-OVL,可在STRAP软件模块(开源)中找到。我尝试了代码,但行为似乎不稳定;有时它会找到很好的对齐方式,有时它在简单的X平移后无法与自身对齐一组。

任何人都知道处理此类限制的算法?如果性能有问题,我最多只能得到10 ^ 2到10 ^ 3点。


说实话,使用的目标功能不是很清楚。 RMSD定义为对应点之间距离的RMS。如果我有两组50和100点,并且算法匹配集合中的1个或几个点,那么这几个点之间的结果RMSD将为零,而整体叠加可能不是那么大。 所有点之间的RMSD不是更好的解决方案(我认为)。

我唯一能想到的是找到集合Y中每个点的集合X中的最近点(因此将存在精确的最小(| X |,| Y |)匹配,例如在该情况下为50)并计算来自那些比赛的RMSD。但距离计算和二分匹配部分似乎太复杂,无法以批量方式调用。该领域的任何帮助也会有所帮助。

谢谢!

3 个答案:

答案 0 :(得分:2)

您所说的内容似乎是“云到云注册”任务。例如,请查看http://en.wikipedia.org/wiki/Iterative_closest_pointhttp://www.willowgarage.com/blog/2011/04/10/modular-components-point-cloud-registration。您可以在开源Point Cloud Library中播放数据,看看它是否适合您。

答案 1 :(得分:2)

如果您知道哪些点对应,则可以使用Linear Least Squares(LLS)恢复转换矩阵。

在考虑LLS时,您通常希望在x中找到A*x = b的近似值。使用转置,您可以求解A而不是x

  1. 使用“1”扩展每个源和目标向量,使它们看起来像< x y z ,1>
  2. 公式: A · x i = b < I> I 的
  3. 扩展到多个向量: A · X = B
  4. 转置:( A · X T = B T < / LI>
  5. 简化: X T · T = B Ť
  6. 替换 P = X T Q = A T R B T 。结果是: P · Q = R
  7. 应用LLS的公式: Q ≈( P T · P -1 · P T · R
  8. 替代: A T ≈( X · X T -1 · X · B T
  9. 解决 A ,并简化: A B · X T ·( X · X T -1
  10. B · X T )和( X · X < sup> T )可以通过对各个向量对的外积进行求和来迭代计算。

    • B · X T b i · X <子> I Ť
    • X · X T x i · X <子> I Ť
    • A ≈(Σ b i · x i T )·(Σ i · x i T -1

    没有矩阵会大于4×4,因此算法不会使用任何过多的内存。

    结果不一定是仿射,但可能接近。通过一些进一步的处理,你可以使它变得柔和。

答案 2 :(得分:0)

通过叠加发现比对的最佳算法是Procrustes Analysis或Horn's方法。请关注this Stackoverflow link