如何使用Python计算图像内无方程曲线对应给定点的数值或近似值
Python实现算图曲线数值查询的分步方案
- 第一步:完成像素坐标与物理坐标的映射
先定位算图坐标轴的四个基准点:找到x轴最小值、最大值分别对应的像素坐标,y轴最小值、最大值分别对应的像素坐标。如果图片是无畸变的正视图,直接用线性公式换算即可,注意图片的像素y轴默认从上到下递增,要和物理坐标的y轴(通常从下到上递增)做翻转处理;如果存在透视变形,用OpenCV的透视变换接口先把图片校正为正视图再做换算。 - 第二步:提取每条曲线的离散点集
如果不同曲线颜色区分明显,可以用OpenCV的颜色阈值分割功能自动提取每条曲线的像素点,过滤噪声后按曲线的数值打标签;如果颜色区分度低,可以用本地标注工具手动采样每条曲线的坐标点,按曲线数值分组存储。所有点集提取完成后,用样条插值给每条曲线生成连续的插值函数,方便后续查询。 - 第三步:实现任意点的数值计算逻辑
输入指定(x,y)后:- 固定x值,遍历所有曲线的插值函数,拿到每条曲线在该x下对应的y值,和对应曲线的数值标签一起按y值从小到大排序
- 判断输入的y落在排序后的哪两个y值区间内,对区间两端的曲线数值做线性插值即可得到近似值;如果y值小于所有曲线的对应y值或大于所有曲线的对应y值,直接返回最接近的边界曲线数值即可。
核心代码参考(依赖numpy、scipy)
import numpy as np from scipy.interpolate import interp1d # 示例数据:已提取的两条曲线点集,分别对应数值10、20 curve_10 = np.array([[0, 1], [1, 2], [2, 3.5], [3, 6]]) curve_20 = np.array([[0, 2], [1, 3.5], [2, 5.7], [3, 8]]) # 生成曲线的三次样条插值函数 f10 = interp1d(curve_10[:,0], curve_10[:,1], kind='cubic') f20 = interp1d(curve_20[:,0], curve_20[:,1], kind='cubic') def get_curve_value(input_x, input_y): y_10 = f10(input_x) y_20 = f20(input_x) # 边界处理 if input_y <= y_10: return 10.0 if input_y >= y_20: return 20.0 # 区间内线性插值 return 10 + (20 - 10) * (input_y - y_10) / (y_20 - y_10) # 测试调用 print(get_curve_value(1.5, 3.8))
优化建议
如果曲线数量较多,可以把所有曲线的插值函数和对应数值标签存在同一个列表里,每次查询时统一遍历排序,不需要单独写每个曲线的判断逻辑。
内容的提问来源于stack exchange,提问作者Ana Cláudia Faria
相关产品推荐
相关产品推荐

