我需要将两组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。但距离计算和二分匹配部分似乎太复杂,无法以批量方式调用。该领域的任何帮助也会有所帮助。
谢谢!
答案 0 :(得分:2)
您所说的内容似乎是“云到云注册”任务。例如,请查看http://en.wikipedia.org/wiki/Iterative_closest_point和http://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
。
( B · X T )和( X · X < sup> T )可以通过对各个向量对的外积进行求和来迭代计算。
没有矩阵会大于4×4,因此算法不会使用任何过多的内存。
结果不一定是仿射,但可能接近。通过一些进一步的处理,你可以使它变得柔和。
答案 2 :(得分:0)
通过叠加发现比对的最佳算法是Procrustes Analysis或Horn's方法。请关注this Stackoverflow link。