Фитинг проективного преобразования - PullRequest
2 голосов
/ 23 декабря 2010

Учитывая набор точек в 3D (X = (x1, x2, x3), Y = (y1, y2, y3)), как я могу подогнать преобразование из X в Y?

Насколько я знаю, это называется проективным преобразованием.
Вот пример X и Y.

Синие и красные линии в X параллельны, но не параллельны в Y.

alt text

alt text

Ответы [ 3 ]

2 голосов
/ 23 декабря 2010

Проективные преобразования в 3d имеют ассоциированную матрицу 4x4 (по модулю постоянного умножения).Вы можете найти матрицу с наименьшим квадратом.

1 голос
/ 15 сентября 2011

Итак, задача состоит в том, чтобы найти наиболее подходящее линейное преобразование , верно?

Существует простое решение с использованием линейной регрессии.

Скажем, матрица преобразования называется A и имеет размеры 3x3.И скажем, у вас есть N векторов (точек) в 3D до и после преобразования - так что у вас есть матрицы 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 

, как и ожидалось.

1 голос
/ 24 декабря 2010

Хорошо. Я нашел некоторую полезную информацию:

Это преобразование является нелинейным, и невозможно представить нелинейное преобразование с помощью матрицы. Есть несколько хитростей, таких как использование однородных координат. но это не делает все нелинейные преобразования представимыми с помощью матриц. Однако аппроксимация нелинейной функции линейной функцией возможна.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...