給定三維點(X =(x1,x2,x3),Y =(y1,y2,y3))中的點集,我如何擬合從X到Y的變換?投影變換擬合
就我所知這叫做投影變換。
這裏是X的例子和Y.
藍色和紅色的線X是平行的,但它們沒有在Y.平行於3D
給定三維點(X =(x1,x2,x3),Y =(y1,y2,y3))中的點集,我如何擬合從X到Y的變換?投影變換擬合
就我所知這叫做投影變換。
這裏是X的例子和Y.
藍色和紅色的線X是平行的,但它們沒有在Y.平行於3D
射影變換具有一個關聯的4×4矩陣(以常數乘法爲模)。你可以找到最小二乘擬合的矩陣。
好吧。我發現了一些有用的信息:
這種變換是非線性的,不可能用矩陣表示非線性變換。有一些技巧,如使用同質座標。但它不會使用矩陣表示所有非線性變換。然而,通過線性函數逼近非線性函數是可能的。
所以,任務是找到最合適的linear transformation,對嗎?
有使用線性迴歸的簡單解決方案。
說出變換矩陣被命名爲A
,具有尺寸3×3。並且假設在轉換之前和之後在3D中有N
矢量(點) - 所以您的矩陣X和Y爲3行N列。然後轉換爲:
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
如預期。
什麼是用來創建這些圖?只是好奇。 – ja72 2011-07-20 11:37:48
@ ja72 python + matplotlib – qutron 2011-07-26 19:41:58
請參閱http://tinyurl.com/5wkhaf8 – 2011-09-14 04:46:36