我正在处理一个转换矩阵,我的目标是移除旋转变换,保留缩放、平移等变换。
我该怎么做?我想要创建一个手动编程的解决方案。
我该怎么做?我想要创建一个手动编程的解决方案。
http://callumhay.blogspot.com/2010/10/decomposing-affine-transforms.html
http://www.itk.org/pipermail/insight-users/2006-August/019025.html
根据转换的性质,这可能会更简单或更复杂。我假设它是仿射的。但如果是线性/刚性的话,那就容易得多。如果是透视转换,则我想它会更加复杂。
| x2 | | R11*SX R12*SY R13*SZ TX | | x1 |
| y2 | = | R21*SX R22*SY R23*SZ TY | | y1 |
| z2 | | R31*SX R32*SY R33*SZ TZ | | z1 |
| 1 | | 0 0 0 1 | | 1 |
其中(SX,SY,SZ)
为缩放因子,(TX,TY,TZ)
为平移因子,Rij
为旋转系数。
获取平移很简单,只需选择最后一列即可。要获取缩放比例,可以利用变换是旋转乘以对角线缩放的属性(A=R*S
),因此
tr(A)*A = tr(R*S)*(R*S) = tr(S)*tr(R)*R*S = tr(S)*S
其中tr(A)
表示转置操作符。要获取缩放因子,请计算
S2 = tr(A)*A
并选择前三个对角线元素的平方根
SX = sqrt(S2(1,1))
SY = sqrt(S2(2,2))
SZ = sqrt(S2(3,3))
| SX 0 0 TX |
| 0 SY 0 TY |
| 0 0 SZ TZ |
| 0 0 0 1 |
rotation = atan2(m12, m11)
scale = sqrt(m11*m11 + m12*m12)
translation = (m31, m32)
我没有注意到你对3D变换感兴趣,如果是这样,旋转部分可能会让人感到烦恼,但如果你只想进行平移和缩放...
translation = (m41, m42, m43)
scale = sqrt(m11*m11 + m12*m12 + m13*m13)
以下是我的方法(使用numpy):
b_to_a = np.linalg.inv(a_to_b)
a_to_b_only_translation = np.eye(4)
a_to_b_only_translation[:,3] = -b_to_a[:,3]