Matlab计算三维相似变换.fitgeotrans for 3D

Zhe*_*den 1 matlab transformation similarity affinetransform rotational-matrices

如何计算3D中4点之间的MatLab相似度变换?我可以从中计算变换矩阵

T*X = Xp,

但由于点坐标误差很小,它会给我仿射矩阵.我怎样才能将该矩阵与相似矩阵相匹配?我需要类似的东西fitgeotrans,但需要3D

谢谢

ray*_*ica 6

如果我正确地解释您的问题,您将寻找在3D变换矩阵中找到最佳扭曲一个点到另一个点的所有系数.你真正需要做的就是把这个问题放到线性系统中解决.回想一下,在3D中将一个点翘曲到另一个点只是:

A*s = t
Run Code Online (Sandbox Code Playgroud)

s = (x,y,z)是源点,t = (x',y',z')是目标点,A将是3 x 3转换矩阵,其格式为:

A = [a00 a01 a02]
    [a10 a11 a12] 
    [a20 a21 a22]
Run Code Online (Sandbox Code Playgroud)

写出实际的方程组A*s = t,我们得到:

a00*x + a01*y + a02*z = x'
a10*x + a11*y + a12*z = y'
a20*x + a21*y + a22*z = z'
Run Code Online (Sandbox Code Playgroud)

系数A是我们需要解决的问题.以矩阵形式重写,我们得到:

[x y z 0 0 0 0 0 0]   [a00]   [x']
[0 0 0 x y z 0 0 0] * [a01] = [y']
[0 0 0 0 0 0 x y z]   [a02]   [z']
                      [a10] 
                      [a11]
                      [a12]
                      [a20]
                      [a21]
                      [a22]
Run Code Online (Sandbox Code Playgroud)

假设您有四个点,则只需连接左侧矩阵的行和右侧的向量

[x1 y1 z1 0 0 0 0 0 0]   [a00]   [x1']
[0 0 0 x1 y1 z1 0 0 0]   [a01]   [y1']
[0 0 0 0 0 0 x1 y1 z1]   [a02]   [z1']
[x2 y2 z2 0 0 0 0 0 0]   [a10]   [x2']
[0 0 0 x2 y2 z2 0 0 0]   [a11]   [y2']
[0 0 0 0 0 0 x2 y2 z2]   [a12]   [z2']
[x3 y3 z3 0 0 0 0 0 0] * [a20] = [x3']
[0 0 0 x3 y3 z3 0 0 0]   [a21]   [y3']
[0 0 0 0 0 0 x3 y3 z3]   [a22]   [z3']
[x4 y4 z4 0 0 0 0 0 0]           [x4']
[0 0 0 x4 y4 z4 0 0 0]           [y4']
[0 0 0 0 0 0 x4 y4 z4]           [z4']

          S            *   a   =   T
Run Code Online (Sandbox Code Playgroud)

S现在将是一个包含上述格式的四个源点的矩阵,现在是您想要求解的矩阵中的变换系数a向量(以行 - 主格式排序),并且T将是目标点的向量.上面显示的格式.

要求解参数,您只需使用mldivide运算符或\MATLAB,它将为您计算最小二乘估计.因此:

a = S^{-1} * T
Run Code Online (Sandbox Code Playgroud)

因此,只需像上面那样构建矩阵,然后使用\运算符来求解矩阵中的变换参数.完成后,重塑T为3 x 3矩阵.因此:

S = ... ; %// Enter in your source points here like above
T = ... ; %// Enter in your target points in a right hand side vector like above

a = S \ T;
similarity_matrix = reshape(a, 3, 3).';
Run Code Online (Sandbox Code Playgroud)

关于每个坐标的小扰动中的误差,你得到的点越多越好.使用4肯定会给你一个解决方案,但在我看来,这还不足以减轻任何错误.

次要注意:这个(或多或少)是fitgeotrans引擎盖下的内容.它在给定一堆源点和目标点的情况下计算出最佳单应性,并使用最小二乘法确定这一点.

希望这能回答你的问题!