投影变换拟合

时间:2010-12-23 17:03:08

标签: algorithm math

给定3D中的点集(X =(x1,x2,x3),Y =(y1,y2,y3)),如何适应从X到Y的变换?

据我所知,这被称为投射变换 这是X和Y的例子。

X中的蓝色和红色线是平行的,但它们在Y中不平行。

alt text

alt text

3 个答案:

答案 0 :(得分:2)

3d中的投影变换具有相关的4×4矩阵(模乘常数乘法)。你可以找到最小二乘拟合的矩阵。

答案 1 :(得分:1)

好。我找到了一些有用的信息:

这种变换是非线性的,不可能用矩阵表示非线性变换。有一些技巧,如使用同质坐标。但它并没有使用矩阵表示所有非线性变换。 但是,可以通过线性函数逼近非线性函数。

答案 2 :(得分:1)

所以,任务是找到最合适的linear transformation ,对吧?

使用线性回归有一个简单的解决方案。

假设转换矩阵名为A且尺寸为3x3。并且说在变换之前和之后你在3D中有N个向量(点) - 所以你有3行和N列的矩阵X和Y.然后转变是:

Y = A X + B

其中B是长度为3的向量并指定移位。您可以使用索引重写矩阵乘法:

y[i,j] = sum(k=1..3)(a[i,k] * x[k,j])  + b[i]

表示i = 1..3且j = 1 .. N.因此,您有12个未知变量(a,b)和3 * N方程。对于N> = 4,您只需使用线性回归找到最佳解决方案。

例如,在R中它很容易:

# input data
X = matrix(c(c(0, 0, 0), c(1, 0, 0), c(0, 1, 0), c(0, 1, 1)), nrow = 3)
Y = matrix(c(c(1, 0, 1), c(2, 0, 1), c(1, 1, 1), c(1, 1, 2)), nrow = 3)
# expected transformation: A is identity matrix, b is [1, 0, 1]
N = dim(Y)[2]

# transform data for regression
a1 = rbind(t(X), matrix(rep(0, 3*2*N), ncol = 3))
a2 = rbind(matrix(rep(0, 3*N), ncol = 3), t(X), matrix(rep(0, 3*N), ncol = 3))
a3 = rbind(matrix(rep(0, 3*2*N), ncol = 3), t(X))
b1 = rep(1:0, c(N, 2*N))
b2 = rep(c(0, 1, 0), each = N)
b3 = rep(0:1, c(2*N, N))
y = as.vector(t(Y))

# do the regression
summary(lm(y ~ 0 + a1 + a2 + a3 + b1 + b2 + b3))

输出是:

[...]

Coefficients:
      Estimate Std. Error t value Pr(>|t|)
a11  1.000e+00         NA      NA       NA
a12 -2.220e-16         NA      NA       NA
a13 -3.612e-32         NA      NA       NA
a21  7.850e-17         NA      NA       NA
a22  1.000e+00         NA      NA       NA
a23 -1.743e-32         NA      NA       NA
a31  0.000e+00         NA      NA       NA
a32  0.000e+00         NA      NA       NA
a33  1.000e+00         NA      NA       NA
b1   1.000e+00         NA      NA       NA
b2  -7.850e-17         NA      NA       NA
b3   1.000e+00         NA      NA       NA

Residual standard error: NaN on 0 degrees of freedom
Multiple R-squared:     1,      Adjusted R-squared:   NaN 
F-statistic:   NaN on 12 and 0 DF,  p-value: NA 

正如所料。