我有两个大的(x,y)点集合,我想在Python中将一个集合的每个点与另一个集合的“对应点”关联起来。
第二组也可能包含异常值,即额外的噪声点,如图所示,其中绿色多于红点:
两组点之间的关联不是简单的平移,如下图所示:
在这两个链接中,您可以找到红点和绿色(图像坐标列表,原点位于左上角):
https://drive.google.com/file/d/1fptkxEDYbIJ93r_OXJSstDHMfk67DDYo/view?usp=share_linkhttps://drive.google.com/file/d/1Z_ghWIzUZv8sxfawOBoGG3fJz4h_z7Qv/view?usp=share_link显示器
我的问题与这两个类似:
Match set of x,y points to another set that is scaled, rotated, translated, and with missing elements
How to align two sets of points (translation+rotation) when those sets contain noise?
但我有一个很大的点集,所以这里提出的解决方案不适用于我的情况。我的点在行中有一定的结构,所以很难计算旋转-缩放-平移函数,因为点的行彼此混淆。
1条答案
按热度按时间rt4zxlrg1#
我发现了一种方法,它可以通过两个阶段相当精确地恢复哪些点对应于哪些点,第一阶段校正仿射变换,第二阶段校正非线性失真。
注意:我选择将红点与绿色匹配,而不是相反。
假设
该方法做了三个假设:
1.它知道三个或更多的绿色和匹配的红点。
1.两者之间的差异大多是线性的。
1.差异的非线性部分是局部相似的,即如果一个点具有(-10,10)的匹配偏移,则相邻点将具有相似的偏移。这由
max_search_dist
控制。编号
首先加载两个数据集:
我发现使用一个函数来可视化这两个数据集非常有用:
接下来,选择三个绿色的点,并提供它们的XY坐标。找到对应的红色点,并提供它们的XY坐标。
接下来,使用这些点来找到一个仿射矩阵。这个仿射矩阵将涵盖旋转、平移、缩放和倾斜。由于它有六个未知数,你至少需要六个约束,否则方程是欠定的。这就是为什么我们之前至少需要三个点。
现在我们进入非线性匹配步骤,这是在红色的值被转换为与绿色的值匹配之后运行的,算法如下:
1.从一个没有非线性分量的红点开始。
green_sample
点附近的一个点是一个很好的选择-仿射步骤将优先获得这些点。在这个点周围的半径内搜索相应的绿点。记录红点和相应绿点之间的差异为“漂移”。1.查看该红点的所有红色邻居,并将其添加到列表中进行处理。
1.在其中一个红点附近,取所有相邻红点的平均漂移值,将该漂移值加到红点上,然后在一个半径内搜索绿点。
1.红点和相应绿点之间的差异就是该红点的漂移。
1.将该点的所有红色相邻点添加到列表中进行处理,然后返回步骤3。
接下来,这里有一个工具,你可以用来检查匹配的质量。这是显示前一千个匹配。下面是一个箭图,箭头从红点指向匹配的绿点。(注意:箭头不是按比例的。
图:
x1c 0d1x
匹配
下面是我找到的匹配项的副本。它是JSON格式的,其中的键表示红色点文件中的点的索引,值表示绿点文件中的点的索引。https://pastebin.com/SBezpstu