0

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

根据定义,仿射变换由缩放、平移、旋转和切变组成。在我的情况下,转换是保形的,这意味着不允许折叠。

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

谢谢

4

1 回答 1

0

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

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

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

于 2019-06-10T11:22:01.840 回答