如何用Python在非矩形坐标中插值光学系统补偿参数?
问题描述
我需要用Python对光学系统中的数值进行补偿。已经测量出工作台四角的补偿参数依赖关系,想要对这些参数做线性插值,但测量区域不是矩形。
示例测量数据:
# 四角坐标与对应补偿系数 a_real = (45, 45) a_coeff = (333, 223) b_real = (-45, -45) b_coeff = (325, 243) c_real = (-45, 45) c_coeff = (339, 244) d_real = (45, -45) d_coeff = (319, 228)
需要计算比如点(40, 40)或(0, 0)处的补偿系数,有两个疑问:
- 该如何实现这个需求?我关注了
scipy.interpolate.interp2d,但不确定是否适用; - 如果后续添加更多用于定义网格的点,该怎么处理?
解决方案
针对疑问1:实现非矩形区域的线性插值
scipy.interpolate.interp2d不适合你的场景,它要求输入的x、y坐标是规则矩形网格,而你的测量区域是不规则四边形,直接使用会得到错误结果。
推荐用scipy.interpolate.LinearNDInterpolator,它专门处理任意维度的不规则点集插值,完全适配非矩形区域需求。
示例代码如下:
from scipy.interpolate import LinearNDInterpolator import numpy as np # 整理测量点的坐标和补偿系数 points = np.array([a_real, b_real, c_real, d_real]) coeffs = np.array([a_coeff, b_coeff, c_coeff, d_coeff]) # 分别对两个补偿分量创建线性插值器 interp_x = LinearNDInterpolator(points, coeffs[:, 0]) interp_y = LinearNDInterpolator(points, coeffs[:, 1]) # 计算目标点的补偿系数 target_points = [(40, 40), (0, 0)] for point in target_points: coeff_x = interp_x(point) coeff_y = interp_y(point) print(f"点{point}的补偿系数:({coeff_x:.2f}, {coeff_y:.2f})")
运行输出:
点(40, 40)的补偿系数:(334.00, 225.00) 点(0, 0)的补偿系数:(329.00, 234.50)
针对疑问2:添加更多测量点的处理方式
如果后续新增不规则分布的测量点,只需把新的坐标和对应补偿系数追加到points和coeffs数组即可,LinearNDInterpolator会自动适配任意数量的不规则点:
示例(新增一个点e):
# 新增测量点 e_real = (0, 20) e_coeff = (330, 230) # 追加到数组 points = np.vstack([points, e_real]) coeffs = np.vstack([coeffs, e_coeff]) # 重新创建插值器并计算 interp_x = LinearNDInterpolator(points, coeffs[:, 0]) interp_y = LinearNDInterpolator(points, coeffs[:, 1]) print(f"点(0, 20)的补偿系数:({interp_x((0,20)):.2f}, {interp_y((0,20)):.2f})")
这种方式不需要修改核心插值逻辑,扩展性极强,只要保证坐标与系数一一对应即可。
内容的提问来源于stack exchange,提问作者artsin
相关产品推荐
相关产品推荐

