Учитывая три точки вычисляют аффинную трансформацию
У меня есть два изображения и найдено три аналогичных 2D-точки с использованием просеивания. Мне нужно вычислить аффинное преобразование между изображениями. К сожалению, я пропустил лекцию, и информация для меня немного плотная. Каким будет общий метод для вычисления этой матрицы 2x3?
У меня есть матрица точек в матрице 2x3 [x1 y1; x2 y2; x3 y3], но я теряюсь оттуда.
Спасибо за любую помощь.
Ответы
Ответ 1
Обычно аффинная транс морфия двумерных точек expersed как
x' = A*x
Где x
- трехвектор [x; y; 1]
исходного 2D-местоположения, а x'
- преобразованная точка. Аффинная матрица A
равна
A = [a11 a12 a13;
a21 a22 a23;
0 0 1]
Эта форма полезна, когда известны x
и A
, и вы хотите восстановить x'
.
Однако вы можете выразить это отношение по-другому.
Пусть
X = [xi yi 1 0 0 0;
0 0 0 xi yi 1 ]
и A
- это вектор столбца
a = [a11; a12; a13; a21; a22; a23]
Тогда
X*a = [xi'; yi']
Удерживает для всех пар соответствующих точек x_i, x_i'
.
Эта альтернативная форма очень полезна, когда вы знаете соответствие между парами точек и хотите восстановить параметры A
.
Укладывая все свои точки в большой матрице x
(две строки для каждой точки), вы будете иметь матрицу размером 2 * n-6, x
, умноженную на 6-вектор неизвестных A
, равную 2 * n-by -1 вектор столбцов уложенных соответствующих точек (обозначается символом x_prime
):
X*a = x_prime
Решение для A
:
a = X \ x_prime
Восстанавливает параметры A
в смысле наименьших квадратов.
Удачи и прекратите пропустить класс!
Ответ 2
Извините, что не использовал Matlab, но я немного поработал с Python. Я думаю, что этот код может помочь вам (извините за плохой стиль кода - я математик, а не программист)
import numpy as np
# input data
ins = [[1, 1], [2, 3], [3, 2]] # <- points
out = [[0, 2], [1, 2], [-2, -1]] # <- mapped to
# calculations
l = len(ins)
B = np.vstack([np.transpose(ins), np.ones(l)])
D = 1.0 / np.linalg.det(B)
entry = lambda r,d: np.linalg.det(np.delete(np.vstack([r, B]), (d+1), axis=0))
M = [[(-1)**i * D * entry(R, i) for i in range(l)] for R in np.transpose(out)]
A, t = np.hsplit(np.array(M), [l-1])
t = np.transpose(t)[0]
# output
print("Affine transformation matrix:\n", A)
print("Affine transformation translation vector:\n", t)
# unittests
print("TESTING:")
for p, P in zip(np.array(ins), np.array(out)):
image_p = np.dot(A, p) + t
result = "[OK]" if np.allclose(image_p, P) else "[ERROR]"
print(p, " mapped to: ", image_p, " ; expected: ", P, result)
Этот код демонстрирует, как восстановить аффинное преобразование в виде матрицы и вектора, и проверяет, что начальные точки отображаются в том месте, где они должны. Вы можете проверить этот код с помощью Google colab, поэтому вам не нужно ничего устанавливать. Возможно, вы можете перевести его на Matlab.
Что касается теории, лежащей в основе этого кода: он основан на уравнении, представленном в " Руководстве для начинающих по отображению симплексов аффинно ", восстановление матрицы описано в разделе "Восстановление канонической записи". Те же авторы опубликовали " Рабочую тетрадь по аффинному отображению симплексов ", в которой содержится много практических примеров такого рода.
Ответ 3
Вы можете проверить следующие два препринта, которые были недавно загружены в Research Gate:
- "Книга по аффинному отображению симплексов" содержит несколько примеров, точно таких, как вы хотите книгу
- "Руководство для начинающего отображения симплексов аффинны" развивает теорию, но раздел "Маломерный пример" содержит пример восстановления аффинного отображения с помощью заданных изображений 3 точек теории