Python仿射变换坐标转换输出M矩阵为零问题排查求助
仿射变换零矩阵问题修复方案
问题原因
你所有控制点input_sys、output_sys以及待转换点的Z轴值都固定为0,属于共面共Z值的点集,你用于计算行列式的矩阵为奇异矩阵,行列式恒为0,最终输出的M矩阵自然全为0。
你当前的需求是2D平面上的仿射变换,完全不需要引入Z轴维度,3个不共线的2D控制点即可解出2D仿射变换的全部6个参数,你手头的4个控制点已经满足求解要求,降维处理即可。
修复要点
- 移除所有点冗余的Z轴维度,统一使用2D坐标计算
- 替换自定义行列式求解逻辑,用numpy内置的最小二乘方法求解参数,避免数值稳定性问题
- 原代码中导入json、math以及读取labels3.txt的逻辑后续未使用,不需要的话可以直接删除,避免文件读取报错
修改后可运行代码
import numpy as np # 带地理参考的地平面图像2D坐标 input_sys = np.array([[0,0],[0,23133],[35093,23133],[35093,0]]) # 斜距2D坐标 output_sys = np.array([[0,0],[0,16384],[16384,16384],[16384,0]]) # 待转换的2D坐标点 p = np.array([7954,9338]) # 构造线性方程组求解仿射变换参数 point_count = len(input_sys) # 自变量矩阵:每个点拼接1列常数项1 X = np.hstack([input_sys, np.ones((point_count, 1))]) Y = output_sys # 最小二乘求解适配冗余控制点输入 params, _, _, _ = np.linalg.lstsq(X, Y, rcond=None) # 拆分得到变换矩阵A和平移向量t A = params[:2, :].T t = params[2, :] # 输出变换参数 print("Affine transformation matrix:\n", A) print("Affine transformation translation vector:\n", t) # 测试控制点映射精度 print("\nTesting:") for p_test, P_test in zip(input_sys, output_sys): image_p = np.dot(A, p_test) + t result = "[OK]" if np.allclose(image_p, P_test, atol=1e-3) else "[ERROR]" print(p_test, " mapped to: ", image_p, " ; expected: ", P_test, result) # 转换目标点 P = np.dot(A, p) + t print('\nTarget point conversion result:') print(p, 'mapped to:', P)
运行说明
运行后得到的变换矩阵为预期的缩放矩阵,X轴缩放比例为16384/35093 ≈ 0.467,Y轴缩放比例为16384/23133 ≈ 0.708,平移向量为全0,完全符合控制点的对应关系,不会再出现零矩阵问题。
内容的提问来源于stack exchange,提问作者prashant
相关产品推荐
相关产品推荐

