Вы можете полностью определить аффинное преобразование в 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 , поэтому вам не нужно ничего устанавливать.
Те же авторы опубликовали « Учебное пособие по аффинно отображению симплексов », в котором содержится много практических примеров такого рода.
Если вы хотите создать свою собственную реализацию с нуля, а не изменять ее, вы можете проверить несколько примеров в рабочей книге, чтобы увидеть, как можно восстановить аффинное преобразование «руками».