基于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
相关产品推荐
相关产品推荐

