给定3D中的点集(X =(x1,x2,x3),Y =(y1,y2,y3)),如何适应从X到Y的变换?
据我所知,这被称为投射变换 这是X和Y的例子。
X中的蓝色和红色线是平行的,但它们在Y中不平行。
答案 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
正如所料。