使用CPD算法进行仿射变换的疑问

本文介绍了如何使用Python的pycpd库进行2D仿射变换,并展示了如何通过AffineRegistration进行图像点集的配准。然而,作者提到在应用最终的仿射变换参数时,发现点集坐标有较大误差,寻求解释和可能的解决方案。
摘要由CSDN通过智能技术生成
# 将发根点数据进行配准(成功)
# affine——2D
# 输入的第一个量X不变,将第二个量Y往第一个量上做偏移

from functools import partial
import matplotlib.pyplot as plt
from pycpd import AffineRegistration
import numpy as np
import cv2


def apply_affine_transformation(B, t, points, image_shape):
    # 创建一个空白图片
    transformed_image = np.zeros((*image_shape, 3), dtype=np.uint8)

    # 应用仿射变换
    transformed_points = np.dot(points, B.T) + t
    print(transformed_points)

    # 将变换后的点绘制在图片上
    for point in transformed_points:
        x, y = map(int, point)
        cv2.circle(transformed_image, (x, y), 3, (255, 255, 255), -1)

    return transformed_image


def visualize(iteration, error, X, Y, ax):
    plt.cla()
    ax.scatter(X[:, 0], X[:, 1], color='red', label='Target')
    ax.scatter(Y[:, 0], Y[:, 1], color='blue', label='Source')
    plt.text(0.87, 0.92, 'Iteration: {:d}\nQ: {:06.4f}'.format(
        iteration, error), horizontalalignment='center', verticalalignment='center', transform=ax.transAxes,
             fontsize='x-large')
    ax.legend(loc='upper left', fontsize='x-large')

    ax.invert_yaxis()  # 反转 y 轴方向

    plt.draw()
    plt.pause(0.001)


def main():
    X = np.loadtxt('../data/1.txt', delimiter=',')
    Y = np.loadtxt('../data/2.txt', delimiter=',')

    fig = plt.figure()
    ax = fig.add_subplot(111)

    # 创建了一个新的函数,其只需要提供iteration, error, X, Y这些参数,而ax参数已经固定为ax变量所代表的对象。
    callback = partial(visualize, ax=ax)

    reg = AffineRegistration(**{'X': X, 'Y': Y})
    reg.register(callback)
    plt.show()

    # 获取最终的仿射变换矩阵和平移向量
    final_B, final_t = reg.get_registration_parameters()
    print("Final affine transformation matrix:")
    print(final_B)
    print("Final translation vector:")
    print(final_t)

    # 创建一个空白图片,大小为 (height, width)
    height, width = 1944, 2596
    # 将目标点集 Y 应用仿射变换,并绘制在空白图片上
    transformed_image = apply_affine_transformation(final_B, final_t, X, (height, width))
    # 显示绘制好的图片
    plt.imshow(transformed_image)
    plt.axis('off')
    plt.show()


if __name__ == '__main__':
    main()

在可视化界面中,发现两组二维点可以较好的重合在一起,但是使用final_B, final_t对点集进行仿射变换,变换后的点集坐标与需要匹配的点集坐标出现很大的误差,有没有大佬可以解释下

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值