繁体   English   中英

如何计算共形仿射变换?

[英]How to compute conformal affine transformation?

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

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

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

谢谢

您可以通过对不在一条线上的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测试此代码,因此您无需安装任何内容。

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM