如何计算保形仿射变换?

时间:2019-05-20 12:01:34

标签: python affinetransform image-registration

我正在研究图像配准问题,因此在提取特征点(一组3个或4个2D点)之后,我必须计算仿射变换矩阵。

根据定义,仿射变换由缩放,平移,旋转和剪切组成。就我而言,转换是保形的,这意味着不允许共享。

我尝试过的所有函数都通过剪切来计算仿射变换矩阵,如何实现保形仿射变换?

谢谢

1 个答案:

答案 0 :(得分:0)

您可以通过对不位于一条线上的3个点的作用来完全定义2D中的仿射变换。 很好地解释了为什么会在“ Beginner's guide to mapping simplexes affinely”中找到这种情况。 此外,您可能会发现一种非常简单的方法来恢复转换。 以下代码说明了总体思路(对不起代码风格,我是数学家,不是程序员)

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测试此代码,因此无需安装任何程序。

同一位作者发表了“ Workbook on mapping simplexes affinely”,其中包含许多此类实际示例。 如果您想从头开始创建自己的实现而不是修改此实现,则可能需要检查工作簿中的几个示例,以了解如何“手动”恢复仿射变换。