如图所示,我有" shape1"和" shape2"分别。两者都有相同的A,B,C和D点。只要看一下,形状就不同了。但是如果你转换(旋转和翻译)" shape2",你就会得到" shape1"。换句话说,我们可以说" shape2"匹配" shape1"。
我的问题是,如果2个图像具有相同的点但坐标不同,我如何识别" shape2"匹配" shape1" (或不)以编程方式?
PS: 两个" shape1"和" shape2"将有相同的点A,B,C& D,但坐标不同。 可能的转换是旋转,平移或/和镜像。不适用缩放。
我已经看到有一些方法可以创建具有给定形状和给定变换集的变换形状。但这恰恰相反。
答案 0 :(得分:0)
你没有显示任何代码,所以我也不会也只是讨论算法。
两个多边形之间的相似性的一个定义是对应的角度相等并且对应的边是比例。因此,从两个对应点开始,每个多边形一个点。对于每个多边形,记录从第一个点到下一个点的线段长度的比率。然后继续围绕每个多边形。比较连续段之间的定向角度 - 如果有任何不相等(或者在浮点算术中足够接近),则没有相似性。还要比较相应段长度的比率 - 如果这些比率中的任何一个不等于/足够接近第一个,则没有相似性。如果您回到第一个线段并检查了所有内容,则多边形类似。
请注意,我假设您知道对应的点和方向是什么。如果不是这种情况,您可以重复上一段中的步骤,对其中一个多边形的每个点重复两次(每个方向一次)。
所有这些都是检查相似性,就像你的标题一样。如果你真的想检查同余,那么"不适用缩放"正如您在问题正文中所述,线段长度的公共比率必须为1,算法更容易。
该算法是否清晰?您必须能够在给定坐标的情况下找到线段的长度和两个线段之间的定向角度,但在开始此类问题之前,您应该知道这种事情。
答案 1 :(得分:0)
测量每个点与至少3个其他点之间的距离。对于4个点,这意味着测量所有6个可能的连接。
|A-B|, |A-C|, |A-D|, |B-C|, |B-D|, |C-D|
如果我没有弄错的话,如果所有这6个长度匹配,则两个四边形匹配。这是使用你的匹配定义(仅限翻译,旋转和镜像转换)。
对于N点,您需要ceil(N * 1.5)连接/测量。例如5点需要8个连接,6点需要9个连接。
要优化,因为您只是比较,您可以只计算平方距离并避免许多平方根。
答案 2 :(得分:0)
一种方法是计算映射一个形状的点的变换(下面的P [],其中有N个)最接近另一个的点(Q [])。这被称为(正交)Procrustes问题。如果结果点“足够接近” - 由于浮点运算的精度有限,你可能无法得到完美的匹配 - 你可以说你有匹配。
这是演习:
计算P的平均值并从P中减去P,得到p的说法。同样地从Q中减去Q的平均值。
计算p和q的'协方差'矩阵C,即:
C = Sum{ i | p[i]*q[i]' }/N
计算C的SVD,即找到正交的U,V和对角线S,以便
C = U*S*V'
最佳地将P映射到Q的变换是(正交)映射
R = V*U'
和翻译矢量
T = Qbar - R*Pbar
其中Qbar是Q的平均值,P的Pbar
但是,如果您只是想知道是否存在使点匹配的变换,那么您不需要计算R和T,您需要计算的是剩余误差,即
E = Sum{ i | |Q[i] - P~[i]|^2 }/N
其中P~s是通过上述变换转换的Ps,| x |是向量x的(欧几里德)范数。
您可以通过
计算E.E = Sum{ i | |q[i]|^2 + |p[i]|^2}/N - 2*Tr(S)
其中Tr是迹线,即对角线元素的总和。