首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >如何计算共形仿射变换?

如何计算共形仿射变换?
EN

Stack Overflow用户
提问于 2019-05-20 20:01:34
回答 1查看 372关注 0票数 0

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

根据定义,仿射变换由缩放、平移、旋转和分片组成。在我的例子中,变换是保形的,这意味着不允许shiring。

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

谢谢

EN

回答 1

Stack Overflow用户

发布于 2019-06-10 19:22:02

您可以通过仿射变换对不在同一条线上的3个点的作用来完全定义2D中的仿射变换。下面的代码说明了总体思路(很抱歉代码风格--我是数学家,不是程序员)

代码语言:javascript
运行
复制
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测试这段代码,因此不需要安装任何东西。

如果你想从头开始创建你自己的实现,而不是修改这个实现,你可能想要检查工作簿中的几个例子,看看如何“手工”恢复仿射变换。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/56220626

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档