Как вычислить конформное аффинное преобразование? - PullRequest
0 голосов
/ 20 мая 2019

Я работаю над проблемой регистрации изображений, поэтому после извлечения характерных точек (набор из 3 или 4 2D точек) мне нужно вычислить матрицу аффинного преобразования.

Аффинное преобразование по определению состоит из масштабирования, перевода, вращения и сложения. В моем случае преобразование является конформным, что означает, что найм не допускается.

Все функции, которые я пробовал, вычисляют матрицу аффинного преобразования с помощью сдвига. Как мне добиться конформного аффинного преобразования?

Спасибо

1 Ответ

0 голосов
/ 10 июня 2019

Вы можете полностью определить аффинное преобразование в 2D, воздействуя на 3 точки, которые не лежат на одной линии. Хорошее объяснение того, почему это так, вы можете найти в « Руководстве для начинающих по аффинному отображению симплексов ». Кроме того, вы можете найти там очень простой способ восстановить преобразование. Следующий код иллюстрирует общую идею (извините за стиль кода - я математик, а не программист)

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 , поэтому вам не нужно ничего устанавливать.

Те же авторы опубликовали « Учебное пособие по аффинно отображению симплексов », в котором содержится много практических примеров такого рода. Если вы хотите создать свою собственную реализацию с нуля, а не изменять ее, вы можете проверить несколько примеров в рабочей книге, чтобы увидеть, как можно восстановить аффинное преобразование «руками».

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