Учитывая три точки вычисляют аффинную трансформацию

У меня есть два изображения и найдено три аналогичных 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 точек теории