【问题标题】:How to compute conformal affine transformation?如何计算保形仿射变换?
【发布时间】:2019-05-20 12:01:34
【问题描述】:

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

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

我尝试过的所有函数都使用剪切计算仿射变换矩阵,我怎样才能实现保形仿射变换?

谢谢

【问题讨论】:

    标签: python affinetransform image-registration


    【解决方案1】:

    您可以通过对不在一条线上的 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”,其中包含许多此类实际示例。 如果您想从头开始创建自己的实现而不是修改这个,您可能需要查看工作簿中的几个示例,以了解如何“手动”恢复仿射变换。

    【讨论】:

      猜你喜欢
      • 2020-01-03
      • 2018-04-09
      • 2014-05-22
      • 1970-01-01
      • 1970-01-01
      • 2018-09-02
      • 1970-01-01
      • 1970-01-01
      • 2010-12-17
      相关资源
      最近更新 更多