使用多项式插值法进行点间拟合。
多项式方程:
展开形式:f(x)=a0x+a1x^2+a2x^3+...
给定n个平面坐标点,通过多项式方程可求解n个方程参数解,并且解是唯一的(自证)。
解法采用范德蒙行列式求解。
在图像处理过程中有时会用到线段区域拟合,因此采用插值法将n点之间进行点补充。
一阶方程:y=kx+b 需要两点(x1,y1),(x0,y0)
参数 k=(y1-y0)/(x1-x0),b=y0-k*x0
可以使用scipy库中的插值类
举个例子:对5点之间进行一阶插值
import numpy as np
from scipy.interpolate import interp1d,interp2d
import pylab as pl
x=np.array([1,2,3,4,5])
y=np.array([1,4,2,4,1])
fun=interp1d(x,y,kind='linear')#函数 y是一系列点,根据x,y关系推出函数
xint=np.linspace(x.min(),x.max(),20)
print("库x:",xint)
print("库y:",fun(xint))
pl.scatter(x,y,c='b',marker='o')
pl.plot(xint,fun(xint),color='red')
pl.show()
插值后的图像
输出插值结果
库x: [1. 1.21052632 1.42105263 1.63157895 1.84210526 2.05263158
2.26315789 2.47368421 2.68421053 2.89473684 3.10526316 3.31578947
3.52631579 3.73684211 3.94736842 4.15789474 4.36842105 4.57894737
4.78947368 5. ]
库y: [1. 1.63157895 2.26315789 2.89473684 3.52631579 3.89473684
3.47368421 3.05263158 2.63157895 2.21052632 2.21052632 2.63157895
3.05263158 3.47368421 3.89473684 3.52631579 2.89473684 2.26315789
1.63157895 1. ]
自定义插值
import numpy as np
from scipy.interpolate import interp1d,interp2d
import pylab as pl
#------------------------
x=np.array([1,2,3,4,5])
y=np.array([1,4,2,4,1])
xint=np.linspace(x.min(),x.max(),20)
# 1、线性
def linear_inter(x0,y0,x1,y1,nx):
k=(y1-y0)/(x1-x0)
b=y0-k*x0
ny=k*nx+b
return ny
for i in range(1,len(x)):
print("-----第",i,"区间内数据-----")
# print(ny)
nx=[]
for val in xint:
if val>=x[i-1] and val<=x[i]:
nx.append(val)
print(nx)
nx=np.array(nx)
ny = linear_inter(x[i - 1], y[i - 1], x[i], y[i], nx)
print("结果",ny)
pl.scatter(x,y,c='b',marker='o')
pl.plot(nx,ny,color='red')
pl.show()
由于分段连接与上图结果有所区别。
每个两点区间获得的y值均相等。
-----第 1 区间内数据-----
[1.0, 1.2105263157894737, 1.4210526315789473, 1.631578947368421, 1.8421052631578947]
结果 [1. 1.63157895 2.26315789 2.89473684 3.52631579]
-----第 2 区间内数据-----
[2.052631578947368, 2.263157894736842, 2.473684210526316, 2.6842105263157894, 2.894736842105263]
结果 [3.89473684 3.47368421 3.05263158 2.63157895 2.21052632]
-----第 3 区间内数据-----
[3.1052631578947367, 3.3157894736842106, 3.526315789473684, 3.7368421052631575, 3.9473684210526314]
结果 [2.21052632 2.63157895 3.05263158 3.47368421 3.89473684]
-----第 4 区间内数据-----
[4.157894736842105, 4.368421052631579, 4.578947368421052, 4.789473684210526, 5.0]
结果 [3.52631579 2.89473684 2.26315789 1.63157895 1. ]