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

如何用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)处的补偿系数,有两个疑问:

  1. 该如何实现这个需求?我关注了scipy.interpolate.interp2d,但不确定是否适用;
  2. 如果后续添加更多用于定义网格的点,该怎么处理?

解决方案

针对疑问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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.05 06:41:34