You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

基于Python/Numpy从源点集与目标点集构建变换矩阵M

求解二维点集的变换矩阵

给定二维欧氏空间中一一对应的两组点集src和dst,需要计算变换矩阵M,使得所有点满足dst[i] = M · src[i](矩阵乘法)。由于点对数量远大于未知数,可通过Python结合Numpy用最小二乘法求解最优拟合矩阵。

实现步骤

1. 数据准备

先将点集转为Numpy数组,便于后续矩阵运算:

import numpy as np

# 替换为实际点集数据
src = np.array([
    [722.6, 1571.4],
    [832, 1466],
    [419, 1482],
    [1005, 2804],
    # 更多点对...
])

dst = np.array([
    [35839.65, 49808.55],
    [42771.08, 41488.07],
    [15764.26, 44065.95],
    [72760.36, 76645.15],
    # 更多点对...
])

2. 求解线性变换矩阵(2×2,无平移)

如果仅需要线性变换(不含平移),M为2×2矩阵。利用Numpy伪逆函数直接计算最小二乘解:

# 计算最优线性变换矩阵M
M = dst.T @ np.linalg.pinv(src.T)

# 验证变换效果
predicted_dst = src @ M.T  # 适配矩阵维度完成乘法
print("第一个点的预测值:", predicted_dst[0])
print("第一个点的真实值:", dst[0])

3. 求解仿射变换矩阵(2×3,含平移)

若实际场景需要包含平移的仿射变换,需将点转换为齐次坐标(添加全1列),再求解2×3的变换矩阵:

# 构造齐次坐标的源点集
src_homogeneous = np.hstack([src, np.ones((src.shape[0], 1))])

# 求解仿射变换矩阵
M_affine = dst.T @ np.linalg.pinv(src_homogeneous.T)

# 验证仿射变换效果
predicted_dst_affine = src_homogeneous @ M_affine.T
print("第一个点的仿射预测值:", predicted_dst_affine[0])
print("第一个点的真实值:", dst[0])

原理说明

当点对数量远大于未知数时,方程组为超定方程组,最小二乘法通过最小化所有点的变换误差平方和得到最优拟合结果。Numpy的np.linalg.pinv(伪逆)内部已封装最小二乘求解逻辑,代码简洁且效率高。

内容的提问来源于stack exchange,提问作者Hal

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.19 11:45:40