如何在MATLAB中计算仿射变换矩阵的“一半”

时间:2015-10-01 08:31:29

标签: matlab matrix matlab-cvst affinetransform

我希望使用MATLAB找到仿射变换矩阵的“一半”。是的,我理解,“一半”矩阵并不是真的正确,但我正在寻找的确实在这里得到了很好的解释:stackexchange mathematics

所以我正在寻找仿射变换矩阵(B),当对我的图像应用两次时,它会产生与应用我的初始矩阵(A)一次相同的结果。

反射不会成为A的一部分,否则找不到B。

我的初始矩阵(A)是使用A = estimateGeometricTransform(movingPoints,fixedPoints,'affine')计算的,它给了我一个affine2d对象。

如果无法从初始矩阵中找到“半”矩阵,可能会以某种方式操纵匹配点阵列以从中找到B。

干杯

1 个答案:

答案 0 :(得分:1)

我认为有可能找到你所说的 half 矩阵。它被称为矩阵平方根。假设你有matrixa A。在Matlab中,你可以B=sqrtm(A),其中m代表矩阵。然后你得到一个矩阵B,其中norm(B*B - A)非常小,如果矩阵A表现得很好。

如果我理解正确,您希望一半进行仿射变换aff = @(x) A*x + b。这可以使用同质坐标来完成。每个转换aff都可以用矩阵表示 M = [A b; zeros(1,length(b)) 1],其中

normalize = @(y) y(1:end-1)/y(end);
affhom = @(x) normalize(M*[x; 1]);

请注意,affaffhom完全相同。在这里,我们可以使用我之前谈论的内容。 {em> affhom可以使用

表示
affhomhalf = @(x) normalize(sqrtm(M)*[x; 1])

,其中

affhomhalf(affhomhalf(y)) - aff(y)
如果yA表现良好,

对所有b都很小。

我不确定这一点,但我认为你甚至可以将sqrtm(M)分解为线性和翻译部分。