【发布时间】:2019-05-20 12:01:34
【问题描述】:
我正在研究图像配准问题,因此在提取特征点(一组 3 或 4 个 2D 点)后,我必须计算仿射变换矩阵。
仿射变换根据定义由缩放、平移、旋转和切变组成。在我的例子中,转换是保形的,这意味着不允许折叠。
我尝试过的所有函数都使用剪切计算仿射变换矩阵,我怎样才能实现保形仿射变换?
谢谢
【问题讨论】:
标签: python affinetransform image-registration
我正在研究图像配准问题,因此在提取特征点(一组 3 或 4 个 2D 点)后,我必须计算仿射变换矩阵。
仿射变换根据定义由缩放、平移、旋转和切变组成。在我的例子中,转换是保形的,这意味着不允许折叠。
我尝试过的所有函数都使用剪切计算仿射变换矩阵,我怎样才能实现保形仿射变换?
谢谢
【问题讨论】:
标签: python affinetransform image-registration
您可以通过对不在一条线上的 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”,其中包含许多此类实际示例。 如果您想从头开始创建自己的实现而不是修改这个,您可能需要查看工作簿中的几个示例,以了解如何“手动”恢复仿射变换。
【讨论】: