常见几种插值方法

合集下载

插值的概念和各种基本方法

插值的概念和各种基本方法

插值的概念和各种基本方法插值是一种基于已知数据点的函数关系来估计未知数据点的方法。

在实际应用中,由于各种原因,我们经常只能通过有限的数据点来描述一个函数关系,而无法得到函数的精确表达式。

因此,通过插值方法,我们可以根据已知数据点推断出未知数据点的值,从而进行进一步的分析和预测。

插值的基本方法可以分为两类:多项式插值和非多项式插值。

1.多项式插值方法多项式插值是通过已知数据点构造一个多项式函数,使得该函数经过这些数据点,并且在插值区间内的其他位置也能够比较好地拟合实际数据。

常用的多项式插值方法包括拉格朗日插值和牛顿插值。

- 拉格朗日插值:拉格朗日插值是利用拉格朗日多项式来进行插值的方法。

给定 n+1 个已知数据点(x0, y0), (x1, y1), ..., (xn, yn),拉格朗日插值函数可以表示为:L(x) = Σ(yi * li(x))其中,li(x) = Π(x - xj) / Π(xi - xj),i ≠ j,函数 L(x)即为插值函数。

-牛顿插值:牛顿插值是通过对已知数据点进行差商运算来构造插值多项式的方法。

牛顿插值多项式可以表示为:N(x) = f[x0] + Σ(f[x0, x1, ..., xi] * (x - x0) * (x - x1)* ... * (x - xi-1))其中,f[x0, x1, ..., xi]表示 x0, x1, ..., xi 对应的差商。

2.非多项式插值方法非多项式插值方法是通过其他函数形式进行插值的方法,常用的非多项式插值方法包括分段线性插值和样条插值。

-分段线性插值:分段线性插值是将插值区间划分为多个小区间,然后在每个小区间内用线性函数来逼近实际数据。

具体地,给定相邻的两个已知数据点(x0,y0)和(x1,y1),分段线性插值函数可以表示为:L(x)=(y1-y0)/(x1-x0)*(x-x0)+y0-样条插值:样条插值是利用分段多项式函数来进行插值的方法。

插值计算的原理及应用

插值计算的原理及应用

插值计算的原理及应用1. 概述插值计算是一种通过已知数据点推测出未知数据点的数值的方法。

这种计算方法被广泛应用于各个领域,如数值分析、数据处理、图像处理等。

2. 原理插值计算的原理是基于一个假设:已知数据点之间存在某种规律或趋势,可以通过这种规律或趋势推测出未知数据点的数值。

插值计算的基本思想是在给定的数据点之间构建一个适当的插值函数,根据这个函数来推测出未知数据点的数值。

3. 插值方法插值计算有多种方法,下面列举了一些常用的插值方法:•线性插值:线性插值是最简单的插值方法之一。

它假设数据点之间的关系是线性的,通过这些已知点之间的直线来推测未知点的数值。

•拉格朗日插值:拉格朗日插值是一种基于多项式的插值方法。

它通过在已知数据点上构建一个多项式来推测未知数据点的数值。

•牛顿插值:牛顿插值也是一种基于多项式的插值方法。

它通过使用插值多项式的差商表来推测未知数据点的数值。

•样条插值:样条插值是一种通过在已知数据点之间构建多项式部分来推测未知数据点的数值的方法。

这些多项式部分称为样条函数。

4. 插值应用插值计算在各个领域都有广泛的应用,下面列举了一些常见的插值应用:•数值分析:在数值计算中,插值计算可以在给定数据点之间进行数值逼近,从而得到更加精确的结果。

•数据处理:在数据处理中,插值计算可以填补数据缺失的部分,从而得到完整的数据集。

•图像处理:在图像处理中,插值计算可以用于图像的放大、缩小、旋转等操作,从而得到更高质量的图像。

•地理信息系统:在地理信息系统中,插值计算可以根据已知地理数据点推测未知地理数据点的数值,从而进行地理信息的分析和预测。

5. 总结插值计算是一种通过已知数据点推测出未知数据点的数值的方法。

它基于已知数据点之间存在某种规律或趋势的假设,并通过构建适当的插值函数来推测未知数据点的数值。

插值计算有多种方法,如线性插值、拉格朗日插值、牛顿插值和样条插值等。

插值计算在各个领域都有广泛的应用,如数值分析、数据处理、图像处理和地理信息系统等。

各种插值法的对比研究

各种插值法的对比研究

各种插值法的对比研究插值法是指通过已知数据点来估计两个数据点之间的未知数值。

在实际生活和科学研究中,经常会遇到需要插值的情况,例如气象预测、金融分析、图像处理等。

本文将对比介绍几种常见的插值方法,包括线性插值、多项式插值、样条插值和逆距离加权插值。

1.线性插值:线性插值是最简单的插值方法,假设两个数据点之间的值变化是线性的。

根据已知数据点的坐标和对应的值,通过线性方程推断两个数据点之间的值。

优点是计算简单快速,但缺点是对数据变化较快的情况下估计效果较差。

2.多项式插值:多项式插值假设两个数据点之间的值变化是一个多项式函数。

通过已知数据点的坐标和对应的值,使用多项式拟合方法求解多项式函数的系数,再根据该多项式求解两个数据点之间的值。

多项式插值可以准确拟合已知数据点,但在插值点较多时容易出现振荡现象,且对数据点分布敏感。

3.样条插值:样条插值是一种平滑的插值方法,通过构建分段连续的多项式函数来逼近整个数据集。

根据已知数据点的坐标和对应的值,通过求解一组多项式函数的系数,使得在相邻区间之间函数值连续,导数连续。

样条插值可以减少振荡现象,对于插值点密集的情况能更好地逼近原始数据。

4.逆距离加权插值:逆距离加权插值是一种基于距离的加权插值方法,根据已知数据点与插值点之间的距离,对每个已知数据点进行加权平均得到插值点的值。

该方法认为距离较近的数据点对插值结果的影响更大。

逆距离加权插值简单易用,对数据点的分布不敏感,但对于距离较远的数据点容易受到较大的干扰。

在实际应用中,选择合适的插值方法需要根据数据的特点和要求来决定。

若数据变化较简单、平滑,可以选择线性插值或多项式插值;若数据变化复杂,存在振荡现象,可以选择样条插值;若数据点分布较稀疏,可以选择逆距离加权插值。

此外,还有一些其他的插值方法,如Kriging插值、径向基函数插值等,它们根据不同的假设和模型进行插值,具有一定的特点和适用范围。

综上所述,对于选择合适的插值方法,需要根据具体问题和数据特点来综合考虑,结合不同方法的优缺点进行比较研究,以得到更准确和可靠的插值结果。

常见插值方法和其介绍

常见插值方法和其介绍

常见插值方法及其介绍Inverse Distance to a Power(反距离加权插值法)”、“Kriging(克里金插值法)”、“Minimum Curvature(最小曲率)”、“Modified Shepard's Method(改进谢别德法)”、“Natural Neighbor(自然邻点插值法)”、“Nearest Neighbor(最近邻点插值法)”、“Polynomial Regression(多元回归法)”、“Radial Basis Function(径向基函数法)”、“Triangulation with Linear Interpolation(线性插值三角网法)”、“Moving Average(移动平均法)”、“Local Polynomial(局部多项式法)”1、距离倒数乘方法距离倒数乘方格网化方法是一个加权平均插值法,可以进行确切的或者圆滑的方式插值。

方次参数控制着权系数如何随着离开一个格网结点距离的增加而下降。

对于一个较大的方次,较近的数据点被给定一个较高的权重份额,对于一个较小的方次,权重比较均匀地分配给各数据点。

计算一个格网结点时给予一个特定数据点的权值和指定方次的从结点到观测点的该结点被赋予距离倒数成比例。

当计算一个格网结点时,配给的权重是一个分数,所有权重的总和等于1.0。

当一个观测点和一个格网结点重合时,该观测点被给予一个实际为 1.0 的权重,所有其它观测点被给予一个几乎为0.0 的权重。

换言之,该结点被赋给和观测点一致的值。

这就是一个准确插值。

距离倒数法的特征之一是要在格网区域内产生围绕观测点位置的"牛眼"。

用距离倒数格网化时可以指定一个圆滑参数。

大于零的圆滑参数保证,对于一个特定的结点,没有哪个观测点被赋予全部的权值,即使观测点和该结点重合也是如此。

圆滑参数通过修匀已被插值的格网来降低"牛眼"影响。

常见插值方法及其介绍

常见插值方法及其介绍

常见插值方法及其介绍Inverse Distance to a Power(反距离加权插值法)”、“Kriging(克里金插值法)”、“Minimum Curvature(最小曲率)”、“Modified Shepard's Method(改进谢别德法)”、“Natural Neighbor(自然邻点插值法)”、“Nearest Neighbor(最近邻点插值法)”、“Polynomial Regression(多元回归法)”、“Radial Basis Function(径向基函数法)”、“Triangulation with Linear Interpolation(线性插值三角网法)”、“Moving Average(移动平均法)”、“Local Polynomial(局部多项式法)”1、距离倒数乘方法距离倒数乘方格网化方法是一个加权平均插值法,可以进行确切的或者圆滑的方式插值。

方次参数控制着权系数如何随着离开一个格网结点距离的增加而下降。

对于一个较大的方次,较近的数据点被给定一个较高的权重份额,对于一个较小的方次,权重比较均匀地分配给各数据点。

计算一个格网结点时给予一个特定数据点的权值与指定方次的从结点到观测点的该结点被赋予距离倒数成比例。

当计算一个格网结点时,配给的权重是一个分数,所有权重的总和等于1.0。

当一个观测点与一个格网结点重合时,该观测点被给予一个实际为 1.0 的权重,所有其它观测点被给予一个几乎为0.0 的权重。

换言之,该结点被赋给与观测点一致的值。

这就是一个准确插值。

距离倒数法的特征之一是要在格网区域内产生围绕观测点位置的"牛眼"。

用距离倒数格网化时可以指定一个圆滑参数。

大于零的圆滑参数保证,对于一个特定的结点,没有哪个观测点被赋予全部的权值,即使观测点与该结点重合也是如此。

圆滑参数通过修匀已被插值的格网来降低"牛眼"影响。

常见插值方法及其介绍

常见插值方法及其介绍

常见插值方法及其介绍常见插值方法及其介绍Inverse Distance to a Power(反距离加权插值法)”、“Kriging(克里金插值法)”、“Minimum Curvature(最小曲率)”、“Modified Shepard's Method(改进谢别德法)”、“Natural Neighbor(自然邻点插值法)”、“Nearest Neighbor(最近邻点插值法)”、“Polynomial Regression(多元回归法)”、“Radial Basis Function(径向基函数法)”、“Triangulation with Linear Interpolation (线性插值三角网法)”、“Moving Average(移动平均法)”、“Local Polynomial(局部多项式法)”1、距离倒数乘方法距离倒数乘方格网化方法是一个加权平均插值法,可以进行确切的或者圆滑的方式插值。

方次参数控制着权系数如何随着离开一个格网结点距离的增加而下降。

对于一个较大的方次,较近的数据点被给定一个较高的权重份额,对于一个较小的方次,权重比较均匀地分配给各数据点。

计算一个格网结点时给予一个特定数据点的权值与指定方次的从结点到观测点的该结点被赋予距离倒数成比例。

当计算一个格网结点时,配给的权重是一个分数,所有权重的总和等于1.0。

当一个观测点与一个格网结点重合时,该观测点被给予一个实际为 1.0 的权重,所有其它观测点被给予一个几乎为 0.0 的权重。

换言之,该结点被赋给与观测点一致的值。

这就是一个准确插值。

距离倒数法的特征之一是要在格网区域内产生围绕观测点位置的"牛眼"。

用距离倒数格网化时可以指定一个圆滑参数。

大于零的圆滑参数保证,对于一个特定的结点,没有哪个观测点被赋予全部的权值,即使观测点与该结点重合也是如此。

圆滑参数通过修匀已被插值的格网来降低"牛眼"影响。

常见插值方法及其介绍

常见插值方法及其介绍

常见插值方法及其介绍常见的插值方法有最邻近插值、双线性插值、双三次插值和基于样条的插值方法。

下面将对这些方法进行介绍。

1.最邻近插值:最邻近插值是最简单也是最直观的插值方法之一、该方法的原理是将待插值点附近最近的一个已知像素的灰度值赋给待插值点。

这种插值方法的优点是计算简单且实时性好,但缺点是结果较为粗糙,会出现明显的锯齿状边缘。

2.双线性插值:双线性插值是一种基于线性插值的方法,它考虑了待插值点附近四个已知像素的灰度值来生成新的像素值。

具体而言,对于一个待插值点,首先在水平方向上计算它上下两个已知像素的插值,然后在竖直方向上计算其左右两个已知像素的插值,最后再在这两次插值的基础上进行一次线性插值。

这种插值方法的优点是计算相对简单,效果较好,但仍然会存在锯齿状边缘。

3.双三次插值:双三次插值是一种更为复杂的插值方法,它通过分析待插值点周围的16个已知像素的灰度值来生成新的像素值。

具体而言,双三次插值首先根据已知像素的位置与待插值点的距离计算出一个权重系数矩阵,然后将这个系数矩阵与对应的已知像素灰度值相乘并相加。

这种插值方法的优点是结果较为平滑,点缺失问题较少,但计算量较大。

4.基于样条的插值方法:基于样条的插值方法主要包括线性样条插值、三次样条插值和B样条插值。

这些方法是基于插值函数的一种改进,通过选取合适的插值函数形式来拟合已知像素点,从而实现待插值点的灰度值推测。

这些方法计算量较大,但插值效果相对较好,具有高度灵活性。

总结:常见的插值方法包括最邻近插值、双线性插值、双三次插值和基于样条的插值方法。

最邻近插值计算简单且实时性好,但结果较为粗糙;双线性插值效果较好,但仍然存在锯齿状边缘;双三次插值平滑度较高,但计算量较大;基于样条的插值方法具有高度灵活性,但计算量较大。

选择适合的插值方法需根据具体需求考虑。

常见的插值方法及其原理

常见的插值方法及其原理

常见的插值方法及其原理1. 拉格朗日插值法(Lagrange Interpolation)拉格朗日插值法是一种基于多项式的插值方法,通过n+1个已知点的函数值来构造一个n次多项式。

具体的计算公式如下:L(x) = Σ[yk * lk(x)], k=0 to n其中yk为已知点(xi, yi)的函数值,lk(x)为拉格朗日基函数,定义为:lk(x) = Π[(x - xj)/(xi - xj)], j=0 to n, j≠k拉格朗日插值法的原理是通过构造一个通过已知点的n次多项式,来代替未知函数的近似值。

利用拉格朗日基函数的性质,可以保证插值多项式通过已知点。

2. 牛顿插值法(Newton Interpolation)牛顿插值法是一种递推的插值方法,通过已知点的函数值和差商来逐步构造插值多项式。

差商的定义如下:f[x0]=y0f[x1]=(f[x1]-f[x0])/(x1-x0)f[x2]=(f[x2]-f[x1])/(x2-x1)...f[xn] = (f[xn] - f[xn-1]) / (xn - xn-1)利用差商的定义,可以得到牛顿插值多项式的表达式:N(x) = f[x0] + f[x0, x1](x-x0) + f[x0, x1, x2](x-x0)(x-x1) + ... + f[x0, x1, ..., xn](x-x0)(x-x1)...(x-xn)牛顿插值法的原理是通过递推计算差商来得到插值多项式。

通过使用差商来处理已知点的函数值差异,可以得到更高次的插值多项式。

3. 样条插值法(Spline Interpolation)样条插值法是一种基于分段低次插值函数的插值方法,常用的是三次样条插值。

样条插值法通过寻找一组分段函数,使得满足原函数的插值条件,并要求函数在每个插值点处的函数值、一阶导数和二阶导数连续。

这样可以保证插值函数在每个插值点处的平滑性。

三次样条插值法的原理是将整个插值区间划分为多个小区间,在每个小区间内使用三次多项式进行插值。

数值计算中的插值方法与误差分析

数值计算中的插值方法与误差分析

数值计算中的插值方法与误差分析数值计算是一门应用数学学科,广泛应用于科学与工程领域。

在实际问题中,我们常常需要通过已知的离散数据点来估计未知的数值。

插值方法就是为了解决这个问题而设计的。

插值方法是一种基于已知数据点,推断出未知数据点的数值计算方法。

常见的插值方法有拉格朗日插值、牛顿插值等。

下面我们将重点介绍这两种方法。

1. 拉格朗日插值法拉格朗日插值法是插值方法中最常见的一种。

它是基于拉格朗日多项式的思想。

假设我们有一组已知的数据点(x1, y1), (x2, y2), ..., (xn, yn),我们想要估计一个未知点x的函数值y。

拉格朗日插值法的基本思想是通过插值多项式来逼近原函数。

具体步骤如下:(1)根据已知数据点构造Lagrange插值多项式:L(x) = Σ(yi * Li(x)), i = 0, 1, ..., n其中,Li(x) = Π((x-xj)/(xi-xj)), j ≠ i(2)计算未知点x对应的函数值y:y = L(x)拉格朗日插值法的优点是简单易懂,计算方便。

然而,它也存在着一些问题,比如插值多项式的次数较高时,多项式在插值区间外的振荡现象明显,容易引起插值误差。

2. 牛顿插值法牛顿插值法是另一种常见的插值方法。

它是基于差商的思想。

假设我们有一组已知的数据点(x1, y1), (x2, y2), ..., (xn, yn),我们想要估计一个未知点x的函数值y。

牛顿插值法的基本思想是通过插值多项式来逼近原函数。

具体步骤如下:(1)计算差商:f[xi, xi+1, ..., xi+k] = (f[xi+1, ..., xi+k] - f[xi, ..., xi+k-1]) / (xi+k - xi)(2)根据已知数据点构造Newton插值多项式:N(x) = f[x0] + Σ(f[x0, x1, ..., xi] * Π(x - xj)), i = 0, 1, ..., n-1(3)计算未知点x对应的函数值y:y = N(x)牛顿插值法的优点是适用范围广,可以方便地添加新的数据点进行插值。

各种插值方法比较

各种插值方法比较

各种插值方法比较插值是一种常见的数据处理技术,用于估计缺失数据或填充数据空缺。

在数据分析、统计学和机器学习等领域中,插值可以帮助我们处理缺失数据或者对连续数据进行平滑处理。

常见的插值方法包括线性插值、多项式插值、样条插值、Kriging插值等。

1.线性插值:线性插值是一种简单但广泛使用的插值方法,基于原始数据中的两个点之间的直线来估计缺失点的值。

这种方法适用于数据分布较为均匀的情况,但对于非线性的数据,可能会导致估计值与实际值之间的较大误差。

2.多项式插值:多项式插值是通过使用多项式函数来拟合原始数据,从而估计缺失点的值。

多项式插值方法具有较高的灵活性,可以在不同的数据点之间产生平滑曲线,但在数据点较多时,可能会导致过拟合问题。

3.样条插值:样条插值是一种常见的插值方法,它通过使用分段多项式函数来拟合数据,从而在数据点之间产生平滑曲线。

样条插值方法克服了多项式插值的一些问题,同时在数据点较少的情况下也能有效地估计缺失点的值。

4. Kriging插值:Kriging插值是一种基于统计学和地理学原理的插值方法,它考虑了数据点之间的空间关系,并使用半变异函数来估计缺失点的值。

Kriging插值方法适用于具有空间相关性的数据,例如地理信息系统中的地形数据或环境监测数据。

除了上述常见的插值方法之外,还有一些其他的插值方法,如逆距离加权插值、最近邻插值、高阶插值等。

5.逆距离加权插值:逆距离加权插值方法假设距离越近的数据点对估计值的贡献越大,它根据数据点之间的距离来计算权重,并将其与对应数据点的值进行加权平均来估计缺失点的值。

逆距离加权插值方法适用于数据点密集、分布不均匀的情况,但对于噪声较大或异常值较多的数据,可能会导致估计值的不准确。

6.最近邻插值:最近邻插值方法简单和直观,它假设与缺失点距离最近的已知点的值与缺失点的值相同。

这种方法适用于数据点之间的空间相关性较强,但在数据点分布不均匀或者缺失点周围的数据点值变化较大的情况下,可能会导致估计值的不准确。

插值法计算方法举例

插值法计算方法举例

插值法计算方法举例插值法是一种数值逼近方法,用于在给定的一些数据点之间进行数值求解。

插值法的基本思想是通过已知数据点的函数值来构建一个插值函数,并利用该插值函数来估计未知数据点的函数值。

以下是一些常见的插值方法。

1.线性插值:线性插值是最简单的插值方法之一、假设我们有两个已知数据点 (x1, y1) 和 (x2, y2),我们想要在这两个数据点之间估计一个新的点的函数值。

线性插值方法假设这两个点之间的函数关系是线性的,即 y = f(x)= mx + c,其中 m 是斜率,c 是截距。

通过求解这两个点的斜率和截距,我们可以得到插值函数的表达式,从而计算出新点的函数值。

2.拉格朗日插值:拉格朗日插值是一种经典的插值方法,它利用一个多项式函数来逼近已知数据点之间的关系。

对于一组已知数据点 (x1, y1), (x2, y2), ..., (xn, yn),拉格朗日插值方法构建一个函数 L(x) 来逼近真实的函数f(x)。

L(x) 的表达式为 L(x) = y1 * L1(x) + y2 * L2(x) + ... + yn* Ln(x),其中 Li(x) 是拉格朗日插值基函数,定义为Li(x) = Π(j=1to n, j≠i) (x - xj) / (xi - xj)。

通过求解 L(x) 的表达式,我们可以计算出任意新点的函数值。

3.牛顿插值:牛顿插值是另一种常用的插值方法,它是通过一个递推的过程来构建插值函数。

对于一组已知数据点 (x1, y1), (x2, y2), ..., (xn, yn),牛顿插值方法定义一个差商表,然后根据该表构建一个递推的多项式函数来逼近真实的函数 f(x)。

差商表的计算使用了递归的方式,其中第 i 阶差商定义为 f[xi, xi+1, ..., xi+j] = (f[xi+1, xi+2, ..., xi+j] - f[xi, xi+1, ..., xi+j-1]) / (xi+j - xi)。

数值分析中常用的插值方法

数值分析中常用的插值方法

数值分析中常用的插值方法在数值计算中,许多问题都可以用插值方法来近似求解,比如曲线拟合、函数逼近和图像重建等。

插值方法是指在已知数据点的情况下,通过一些数值计算技巧,在每个数据点处构造一个多项式函数,使得该函数在每个数据点处都能通过数据点。

在数据点之间计算函数值时,就可以使用这个多项式函数进行估算。

接下来,我们就来详细介绍一些常见的插值方法。

一、拉格朗日插值法拉格朗日插值法是一个经典的插值方法,它的思想是通过给定的数据点,构造一个经过这些点的多项式函数进行逼近。

具体来讲,拉格朗日插值法会首先构造一个基函数,该函数满足只在其对应的数据点处等于1,其余的数据点处等于0。

然后,根据基函数和数据点,构造一个多项式函数,使得该函数在每个数据点处都能通过数据点。

最终得到的多项式函数就是插值函数。

优点:简单易懂,使用较为广泛。

缺点:多项式次数较高时造成的误差会较大,且在数据点密集的区域可以出现龙格现象,使得插值函数在某些区间内呈现大幅度振荡。

二、牛顿插值法牛顿插值法是一种递推式的插值方法,它通过利用已知的数据点和前面已经计算出来的差商,得到一个逐步逼近的插值函数。

具体来讲,牛顿插值法会先将已知的数据点连成一条曲线,然后逐个向这条曲线添加新的数据点,每次添加一个新的数据点后,将差商计算出来并加入到之前的差商序列中,最终得到一个多项式函数,它在每个数据点处都能通过数据点。

牛顿插值法的优缺点与拉格朗日插值法相似,但是由于牛顿插值法是递推式的,可以方便的添加新的数据点,因此在数据点多变的情况下,牛顿插值法具有很大的优势。

三、分段插值法分段插值法是一种将插值区间划分为多个子区间的插值方法,在每个子区间内使用插值方法进行插值,然后将所有子区间内的插值函数拼接起来,得到最终的插值函数。

分段插值法主要分为两种:线性分段插值和三次样条插值。

1.线性分段插值线性分段插值的思路很简单,即在每个数据点处构造两条直线,在数据点之间的区间内使用一条直线作为插值函数。

常见插值算法--拉格朗日插值、三次卷积插值、三次样条插值、兰克索斯插值

常见插值算法--拉格朗日插值、三次卷积插值、三次样条插值、兰克索斯插值

常见插值算法--拉格朗⽇插值、三次卷积插值、三次样条插值、兰克索斯插值写在前⾯本⽂简单介绍了⼏种常见的插值算法并附带了相应的python代码,本⽂公式使⽤latex编写,如有错误欢迎评论指出,如果谁知道如何修改latex字号也欢迎留⾔关于⼀维、⼆维和多维插值三次卷积插值、拉格朗⽇两点插值(线性插值)、兰克索斯插值在⼆维插值时改变x和y⽅向的计算顺序不影响最终结果,这三个也是图像缩放插值时常⽤的插值算法,⽽其他插值在改变计算顺序时会产⽣明显差异,多维的情况笔者没有尝试,读者可以⾃⾏尝试或推导最近邻插值法(Nearest Neighbour Interpolation)在待求像素的四邻像素中,将距离待求像素最近的像素值赋给待求像素p_{11}p_{12}pp_{21}p_{22}python代码1def NN_interpolation(srcImg, dstH, dstW):2 scrH, scrW, _ = srcImg.shape3 dstImg = np.zeros((dstH, dstW, 3), dtype=np.uint8)4for i in range(dstH - 1):5for j in range(dstW - 1):6 scrX = round(i * (scrH / dstH))7 scrY = round(j * (scrW / dstW))8 dstImg[i, j] = srcImg[scrX, scrY]9return dstImg拉格朗⽇插值(Lagrange Interpolation)拉格朗⽇插值法需要找到k个p_i(x)函数,使得每个函数分别在在x_i处取值为1,其余点取值为0,则y_ip_i(x)可以保证在x_i处取值为y_i,在其余点取值为0,因此L_k(x)能恰好经过所有点,这样的多项式被称为拉格朗⽇插值多项式,记为L_k(x)=\sum_{i=1}^ky_ip_i(x)p_i(x)=\prod_{j \neq i}^{1 \leq j \leq k}\frac{x-x_j}{x_i-x_j}以四点即三次图像插值为例,因为横坐标间隔为1,则设四个点横坐标为-1、0、1和2,可得p_1(x)、p_2(x)、p_3(x)和p_4(x)假设y_1、y_2、y_3和y_4分别为1、2、-1、4,则可得拉格朗⽇函数如下图所⽰,待插值点横坐标范围为[0,1]在K=2时在k=2时,也被称为线性插值通⽤公式p_1=\frac{x-x_2}{x_1-x_2}p_2=\frac{x-x_1}{x_2-x_1}\begin{align} L_2x &= p_1y_1+p_2y_2 \nonumber \\ &= \frac{x-x_2}{x_1-x_2}y_1 + \frac{x-x_1}{x_2-x_1}y_2 \nonumber \end{align}图像插值像素分布如图所⽰p_{11}p_{12}pp_{21}p_{22}即当x_{i+1}=x_i+1时,设p与p_{11}的横纵坐标差分别为dx和dy\begin{align} L_2x &= \frac{x-x_2}{x_1-x_2}y_1 + \frac{x-x_1}{x_2-x_1}y_2 \nonumber \\ &= (x_2-x)y_1+(x-x_1)y_2 \nonumber \\ &= (1-dx)y_1+dxy_2 \nonumber \\ &= (y_2-y_1)dx+y_1 \nonumber \end{align}L_2'x=y_2-y_1在K=3时通⽤公式p_1=\frac{x-x_2}{x_1-x_2}\frac{x-x_3}{x_1-x_3}p_2=\frac{x-x_1}{x_2-x_1}\frac{x-x_3}{x_2-x_3}p_3=\frac{x-x_1}{x_3-x_1}\frac{x-x_2}{x_3-x_2}\begin{align} L_3x &= p_1y_1+p_2y_2+p_3y_3 \nonumber \\ &= \frac{x-x_2}{x_1-x_2}\frac{x-x_3}{x_1-x_3}y_1+\frac{x-x_1}{x_2-x_1}\frac{x-x_3}{x_2-x_3}y_2+\frac{x-x_1}{x_3-x_1}\frac{x-x_2}{x_3-x_2}y_3 \nonumber \end{align}图像插值像素分布如图所⽰p_{11}p_{12}p_{13}p_{21}p_{22}p_{23}pp_{31}p_{32}p_{33}即当x_{i+1}=x_i+1时,设p与p_{11}的横纵坐标差分别为dx和dy\begin{align} L_3x &= \frac{x-x_2}{x_1-x_2}\frac{x-x_3}{x_1-x_3}y_1 + \frac{x-x_1}{x_2-x_1}\frac{x-x_3}{x_2-x_3}y_2 + \frac{x-x_1}{x_3-x_1}\frac{x-x_2}{x_3-x_2}y_3 \nonumber \\ &= \frac{-dx(1-dx)}{(-1)\cdot(-2)}y_1 + \frac{-(1+dx)(1-dx)}{1\cdot(-1)}y_2 + \frac{(1+dx)dx}{2\cdot 1}y_3 \nonumber \\ &= (\frac{1}{2}d^2x-\frac{1}{2}dx)y_1 - (d^2x-1)y_2 + (\frac{1}{2}d^2x+\frac{1}{2}dx)y_3 \nonumber \\ &= d^2x(\frac{1}{2}y_1-y_2+\frac{1}{2}y_3)+dx(-\frac{1}{2}y_1+\frac{1}{2}y_3)+y_2 \nonumber \end{align}L_3'x=dx(y_1-2y_2+y_3)+(\frac{1}{2}y_3-\frac{1}{2}y_1)在K=4时通⽤公式p_1=\frac{x-x_2}{x_1-x_2}\frac{x-x_3}{x_1-x_3}\frac{x-x_4}{x_1-x_4}p_2=\frac{x-x_1}{x_2-x_1}\frac{x-x_3}{x_2-x_3}\frac{x-x_4}{x_2-x_4}p_3=\frac{x-x_1}{x_3-x_1}\frac{x-x_2}{x_3-x_2}\frac{x-x_4}{x_3-x_4}p_4=\frac{x-x_1}{x_4-x_1}\frac{x-x_2}{x_4-x_2}\frac{x-x_3}{x_4-x_3}\begin{align} L_4x &= p_1y_1+p_2y_2+p_3y_3+p_4y_4 \nonumber \\ &= \frac{x-x_2}{x_1-x_2}\frac{x-x_3}{x_1-x_3}\frac{x-x_4}{x_1-x_4}y_1 + \frac{x-x_1}{x_2-x_1}\frac{x-x_3} {x_2-x_3}\frac{x-x_4}{x_2-x_4}y_2 + \frac{x-x_1}{x_3-x_1}\frac{x-x_2}{x_3-x_2}\frac{x-x_4}{x_3-x_4}y_3 + \frac{x-x_1}{x_4-x_1}\frac{x-x_2}{x_4-x_2}\frac{x-x_3}{x_4-x_3}y_4\nonumber \end{align}图像插值p_{11}p_{12}p_{13}p_{14}p_{21}p_{22}p_{23}p_{24}pp_{31}p_{32}p_{33}p_{34}p_{41}p_{42}p_{43}p_{44}即当x_{i+1}=x_i+1时,设p与p_{11}的横纵坐标差分别为dx和dy\begin{align} L_4x &= \frac{x-x_2}{x_1-x_2}\frac{x-x_3}{x_1-x_3}\frac{x-x_4}{x_1-x_4}y_1 + \frac{x-x_1}{x_2-x_1}\frac{x-x_3}{x_2-x_3}\frac{x-x_4}{x_2-x_4}y_2 + \frac{x-x_1}{x_3-x_1}\frac{x-x_2}{x_3-x_2}\frac{x-x_4}{x_3-x_4}y_3 + \frac{x-x_1}{x_4-x_1}\frac{x-x_2}{x_4-x_2}\frac{x-x_3}{x_4-x_3}y_4 \nonumber \\ &= \frac{dx[-(1-dx)][-(2-dx)]}{(-1)\cdot(-2)\cdot(-3)}y_1 + \frac{(1+dx)[-(1-dx)][-(2-dx)]}{1\cdot(-1)\cdot(-2)}y_2 + \frac{(1+dx)dx[-(2-dx)]}{2\cdot 1\cdot(-1)}y_3 + \frac{(1+dx)dx[-(1-dx)]}{3\cdot 2\cdot 1}y_4 \nonumber \\ &= \frac{d^3x-3d^2x+2dx}{-6}y1 + \frac{d^3x-2d^2x-dx+2}{2}y_2 + \frac{d^3x-d^2x-2dx}{-2}y_3 + \frac{d^3x-dx}{6}y_4 \nonumber \\ &= d^3x(-\frac{1}{6}y_1+\frac{1}{2}y_2-\frac{1} {2}y_3+\frac{1}{6}y_4)+d^2x(\frac{1}{2}y_1-y_2+\frac{1}{2}y_3)+dx(-\frac{1}{3}y_1-\frac{1}{2}y_2+y_3-\frac{1}{6}y_4)+y_2 \nonumber \end{align}\begin{align} L_4'x &= d^2x(-\frac{1}{2}y_1+\frac{3}{2}y_2-\frac{3}{2}y_3+\frac{1}{2}y_4)+dx(y_1-2y_2+y_3)+(-\frac{1}{3}y_1-\frac{1}{2}y_2+y_3-\frac{1}{6}y_4) \nonumber \\ &= -[\frac{1}{2}d^2x(y_1-3y_2+3y_3-y_4)-dx(y_1-2y_2+y_3)+\frac{1}{6}(2y_1+3y_2-6y_3+y_4)] \nonumber \end{align}python代码插值核计算的时候乘法和加减法计算的顺序不同可能会导致结果存在细微的差异,读者可以⾃⾏研究⼀下1class BiLagrangeInterpolation:2 @staticmethod3def LagrangeInterpolation2(x, y1, y2):4 f1 = 1 - x5 f2 = x6 result = y1 * f1 + y2 * f27return result89 @staticmethod10def LagrangeInterpolation3(x, y1, y2, y3):11 f1 = (x ** 2 - x) / 2.012 f2 = 1 - x ** 213 f3 = (x ** 2 + x) / 2.014 result = y1 * f1 + y2 * f2 + y3 * f315return result1617 @staticmethod18def LagrangeInterpolation4(x, y1, y2, y3, y4):19 f1 = - (x ** 3 - 3 * x ** 2 + 2 * x) / 6.020 f2 = (x ** 3 - 2 * x ** 2 - x + 2) / 2.021 f3 = - (x ** 3 - x ** 2 - 2 * x) / 2.022 f4 = (x ** 3 - x) / 6.023 result = y1 * f1 + y2 * f2 + y3 * f3 + y4 * f424return result2526def biLag2_2(self, srcImg, dstH, dstW):27 dstH, dstW = int(dstH), int(dstW)28 srcH, srcW, _ = srcImg.shape29 srcImg = np.pad(srcImg, ((1, 1), (1, 1), (0, 0)), 'edge')30 dstImg = np.zeros((dstH, dstW, 3), dtype=np.uint8)31for dstY in range(dstH):32for dstX in range(dstW):33for channel in [0, 1, 2]:34# p11 p1235# p36# p21 p2237# 储存为 p(y, x)38 p = [dstY * srcH / dstH, dstX * srcW / dstW]39 p11 = [math.floor(p[0]), math.floor(p[1])]40 p12 = [p11[0], p11[1] + 1]4142 p21 = [p11[0] + 1, p11[1]]43 p22 = [p21[0], p12[1]]4445 diff_y, diff_x = p[0] - p11[0], p[1] - p11[1]46 r1 = grangeInterpolation2(diff_x, srcImg[p11[0], p11[1], channel], srcImg[p12[0], p12[1], channel])47 r2 = grangeInterpolation2(diff_x, srcImg[p21[0], p21[1], channel], srcImg[p22[0], p22[1], channel])4849 c = grangeInterpolation2(diff_y, r1, r2)5051 dstImg[dstY, dstX, channel] = np.clip(c, 0, 255)52return dstImg5354def biLag3_3(self, srcImg, dstH, dstW):55 dstH, dstW = int(dstH), int(dstW)56 srcH, srcW, _ = srcImg.shape57 srcImg = np.pad(srcImg, ((1, 1), (1, 1), (0, 0)), 'edge')58 dstImg = np.zeros((dstH, dstW, 3), dtype=np.uint8)59for dstY in range(dstH):60for dstX in range(dstW):61for channel in [0, 1, 2]:62# p11 p12 p1363#64# p21 p22 p2365# p66# p31 p32 p3367# 储存为 p(y, x)68 p = [dstY * srcH / dstH, dstX * srcW / dstW]69 p22 = [math.floor(p[0]), math.floor(p[1])]70 p21 = [p22[0], p22[1] - 1]71 p23 = [p22[0], p22[1] + 1]7273 p11 = [p21[0] - 1, p21[1]]74 p12 = [p11[0], p22[1]]75 p13 = [p11[0], p23[1]]7677 p31 = [p21[0] + 1, p21[1]]78 p32 = [p31[0], p22[1]]79 p33 = [p31[0], p23[1]]8081 diff_y, diff_x = p[0] - p22[0], p[1] - p22[1]82 r1 = grangeInterpolation3(diff_x, srcImg[p11[0], p11[1], channel], srcImg[p12[0], p12[1], channel], srcImg[p13[0], p13[1], channel])83 r2 = grangeInterpolation3(diff_x, srcImg[p21[0], p21[1], channel], srcImg[p22[0], p22[1], channel], srcImg[p23[0], p23[1], channel])84 r3 = grangeInterpolation3(diff_x, srcImg[p31[0], p31[1], channel], srcImg[p32[0], p32[1], channel], srcImg[p33[0], p33[1], channel]) 8586 c = grangeInterpolation3(diff_y, r1, r2, r3)8788 dstImg[dstY, dstX, channel] = np.clip(c, 0, 255)89return dstImg9091def biLag4_4(self, srcImg, dstH, dstW):92 dstH, dstW = int(dstH), int(dstW)93 srcH, srcW, _ = srcImg.shape94 srcImg = np.pad(srcImg, ((1, 2), (1, 2), (0, 0)), 'edge')95 dstImg = np.zeros((dstH, dstW, 3), dtype=np.uint8)96for dstY in range(dstH):97for dstX in range(dstW):98for channel in [0, 1, 2]:99# p11 p12 p13 p14100#101# p21 p22 p23 p24102# p103# p31 p32 p33 p34104#105# p41 p42 p43 p44106# 储存为 p(y, x)107 p = [dstY * srcH / dstH, dstX * srcW / dstW]108 p22 = [math.floor(p[0]), math.floor(p[1])]109 p21 = [p22[0], p22[1] - 1]110 p23 = [p22[0], p22[1] + 1]111 p24 = [p22[0], p22[1] + 2]112113 p11 = [p21[0] - 1, p21[1]]114 p12 = [p11[0], p22[1]]115 p13 = [p11[0], p23[1]]116 p14 = [p11[0], p24[1]]117118 p31 = [p21[0] + 1, p21[1]]119 p32 = [p31[0], p22[1]]120 p33 = [p31[0], p23[1]]121 p34 = [p31[0], p24[1]]122123 p41 = [p21[0] + 2, p21[1]]124 p42 = [p41[0], p22[1]]125 p43 = [p41[0], p23[1]]126 p44 = [p41[0], p24[1]]127128 diff_y, diff_x = p[0] - p22[0], p[1] - p22[1]129 r1 = grangeInterpolation4(diff_x, srcImg[p11[0], p11[1], channel], srcImg[p12[0], p12[1], channel], srcImg[p13[0], p13[1], channel], srcImg[p14[0], p14[1], channel]) 130 r2 = grangeInterpolation4(diff_x, srcImg[p21[0], p21[1], channel], srcImg[p22[0], p22[1], channel], srcImg[p23[0], p23[1], channel], srcImg[p24[0], p24[1], channel]) 131 r3 = grangeInterpolation4(diff_x, srcImg[p31[0], p31[1], channel], srcImg[p32[0], p32[1], channel], srcImg[p33[0], p33[1], channel], srcImg[p34[0], p34[1], channel]) 132 r4 = grangeInterpolation4(diff_x, srcImg[p41[0], p41[1], channel], srcImg[p42[0], p42[1], channel], srcImg[p43[0], p43[1], channel], srcImg[p44[0], p44[1], channel]) 133134 c = grangeInterpolation4(diff_y, r1, r2, r3, r4)135136 dstImg[dstY, dstX, channel] = np.clip(c, 0, 255)137return dstImg三次卷积插值法(Cubic Convolution Interpolation)使⽤上图中的卷积核进⾏加权平均计算,卷积核为u(s),四个等距(距离为1)的采样点记为x_0、x_1、x_2和x_3,采样数值记为y_0、y_1、y_2和y_3,且保证四个点均在[-2,2]区间上,计算得到g(x),假设y_1、y_2、y_3和y_4分别为1、2、-1、4,则可得三次卷积插值函数如下图所⽰,待插值点横坐标范围为[0,1]公式推导设u(s)=\begin{cases} A_1|s|^3+B_1|s|^2+C_1|s|+D_1, &0<|s|<1 \\ A_2|s|^3+B_2|s|^2+C_2|s|+D_2, &1<|s|<2 \\ 1, &s=0 \\ 0, &otherwise \end{cases}\because函数在s=0,1,2处连续\therefore\begin{cases} 1=u(0^+)=D_1 \\ 0=u(1^-)=A_1+B_1+C_1+D_1 \\ 0=u(1^+)=A_2+B_2+C_2+D_2 \\ 0=u(2^-)=8A_2+4B_2+2C_2+D_2 \end{cases} (1)\because函数在s=0,1,2处导函数连续\therefore\begin{cases} u'(0^-)=u'(0+) \\ u'(1^-)=u'(1+) \\ u'(2^-)=u'(2+)\end{cases} \Rightarrow \begin{cases} -C_1=C_1 \\ 3A_1+2B_1+C_1=3A_2+2B_2+C_2\\ 12A_2+4B_2+C+2=0 \end{cases} ~~~~ (2)联⽴⽅程组(1)(2),设A_2=a,解得\begin{cases} A_1=a+2 \\ B_1=-(a+3) \\ C_1=0 \\ D_1=1 \\ A_2=a \\ B_2=-5a \\ C_2=8a \\ D_2=-4a \end{cases}\Rightarrow u(s)=\begin{cases} (a+2)|s|^3-(a+3)|s|^2+1, &0<|s|<1 \\ A_2|s|^3+B_2|s|^2+C_2|s|+D_2, &1<|s|<2\\ 1, &s=0 \\ 0, &otherwise \end{cases}\because g(x)=\sum_kC_ku(s+j-k), ~~~~k=j-1,j, j+1,j+2且0<s<1⼜\because \begin{cases}\begin{align} u(s+1)&=as^3-2as^2+as \nonumber \\ u(s)&=(a+2)s^3-(a+3)s^2+1 \nonumber \\ u(s-1)&=-(a+2)s^3+(2a+3)s^2-as \nonumber \\ u(s-2)&=-as^3+as^2 \nonumber \end{align}\end{cases}\begin{align} \therefore g(x) &= C_{j-1}u(s+1)+C_{j}u(s)+C_{j+1}u(s-1)+C_{j+2}u(s-2) \nonumber \\ &= C_{j-1}(as^3-2as^2+as)+C_j[(a+2)s^3-(a+3)s^2+1]+C_{j+1}[-(a+2)s^3+ (2a+3)s^2-as]+C_{j+2}[-a^3+as^2] \nonumber \\ &= s^3[aC_{j-1}+(a+2)C_j-(a+2)C_{j+1}-aC_{j+2}]+s^2[-2aC_{j-1}-(a+3)C_j+(2a+3)C_{j+1}+aC_{j+2}]+s[aC_{j-1}-aC_{j+1}]+C_j \nonumber \end{align} ~~(3)f在x_j处泰勒展开得到f(x)=f(x_j)+f'(x_j)(x-x_j)+\frac{1}{2}f''(x_j)(x-x_j)^2+\cdots\therefore \begin{cases} f(x_{j+1})=f(x_j)+f'(x_j)(x_{j+1}-x_j)+\frac{1}{2}f''(x_j)(x_{j+1}-x_j)^2+\cdots \\ f(x_{j+2})=f(x_j)+f'(x_j)(x_{j+2}-x_j)+\frac{1}{2}f''(x_j)(x_{j+2}-x_j)^2+\cdots \\ f(x_{j-1})=f(x_j)+f'(x_j)(x_{j-1}-x_j)+\frac{1}{2}f''(x_j)(x_{j-1}-x_j)^2+\cdots \end{cases}令x_{j+1}-x_j=h\because x_{i+1}=x_i+1\therefore x_{j+2}-x_j=2h,x_{j-1}-x_j=-h\therefore \begin{cases} f(x_{j+2})=f(x_j)+2f'(x_j)h+2f''(x_j)h^2+\cdots \\ f(x_{j+1})=f(x_j)+f'(x_j)h+\frac{1}{2}f''(x_j)h^2+\cdots \\ f(x_{j-1})=f(x_j)-f'(x_j)h+\frac{1}{2}f''(x_j)h^2+\cdots \end{cases}\therefore \begin{cases} c_{j-1}=f(x_j)-f'(x_j)h+\frac{1}{2}f''(x_j)h^2+o(h^3) \\ c_j=f(x_j) \\ c_{j+1}=f(x_j)+f'(x_j)h+\frac{1}{2}f''(x_j)h^2+o(h^3)\\ c_{j+2}=f(x_j)+2f'(x_j)h+2f''(x_j)h^2+o(h^3) \end{cases} ~~ (4)将(4)代⼊(3),得g(x)=-(2a+1)[2hf'(x_j)+h^2f''(x_j)]s^3+[(6a+3)hf'(x_j)+\frac{4a+3}{2}h^2f''(x_j)]s^2-2ahf'(x_j)s+f(x_j)+o(h^3)\because h=1,s=x-x_J\therefore sh=x-x_j\begin{align}\therefore f(x)&= f(x_j)+f'(x_j)(x-x_j)+\frac{1}{2}f''(x_j)(x-x_j)^2+o(h^3) \nonumber \\ &= f(x_j)+f'(x_j)sh+\frac{1}{2}f''(x_j)s^2h^2+o(h^3) \nonumber \end{align}\therefore f(x)-g(x)=(2a+1)[2hf'(x_j)+h^2f''(x_j)]s^3-(2a+1)[3hf'(x_j)+h^2f''(x_j)]s^2+[(2a+1)hf'(x_j)]s+o(h^3)\because 期望f(x)-g(x)趋于0\therefore 2a+1=0 \Rightarrow a=-\frac{1}{2}\therefore u(s)=\begin{cases} \frac{3}{2}|s|^3-\frac{5}{2}|s|^2+1, &0<|s|<1 \\ -\frac{1}{2}|s|^3+\frac{5}{2}|s|^2-4|s|+2, &1<|s|<2 \\ 1, &s=0 \\ 0, &otherwise \end{cases}\therefore g(s)=s^3[-\frac{1}{2}c_{j-1}+\frac{3}{2}c_j-\frac{3}{2}c_{j+1}+\frac{1}{2}c_{j+2}]+s^2[c_{j-1}-\frac{5}{2}c_j+2c_{j+1}-\frac{1}{2}c_{j+2}]+s[-\frac{1}{2}c_{j-1}+\frac{1} {2}c_{j+1}]+c_j图像插值p_{11}p_{12}p_{13}p_{14}p_{21}p_{22}p_{23}p_{24}pp_{31}p_{32}p_{33}p_{34}p_{41}p_{42}p_{43}p_{44}python代码1class BiCubicConvInterpolation:2 @staticmethod3def CubicConvInterpolation1(p0, p1, p2, p3, s):4# ⽤g(s)公式计算,已经将四个u(s)计算完毕并整理5# as^3 + bs^2 + cs + d6 a = 0.5 * (-p0 + 3.0 * p1 - 3.0 * p2 + p3)7 b = 0.5 * (2.0 * p0 - 5.0 * p1 + 4.0 * p2 - p3)8 c = 0.5 * (-p0 + p2)9 d = p110return d + s * (c + s * (b + s * a))1112 @staticmethod13def CubicConvInterpolation2(s):14# ⽤u(s)公式计算15 s = abs(s)16if s <= 1:17return 1.5 * s ** 3 - 2.5 * s ** 2 + 118elif s <= 2:19return -0.5 * s ** 3 + 2.5 * s ** 2 - 4 * s + 220else:21return 02223def biCubic1(self, srcImg, dstH, dstW):24# p11 p12 p13 p1425#26# p21 p22 p23 p2427# p28# p31 p32 p33 p3429#30# p41 p42 p43 p4431 dstH, dstW = int(dstH), int(dstW)32 scrH, scrW, _ = srcImg.shape33 srcImg = np.pad(srcImg, ((1, 1), (1, 1), (0, 0)), 'edge')34 dstImg = np.zeros((dstH, dstW, 1), dtype=np.uint8)35for dstY in range(dstH):36for dstX in range(dstW):37for channel in [0]:38 y = dstY * scrH / dstH39 x = dstX * scrW / dstW40 y1 = math.floor(y)41 x1 = math.floor(x)4243 array = []44for i in [-1, 0, 1, 2]:45 temp = self.CubicConvInterpolation1(srcImg[y1 + i, x1 - 1, channel],46 srcImg[y1 + i, x1, channel],47 srcImg[y1 + i, x1 + 1, channel],48 srcImg[y1 + i, x1 + 2, channel],49 x - x1)50 array.append(temp)5152 temp = self.CubicConvInterpolation1(array[0], array[1], array[2], array[3], y - y1)53 dstImg[dstY, dstX, channel] = np.clip(temp, 0, 255)5455return dstImg5657def biCubic2(self, srcImg, dstH, dstW):58# p11 p12 p13 p1459#60# p21 p22 p23 p2461# p62# p31 p32 p33 p3463#64# p41 p42 p43 p4465 dstH, dstW = int(dstH), int(dstW)66 scrH, scrW, _ = srcImg.shape67 srcImg = np.pad(srcImg, ((1, 1), (1, 1), (0, 0)), 'edge')68 dstImg = np.zeros((dstH, dstW, 3), dtype=np.uint8)69for dstY in range(dstH):70for dstX in range(dstW):71for channel in [0, 1, 2]:72 y = dstY * scrH / dstH73 x = dstX * scrW / dstW74 y1 = math.floor(y)75 x1 = math.floor(x)7677 array = []78for i in [-1, 0, 1, 2]:79 temp = 080for j in [-1, 0, 1, 2]:81 temp += srcImg[y1 + i, x1 + j, channel] * self.CubicConvInterpolation2(x - (x1 + j))82 array.append(temp)8384 temp = 085for i in [-1, 0, 1, 2]:86 temp += array[i + 1] * self.CubicConvInterpolation2(y - (y1 + i))87 dstImg[dstY, dstX, channel] = np.clip(temp, 0, 255)8889return dstImg三次样条插值在n-1个区间上寻找n-1个三次曲线,使其满⾜相邻曲线在端点处值相等、⼀阶导数相等,⼆阶导数相等,在加以边界条件后可得每个曲线的⽅程,然后沿x轴依次偏移对应的距离即可得到插值结果,如仅需要特定范围内的结果,则可以⼤幅减少计算量公式推导设S_i(x)=a_i+b_i(x-x_i)+c_i(x-x_i)^2+d_i(x-x_i)^3, ~~~~i=0,1,...,n-1则 \begin{cases} S_i'(x)=b_i+2c_i(x-x_i)+3d_i(x-x_i)^2\\ S_i''(x)=2c_i+6d_i(x-x_i)\\ S_i'''(x)=6d_i\\ \end{cases} ~~~~i=0,1,...,n-1设h_i(x)=x_{i+1}-x_i,可得\begin{cases} S_i(x)=a_i+b_ih_i+c_ih_i^2+d_ih_i^3\\ S_i'(x)=b_i+2c_ih_i+3d_ih_i^2\\ S_i''(x)=2c_i+6d_ih_i\\ S_i'''(x)=6d_i\\ \end{cases} ~~~~i=0,1,...,n-1\because S_i(x)过点(x_i,y_i)\therefore S_i(x)=a_i=y+i, ~~~~i=0,1,...,n-1 ~~~~~~(1)\because S_i(x)与S_{i+1}(x)在X_{i+1}处相等\therefore S_i(x_{i+1})=S_{i+1}(x_{i+1})\Rightarrow a_i+b_ih_i+c_ih_i^2+d_ih_i^3=y_{i+1}, ~~~~i=0,1,...,n-2~~~~~~(2)\because S_i'(x)与S_{i+1}'(x)在X_{i+1}处相等\therefore S_i'(x)-S_{i+1}'(x)=0\Rightarrow b_i+2c_ih_i+3d_ih_i^2-b_{i+1}=0~~~~~~(3)\because S_i''(x)与S_{i+1}''(x)在X_{i+1}处相等\therefore S_i''(x)-S_{i+1}''(x)=0\Rightarrow 2c_i+6d_ih_i-2c_{i+1}=0, ~~~~i=0,1,...,n-2~~~~~~(4)设m_i=S_i(x_i)=2c_i,即c_i=\frac{1}{2}m_i, ~~~~i=0,1,...,n-1~~~~~~(5)将(5)代⼊(4),得2c_i+6d_ih_i-2c_{i+1}=0\Rightarrow m_i+6h_id_i-m_{i+1}=0\Rightarrow d_i=\frac{m_{i+1}-m_i}{6h_i}, ~~~~i=0,1,...,n-2~~~~~~(6)将(1)(5)(6)代⼊(2),得\begin{align} &a_i+b_ih_i+c_ih_i^2+d_ih_i^3=y_{i+1} \nonumber \\ \Rightarrow&y_i+b_ih_i+\frac{1}{2}m_ih_i^2+\frac{m_{i+1}-m_i}{6h_i}h_i^3=y_{i+1} \nonumber \\\Rightarrow&b_i=\frac{y_{i+1}-y_i}{h_i}-\frac{1}{2}m_ih_i-\frac{1}{6}(m_{i+1}-m_i)h_i \nonumber \\ \Rightarrow&b_i=\frac{y_{i+1}-y_i}{h_i}-\frac{1}{3}m_ih_i-\frac{1}{6}m_{i+1}h_i, ~~~~i=0,1,...,n-2~~~~~~(7) \nonumber \end{align}将(5)(6)(7)代⼊(3),得\begin{align} &\frac{y_{i+1}-y{i}}{h_i}-\frac{1}{3}m_ih_i-\frac{1}{6}m_{i+1}h_i+2\cdot\frac{1}{2}m_ih_i+3\frac{m_{i+1}-m_i}{6h_i}h_i^2-(\frac{y_{i+2}-y_{i+1}}{h_{i+1}}-\frac{1}{3}m_{i+1}h_{i+1}-\frac{1}{6}m_{i+2}h_{i+1})=0 \nonumber \\ \Rightarrow&\frac{y_{i+1}-y{i}}{h_i}-\frac{1}{3}m_ih_i-\frac{1}{6}m_{i+1}h_i+m_ih_i+\frac{1}{2}(m_{i+1}-m_i)h_i-\frac{y_{i+2}-y_{i+1}}{h_{i+1}}+\frac{1}{3}m_{i+1}h_{i+1}+\frac{1}{6}m_{i+2}h_{i+1}=0 \nonumber \\ \Rightarrow&m_ih_i(-\frac{1}{3}+1-\frac{1}{2})+m_{i+1}h_i(-\frac{1}{6}+\frac{1} {2})+\frac{1}{3}m_{i+1}h_{i+1}+\frac{1}{6}m_{i+2}h_{i+1}=\frac{y_{i+2}-y_{i+1}}{h_{i+1}}-\frac{y_{i+1}-y_{i}}{h_{i}} \nonumber \\ \Rightarrow&\frac{1}{6}(m_ih_i+2m_{i+1}h_i+2m_{i+1}h_{i+1}+m_{i+2}h_{i+1})=\frac{y_{i+2}-y_{i+1}}{h_{i+1}}-\frac{y_{i+1}-y_{i}}{h_{i}} \nonumber \\ \Rightarrow&m_ih_i+2m_{i+1}(h_i+h_{i+1})+m_{i+2}h_{i+1}=6(\frac{y_{i+2}-y_{i+1}}{h_{i+1}}-\frac{y_{i+1}-y_{i}}{h_{i}}), ~~~~i=0,1,...,n-2~~~~~~(8) \nonumber \end{align}由(8)可知i=0,1,...,n-2,则有m_0,m_1,...,m_n,需要两个额外条件⽅程组才有解⾃然边界(Natural)m_0=0,m_n=0\begin{bmatrix} \tiny 1 & 0 & 0 & 0 & 0 & \cdots & 0\\ h_0 & 2(h_0+h_1) & h_1 & 0 & 0 & \cdots & 0\\ 0 & h_1 & 2(h_1+h_2) & h_2 & 0 & \cdots & 0\\ 0 & 0 & h_2 & 2(h_2+h_3) & h_3 & \cdots & 0\\ \vdots& & & \ddots & \ddots & \ddots & \vdots\\ 0 & \cdots & & & h_{n-2} & 2(h_{n-2}+h_{n-1}) & h_{n-1}\\ 0 & \cdots & & & 0 & 0 & 1 \end{bmatrix}\begin{bmatrix} m_0\\m_1\\m_2\\m_3\\\vdots\\m_{n-1}\\m_n \end{bmatrix}=6\begin{bmatrix} 0\\ \frac{y_2-y_1}{h_1}-\frac{y_1-y_0}{h_0}\\ \frac{y_3-y_2}{h_2}-\frac{y_2-y_1}{h_1}\\ \frac{y_4-y_3}{h_3}-\frac{y_3-y_2}{h_2}\\ \vdots\\ \frac{y_n-y_{n-1}}{h_{n-1}}-\frac{y_{n-1}-y_{n-2}}{h_{n-2}}\\ 0 \end{bmatrix}固定边界(Clamped)\begin{align} &\begin{cases} S_0'(x_0)=A\\ S_{n-1}'(x_n)=B \end{cases} \nonumber \\ \Rightarrow&\begin{cases} b_0=A\\ b_{n-1}+2c_{n-1}h_{n-1}+3d_{n-1}h_{n-1}^2=B\end{cases} \nonumber \\ \Rightarrow&\begin{cases} A=\frac{y_1-y_0}{h_0}-\frac{h_0}{2}m_0-\frac{h_0}{6}(m_1-m_0)\\ B=\frac{y_n-y_{n-1}}{h_{n-1}}-\frac{1}{3}m_{n-1}h_{n-1}+m_{n-1}h_{n-1}+\frac{1}{2}m_nh_{n-1}-\frac{1}{2}m_{n-1}h_{n-1} \end{cases} \nonumber \\ \Rightarrow&\begin{cases} 2h_0m_0+h_0m_1=6(\frac{y_1-y_0}{h_0}-A)\\ h_{n-1}m_{n-1}+2h_{n-1}m_{n}=6(B-\frac{y_n-y_{n-1}}{h_{n-1}}) \end{cases} \nonumber \\ \end{align}\begin{bmatrix} 2 & 1 & 0 & 0 & 0 & \cdots & 0\\ h_0 & 2(h_0+h_1) & h_1 & 0 & 0 & \cdots & 0\\ 0 & h_1 & 2(h_1+h_2) & h_2 & 0 & \cdots & 0\\ 0 & 0 & h_2 & 2(h_2+h_3) & h_3 & \cdots & 0\\ \vdots& & & \ddots & \ddots & \ddots & \vdots\\ 0 & \cdots & & & h_{n-2} & 2(h_{n-2}+h_{n-1}) & h_{n-1}\\ 0 & \cdots & & & 0 & 1 & 2 \end{bmatrix}\begin{bmatrix} m_0\\m_1\\m_2\\m_3\\\vdots\\m_{n-1}\\m_n \end{bmatrix}=6\begin{bmatrix} \frac{y_1-y_0}{h_0}-A\\ \frac{y_2-y_1}{h_1}-\frac{y_1-y_0}{h_0}\\ \frac{y_3-y_2}{h_2}-\frac{y_2-y_1}{h_1}\\ \frac{y_4-y_3}{h_3}-\frac{y_3-y_2}{h_2}\\ \vdots\\\frac{y_n-y_{n-1}}{h_{n-1}}-\frac{y_{n-1}-y_{n-2}}{h_{n-2}}\\ B-\frac{y_n-y_{n-1}}{h_{n-1}} \end{bmatrix}⾮节点边界(Not-A-Knot)\begin{align} &\begin{cases} S_0'''(x_1)=S_1'''(x_1)\\ S_{n-2}'''(x_{n-1})=S_{n-1}'''(x_{n-1}) \end{cases} \nonumber \\ \Rightarrow&\begin{cases} 6\cdot\frac{m_1-m_0}{6h_0}=6\cdot\frac{m_2-m_1}{6h_1}\\ 6\cdot\frac{m_{n-1}-m_{n-2}}{6h_{n-2}}=6\cdot\frac{m_n-m_{n-1}}{6h_{n-1}} \end{cases} \nonumber \\ \Rightarrow&\begin{cases} h_1(m_1-m_0)=h_0(m_2-m_1)\\ h_{n-1}(m_{n-1}-m_{n-2})=h_{n-2}(m_n-m_{n-1}) \end{cases} \nonumber \\ \Rightarrow&\begin{cases} -h_1m_0+(h_1+h_0)m_1-h_0m_2=0\\ -h_{n-1}m_{n-2}+(h_{n-1}+h_{n-2})m_{n-1}-h_{n-2}m_n=0 \end{cases} \nonumber \\ \end{align}\begin{bmatrix} -h_1 & h_0+h_1 & -h_0 & 0 & 0 & \cdots & 0\\ h_0 & 2(h_0+h_1) & h_1 & 0 & 0 & \cdots & 0\\ 0 & h_1 & 2(h_1+h_2) & h_2 & 0 & \cdots & 0\\ 0 & 0 & h_2 &2(h_2+h_3) & h_3 & \cdots & 0\\ \vdots& & & \ddots & \ddots & \ddots & \vdots\\ 0 & \cdots & & & h_{n-2} & 2(h_{n-2}+h_{n-1}) & h_{n-1}\\ 0 & \cdots & & & -h_{n-1} & h_{n-1}+h_{n-2} & -h_{n-2} \end{bmatrix}\begin{bmatrix} m_0\\m_1\\m_2\\m_3\\\vdots\\m_{n-1}\\m_n \end{bmatrix}=6\begin{bmatrix} 0\\ \frac{y_2-y_1}{h_1}-\frac{y_1-y_0}{h_0}\\ \frac{y_3-y_2}{h_2}-\frac{y_2-y_1}{h_1}\\ \frac{y_4-y_3}{h_3}-\frac{y_3-y_2}{h_2}\\ \vdots\\ \frac{y_n-y_{n-1}}{h_{n-1}}-\frac{y_{n-1}-y_{n-2}}{h_{n-2}}\\ 0 \end{bmatrix}在n=4时通⽤公式⾃然边界\begin{bmatrix} 1 & 0 & 0 & 0 \\ h_0 & 2(h_0+h_1) & h_1 & 0 \\ 0 & h_1 & 2(h_1+h_2) & h_2 \\ 0 & 0 & 0 & 1 \\ \end{bmatrix}\begin{bmatrix} m_0\\m_1\\m_2\\m_3 \end{bmatrix}=6\begin{bmatrix} 0\\ \frac{y_2-y_1}{h_1}-\frac{y_1-y_0}{h_0}\\ \frac{y_3-y_2}{h_2}-\frac{y_2-y_1}{h_1}\\ 0 \end{bmatrix}固定边界\begin{bmatrix} 2 & 1 & 0 & 0 \\ h_0 & 2(h_0+h_1) & h_1 & 0 \\ 0 & h_1 & 2(h_1+h_2) & h_2 \\ 0 & 0 & 1 & 2 \\ \end{bmatrix}\begin{bmatrix} m_0\\m_1\\m_2\\m_3 \end{bmatrix}=6\begin{bmatrix} \frac{y_1-y_0}{h_0}-A\\ \frac{y_2-y_1}{h_1}-\frac{y_1-y_0}{h_0}\\ \frac{y_3-y_2}{h_2}-\frac{y_2-y_1}{h_1}\\ B-\frac{y_3-y_2}{h_2} \end{bmatrix}⾮节点边界\begin{bmatrix} -h_1 & h_0+h_1 & -h_0 & 0 \\ h_0 & 2(h_0+h_1) & h_1 & 0 \\ 0 & h_1 & 2(h_1+h_2) & h_2 \\ 0 & -h_2 & h_1+h_2 & -h_1 \\ \end{bmatrix}\begin{bmatrix} m_0\\m_1\\m_2\\m_3 \end{bmatrix}=6\begin{bmatrix} 0\\ \frac{y_2-y_1}{h_1}-\frac{y_1-y_0}{h_0}\\ \frac{y_3-y_2}{h_2}-\frac{y_2-y_1}{h_1}\\ 0 \end{bmatrix}图像插值x_{i+1}-x_i=1 \Rightarrow h_i(x)=1在n=4时,即四个点时如下所⽰p_{11}p_{12}p_{13}p_{14}p_{21}p_{22}p_{23}p_{24}pp_{31}p_{32}p_{33}p_{34}p_{41}p_{42}p_{43}p_{44}⾃然边界(可⽤TDMA或化简计算)\begin{bmatrix} 1 & 0 & 0 & 0 \\ 1 & 4 & 1 & 0 \\ 0 & 1 & 4 & 1 \\ 0 & 0 & 0 & 1 \\ \end{bmatrix}\begin{bmatrix} m_0\\m_1\\m_2\\m_3 \end{bmatrix}=6\begin{bmatrix} 0\\ y_0+y_2-2y_1\\ y_1+y_3-2y_2\\ 0 \end{bmatrix}固定边界(只能⽤TDMA计算)\begin{bmatrix} 2 & 1 & 0 & 0 \\ 1 & 4 & 1 & 0 \\ 0 & 1 & 4 & 1 \\ 0 & 0 & 1 & 2 \\ \end{bmatrix}\begin{bmatrix} m_0\\m_1\\m_2\\m_3 \end{bmatrix}=6\begin{bmatrix} y_1-y_0-A\\ y_0+y_2-2y_1\\ y_1+y_3-2y_2\\ y_2-y_3+B \end{bmatrix}⾮节点边界(只能化简计算)\begin{bmatrix} -1 & 2 & -1 & 0 \\ 1 & 4 & 1 & 0 \\ 0 & 1 & 4 & 1 \\ 0 & -1 & 2 & -1 \\ \end{bmatrix}\begin{bmatrix} m_0\\m_1\\m_2\\m_3 \end{bmatrix}=6\begin{bmatrix} 0\\ y_0+y_2-2y_1\\ y_1+y_3-2y_2\\ 0 \end{bmatrix}python代码1class BiSplineInterpolation:2 @staticmethod3 def TDMA(a, b, c, d):4 n = len(d)56 c[0] = c[0] / b[0]7 d[0] = d[0] / b[0]89for i in range(1, n):10 coef = 1.0 / (b[i] - a[i] * c[i - 1])11 c[i] = coef * c[i]12 d[i] = coef * (d[i] - a[i] * d[i - 1])1314for i in range(n - 2, -1, -1):15 d[i] = d[i] - c[i] * d[i + 1]1617return d1819 @staticmethod20 def Simplified_Natural4(y1, y2, y3, y4):21 # 四点⾃然边界化简公式22 d1 = y1 + y3 - 2 * y223 d2 = y2 + y4 - 2 * y32425 k0 = 026 k1 = (4 * d1 - d2) * 0.427 k2 = (4 * d2 - d1) * 0.428 k3 = 02930return [k0, k1, k2, k3]3132 @staticmethod33 def Simplified_Not_A_Knot4(y1, y2, y3, y4):34 # 四点⾮节点边界化简公式35 d1 = y1 + y3 - 2 * y236 d2 = y2 + y4 - 2 * y33738 k0 = 2 * d1 - d239 k1 = d140 k2 = d241 k3 = 2 * d2 - d14243return [k0, k1, k2, k3]4445 # TDMA矩阵说明46 # a0 和 c3 没有实际意义,占位⽤47 # a0 [b0 c0 00 ] [x0] [d0]48 # [a1 b1 c1 0 ] [x1] = [d1]49 # [0 a2 b2 c2] [x2] [d2]50 # [00 a3 b3] c3 [x3] [d3]5152 def SplineInterpolationNatural4(self, x, y1, y2, y3, y4):53 # ⽤TDMA计算54 # matrix_a = [0, 1, 1, 0]55 # matrix_b = [1, 4, 4, 1]56 # matrix_c = [0, 1, 1, 0]57 # matrix_d = [0, 6 * (y1 + y3 - 2 * y2), 6 * (y2 + y4 - 2 * y3), 0]58 # matrix_x = self.TDMA(matrix_a, matrix_b, matrix_c, matrix_d)5960 # 化简计算61 matrix_x = self.Simplified_Natural4(y1, y2, y3, y4)6263 a = y264 b = y3 - y2 - matrix_x[1] / 3.0 - matrix_x[2] / 6.065 c = matrix_x[1] / 2.066 d = (matrix_x[2] - matrix_x[1]) / 6.06768 s = a + b * x + c * x * x + d * x * x * x69return s7071 def SplineInterpolationClamped4(self, x, y1, y2, y3, y4):72 # 仅有TDMA计算,⽆法化简73 A, B = 1, 17475 matrix_a = [0, 1, 1, 1]76 matrix_b = [2, 4, 4, 2]77 matrix_c = [1, 1, 1, 0]78 matrix_d = [6 * (y2 - y1 - A), 6 * (y1 + y3 - 2 * y2), 6 * (y2 + y4 - 2 * y3), 6 * (B - y4 + y3)]79 matrix_x = self.TDMA(matrix_a, matrix_b, matrix_c, matrix_d)8081 a = y282 b = y3 - y2 - matrix_x[1] / 3.0 - matrix_x[2] / 6.083 c = matrix_x[1] / 2.084 d = (matrix_x[2] - matrix_x[1]) / 6.08586 s = a + b * x + c * x * x + d * x * x * x87return s8889 def SplineInterpolationNotAKnot4(self, x, y1, y2, y3, y4):90 # ⽆法使⽤TDMA计算91 matrix_x = self.Simplified_Not_A_Knot4(y1, y2, y3, y4)9293 a = y294 b = y3 - y2 - matrix_x[1] / 3.0 - matrix_x[2] / 6.095 c = matrix_x[1] / 2.096 d = (matrix_x[2] - matrix_x[1]) / 6.09798 s = a + b * x + c * x * x + d * x * x * x99return s100101 def biSpline4(self, srcImg, dstH, dstW):102 dstH, dstW = int(dstH), int(dstW)103 srcH, srcW, _ = srcImg.shape104 srcImg = np.pad(srcImg, ((1, 2), (1, 2), (0, 0)), 'edge')105 dstImg = np.zeros((dstH, dstW, 3), dtype=np.uint8)106for dstY in range(dstH):107for dstX in range(dstW):108for channel in [0, 1, 2]:109 # p11 p12 p13 p14110 #111 # p21 p22 p23 p24112 # p113 # p31 p32 p33 p34114 #115 # p41 p42 p43 p44116 # 储存为 p(y, x)117 p = [dstY * srcH / dstH, dstX * srcW / dstW]118 p22 = [math.floor(p[0]), math.floor(p[1])]119 p21 = [p22[0], p22[1] - 1]120 p23 = [p22[0], p22[1] + 1]121 p24 = [p22[0], p22[1] + 2]122123 p11 = [p21[0] - 1, p21[1]]124 p12 = [p11[0], p22[1]]125 p13 = [p11[0], p23[1]]126 p14 = [p11[0], p24[1]]127128 p31 = [p21[0] + 1, p21[1]]129 p32 = [p31[0], p22[1]]130 p33 = [p31[0], p23[1]]131 p34 = [p31[0], p24[1]]132133 p41 = [p21[0] + 2, p21[1]]134 p42 = [p41[0], p22[1]]135 p43 = [p41[0], p23[1]]136 p44 = [p41[0], p24[1]]137138 diff_y, diff_x = p[0] - p22[0], p[1] - p22[1]139 r1 = self.SplineInterpolationNatural4(diff_x, srcImg[p11[0], p11[1], channel], srcImg[p12[0], p12[1], channel], srcImg[p13[0], p13[1], channel], srcImg[p14[0], p14[1], channel]) 140 r2 = self.SplineInterpolationNatural4(diff_x, srcImg[p21[0], p21[1], channel], srcImg[p22[0], p22[1], channel], srcImg[p23[0], p23[1], channel], srcImg[p24[0], p24[1], channel]) 141 r3 = self.SplineInterpolationNatural4(diff_x, srcImg[p31[0], p31[1], channel], srcImg[p32[0], p32[1], channel], srcImg[p33[0], p33[1], channel], srcImg[p34[0], p34[1], channel]) 142 r4 = self.SplineInterpolationNatural4(diff_x, srcImg[p41[0], p41[1], channel], srcImg[p42[0], p42[1], channel], srcImg[p43[0], p43[1], channel], srcImg[p44[0], p44[1], channel]) 143144 c = self.SplineInterpolationNatural4(diff_y, r1, r2, r3, r4)145146 dstImg[dstY, dstX, channel] = np.clip(c, 0, 255)。

插值法公式

插值法公式

插值法公式1. 什么是插值法?插值法是一种通过已知数据点之间的曲线进行估算或推测的数值方法。

它可以用来估计缺失点的数值,或者通过已知数据点之间的曲线来做出预测。

插值法在数学、统计学、计算机科学和工程等领域都有广泛的应用。

2. 常用的插值法在插值法中,有多种算法可供选择,下面介绍几种常用的插值法。

2.1 线性插值法线性插值法是一种简单但常用的插值法。

它假设两点之间的曲线是一条直线,根据已知的两个点(x₁, y₁)和(x₂, y₂)之间的线性关系,可以推断出任意两点之间的数值。

线性插值法的公式如下:y = y₁ + (y₂ - y₁) / (x₂ - x₁) * (x - x₁)其中,y是待估算的数值,x是已知的数据点。

2.2 拉格朗日插值法拉格朗日插值法是一种常用的多项式插值法。

它利用已知的数据点构造一个多项式,并通过该多项式来估算任意点的数值。

拉格朗日插值法的公式如下:L(x) = ∑[i=0~n] yᵢ * Lᵢ(x)其中,L(x)表示估算值,yᵢ表示已知数据点的y值,Lᵢ(x)表示拉格朗日基函数,定义如下:Lᵢ(x) = ∏[j=0~n, j≠i] (x - xₓ₊₀₋₀ⱼ) / (xₓ₊₀₋₀ᵢ - xₓ₊₀₋₀ⱼ)在这里,n是已知数据点的数量,xₓ₊₀₋₀ⱼ是第j个已知数据点的x值。

2.3 三次样条插值法三次样条插值法是一种更复杂的插值方法,它利用三次多项式来逼近已知数据点之间的曲线。

三次样条插值法的公式如下:S(x) = aⱼ(x - xₓ₊₂₋₂)³ + bⱼ(x - xₓ₊₂₋₂)² + cⱼ(x - xₓ₊₂₋₂) + dⱼ其中,S(x)表示估算值,aⱼ、bⱼ、cⱼ和dⱼ是通过已知数据点计算得到的系数。

3. 插值法的应用插值法在很多领域都有广泛的应用。

下面列举几个常见的应用场景:•图像处理:在图像处理中,插值法可以用来放大或缩小图像,通过已有像素点之间的颜色值来估算新的像素点的颜色值。

插值法计算方法举例

插值法计算方法举例

插值法计算方法举例插值法是一种用来通过已知数据点的近似值来推测未知数据点的方法。

它通常用于数据的平滑和预测,尤其在缺少数据或数据不完整的情况下。

以下是一些插值法的具体计算方法举例:1. 线性插值法(Linear Interpolation):线性插值法是最简单的插值方法之一、假设我们有两个已知数据点(x1, y1)和(x2, y2),要推测处于两个数据点之间的未知点(x, y)。

线性插值法通过使用已知点之间的线性关系来计算未知点的值。

具体公式为:y=y1+(x-x1)*((y2-y1)/(x2-x1))2. 多项式插值法(Polynomial Interpolation):多项式插值法通过使用一个低次数的多项式函数来逼近已知数据点,并预测未知数据点。

常见的多项式插值方法包括拉格朗日插值和牛顿插值。

其中,拉格朗日插值使用一个n次多项式来逼近n个已知点,而牛顿插值使用差商(divided differences)和差商表来逼近已知点。

具体公式为:P(x) = a0 + a1 * (x - x1) + a2 * (x - x1) * (x - x2) + ... + an * (x - x1) * (x - x2) * ... * (x - xn-1)3. 样条插值法(Spline Interpolation):样条插值法是一种更复杂的插值方法,它通过拟合已知数据点之间的线段和曲线,来推测未知数据点。

常见的样条插值方法包括线性样条插值、二次样条插值和三次样条插值。

样条插值法具有良好的平滑性和曲线性质,通常在连续数据的插值和平滑方面效果更好。

具体公式为:S(x) = Si(x),其中x属于[xi, xi+1],Si(x)是第i段(i = 1, 2, ..., n-1)中的插值函数。

4. 逆距离加权插值法(Inverse Distance Weighting, IDW):逆距离加权插值法是一种基于距离的插值方法,通过使用已知数据点的权重来推测未知数据点。

数值分析中的插值方法

数值分析中的插值方法

数值分析中的插值方法在数值分析中,插值是一种通过在已知数据点之间估计未知数据点的方法。

它是一种常见的数据处理技术,用于填补数据间的空白,揭示数据间的关联性,或者建立数据模型。

在本文中,我们将讨论数值分析中的几种常见的插值方法。

一、拉格朗日插值拉格朗日插值是一种基于多项式的插值方法。

假设有n个离散数据点,我们想要在这些点之间插值得到未知数据点的值。

拉格朗日插值可以通过构建一个n次多项式来实现。

例如,给定三个数据点(x0, y0),(x1, y1),(x2, y2),我们可以假定插值多项式为:P(x) = y0 * L0(x) + y1 * L1(x) + y2 * L2(x)其中,L0(x),L1(x),L2(x)是拉格朗日插值多项式的基函数,由以下公式得到:L0(x) = (x - x1) * (x - x2) / ((x0 - x1) * (x0 - x2))L1(x) = (x - x0) * (x - x2) / ((x1 - x0) * (x1 - x2))L2(x) = (x - x0) * (x - x1) / ((x2 - x0) * (x2 - x1))利用这些基函数,我们可以得到插值多项式P(x),从而计算出未知点的值。

二、牛顿插值牛顿插值是另一种常见的插值方法,也是基于多项式的。

与拉格朗日插值不同的是,牛顿插值使用了差商的概念来构建插值多项式。

差商是一种表示数据间差异的指标,它可以用于计算插值多项式的系数。

对于n个数据点,差商可以由以下递归公式计算得到:f[x0] = f(x0)f[x0, x1] = (f[x1] - f[x0]) / (x1 - x0)f[x0, x1, ..., xn] = (f[x1, x2, ..., xn] - f[x0, x1, ..., xn-1]) / (xn - x0)基于差商,我们可以得到牛顿插值多项式的表达式:P(x) = f[x0] + f[x0, x1] * (x - x0) + f[x0, x1, x2] * (x - x0) * (x - x1) + ...利用牛顿插值,我们可以通过已知数据点构建插值多项式,进而估计未知点的值。

财务管理中的插值法

财务管理中的插值法

财务管理中的插值法插值法是财务管理中经常使用的一种方法,它可以帮助我们预测未来的数据,并判断其对业务运营所产生的影响。

插值法可以通过计算已知数据点之间的数值来推断出未知数据点的数值,把连续且相邻的点形成的曲线称为插值函数。

插值法有很多种类型,但其中最常见的是线性插值法和折线插值法。

下面我们将介绍这两种方法的基本原理和应用。

一、线性插值法线性插值法是一种比较简单的插值方法,其基本原理是利用已知的两个数据点之间建立一条直线,根据该直线上的坐标值来推断未知数据点的数值。

通常情况下,线性插值法用于数据平滑处理,以消除极端数据点引起的波动。

使用线性插值法时,需要先确定两个已知数据值x1和x2之间的函数表达式y=f(x),然后根据该函数建立一条直线。

假设我们要通过线性插值法推断未知数据点x3的数值y3,则可以根据x1、x2和y1、y2的坐标值计算出该直线上的y坐标值,从而得出y3的预测值。

具体的计算公式为:y3=(y2-y1)/(x2-x1)*(x3-x1)+y1在实际应用中,线性插值法可以用于预测未来收益、成本、销售额等业务数据的变化趋势。

例如,如果我们已知某个产品在2017年和2018年的销售额分别为200万和400万,想要预测2019年的销售额,则可以使用线性插值法来计算。

根据已知数据可得,x1=2017,y1=200,x2=2018,y2=400,因此可以得到:y3=(400-200)/(2018-2017)*(2019-2017)+200=600根据线性插值法的计算结果,我们可以预测该产品在2019年的销售额为600万。

1. 找到已知数据点x1和x2之间的所有中间点,假设有n个中间点,x1<x2,则可以得到:x1<x<x22. 指定每个中间点对应的函数表达式y=f(x),且在x1和x2处分别连续可导。

3. 在x1和x2之间建立一条折线,其上每个点的坐标值分别由对应的函数表达式计算得出。

常见的插值方法及其原理

常见的插值方法及其原理

常见的插值方法及其原理插值是指在已知数据点的情况下,根据其中一种规则或算法,在这些数据点之间进行预测或估计。

常见的插值方法有:拉格朗日插值、牛顿插值、分段线性插值、样条插值和Kriging插值等。

1.拉格朗日插值方法:拉格朗日插值是一种基于多项式的插值方法。

它假设已知数据点的函数曲线可以由一个多项式来表示。

拉格朗日插值的原理是,通过确定多项式的系数,使多项式在已知数据点上满足给定的函数值。

具体地说,对于给定的一组已知数据点和对应的函数值,拉格朗日插值方法通过构造一个多项式,使得该多项式在每个数据点上的函数值等于给定的函数值。

然后,通过该多项式在插值点上的函数值来估计未知数据点的函数值。

2.牛顿插值方法:牛顿插值也是一种基于多项式的插值方法,其原理类似于拉格朗日插值。

它也是通过确定多项式的系数,使多项式在已知数据点上满足给定的函数值。

不同的是,牛顿插值使用了差商的概念,将插值多项式表示为一个累次求和的形式。

具体地说,对于给定的一组已知数据点和对应的函数值,牛顿插值方法通过差商的计算,得到一个多项式表达式。

然后,通过该多项式在插值点上的函数值来估计未知数据点的函数值。

3.分段线性插值方法:分段线性插值是一种简单而常用的插值方法。

它假设在两个相邻已知数据点之间的曲线是一条直线。

分段线性插值的原理是,通过连接相邻数据点之间的线段,构造一个连续的曲线。

具体地说,对于给定的一组已知数据点和对应的函数值,分段线性插值方法将曲线划分为若干小段,每一小段都是一条直线。

然后,在每个数据点之间的区域上,通过线性插值来估计未知数据点的函数值。

4.样条插值方法:样条插值是一种基于插值条件和光滑条件的插值方法。

它假设在两个相邻已知数据点之间的曲线是一个低次数的多项式。

样条插值的原理是,通过确定各个数据点之间的插值多项式系数,使得整个曲线在插值点上的各阶导数连续。

具体地说,对于给定的一组已知数据点和对应的函数值,样条插值方法将曲线划分为若干小段,每一小段都是一个低次数的多项式。

分类变量插值处理

分类变量插值处理

分类变量插值处理
对于分类变量的插值处理,常用的方法有以下几种:
1.众数插值:将缺失值按照其所在类别的众数进行插值。

众数
是指在某个类别中出现频率最高的值。

2.随机插值:将缺失值随机分配给该类别中的某个已知的取值。

这种方法适用于缺失值的分布相对均匀的情况。

3.热点填充:对于分类变量,可以根据变量之间的相关性来进
行插值。

可以使用其他已知的变量值,根据某种算法计算出缺失值。

4.回归插值:对于分类变量,可以使用线性回归分析或者非线
性回归分析方法来预测缺失值。

将其他已知变量作为自变量,将分类变量当作因变量进行回归分析,从而预测出缺失值。

5.多重插补:多重插补是一种常见的处理分类变量缺失值的方法。

它基于多个回归模型进行预测,然后取每个回归模型插补的平均值作为最终的插值结果。

需要注意的是,在进行插值处理时,需要根据实际情况选择合适的方法,并进行合理的验证和评估。

同时,插值处理可能引入一定的误差,因此在分析结果时,需要考虑插值引入的不确定性。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

1、距离倒数乘方法
距离倒数乘方格网化方法是一个加权平均插值法,可以进行确切的或者圆滑的方式插值。

方次参数控制着权系数如何随着离开一个格网结点距离的增加而下降。

对于一个较大的方次,较近的数据点被给定一个较高的权重份额,对于一个较小的方次,权重比较均匀地分配给各数据点。

计算一个格网结点时给予一个特定数据点的权值与指定方次的从结点到观测点的该结点被赋予距离倒数成比例。

当计算一个格网结点时,配给的权重是一个分数,所有权重的总和等于1.0。

当一个观测点与一个格网结点重合时,该观测点被给予一个实际为 1.0 的权重,所有其它观测点被给予一个几乎为0.0 的权重。

换言之,该结点被赋给与观测点一致的值。

这就是一个准确插值。

距离倒数法的特征之一是要在格网区域内产生围绕观测点位置的"牛眼"。

用距离倒数格网化时可以指定一个圆滑参数。

大于零的圆滑参数保证,对于一个特定的结点,没有哪个观测点被赋予全部的权值,即使观测点与该结点重合也是如此。

圆滑参数通过修匀已被插值的格网来降低"牛眼"影响。

2、克里金法
克里金法是一种在许多领域都很有用的地质统计格网化方法。

克里金法试图那样表示隐含在你的数据中的趋势,例如,高点会是沿一个脊连接,而不是被牛眼形等值线所孤立。

克里金法中包含了几个因子:变化图模型,漂移类型和矿块效应。

3、最小曲率法
最小曲率法广泛用于地球科学。

用最小曲率法生成的插值面类似于一个通过各个数据值的,具有最小弯曲量的长条形薄弹性片。

最小曲率法,试图在尽可能严格地尊重数据的同时,生成尽可能圆滑的曲面。

使用最小曲率法时要涉及到两个参数:最大残差参数和最大循环次数参数来控制最小曲率的收敛标准。

4、多元回归法
多元回归被用来确定你的数据的大规模的趋势和图案。

你可以用几个选项来确定你需要的趋势面类型。

多元回归实际上不是插值器,因为它并不试图预测未知的Z 值。

它实际上是一个趋势面分析作图程序。

使用多元回归法时要涉及到曲面定义和指定XY的最高方次设置,曲面定义是选择采用的数据的多项式类型,这些类型分别是简单平面、双线性鞍、二次曲面、三次曲面和用户定义的多项式。

参数设置是指定多项式方程中X 和Y组元的最高方次。

5、径向基本函数法
径向基本函数法是多个数据插值方法的组合。

根据适应你的数据和生成一个圆滑曲面的能力,其中的复二次函数被许多人认为是最好的方法。

所有径向基本函数法都是准确的插值器,它们都要为尊重你的数据而努力。

为了试图生成一个更圆滑的曲面,对所有这些方法你都可以引入一个圆滑系数。

你可以指定的函数类似于克里金中的变化图。

当对一个格网结点插值时,这些个函数给数据点规定了一套最佳权重。

6、谢别德法
谢别德法使用距离倒数加权的最小二乘方的方法。

因此,它与距离倒数乘方插值器相似,但它利用了局部最小二乘方来消除或减少所生成等值线的"牛眼"外观。

谢别德法可以是一个准确或圆滑插值器。

在用谢别德法作为格网化方法时要涉及到圆滑参数的设置。

圆滑参数是使谢别德法能够象一个圆滑插值器那样工作。

当你增加圆滑参数的值时,圆滑的效果越好。

7、三角网/线形插值法
三角网插值器是一种严密的插值器,它的工作路线与手工绘制等值线相近。

这种方法是通过在数据点之间连线以建立起若干个三角形来工作的。

原始数据点的连结方法是这样:所有三角形的边都不能与另外的三角形相交。

其结果构成了一张覆盖格网范围的,由三角形拼接起来的网。

每一个三角形定义了一个覆盖该三角形内格网结点的面。

三角形的倾斜和标高由定义这个三角形的三个原始数据点确定。

给定三角形内的全部结点都要受到该三角形的表面的限制。

因为原始数据点被用来定义各个三角形,所以你的数据是很受到尊重的。

8.自然邻点插值法
自然邻点插值法(NaturalNeighbor)是Surfer7.0才有的网格化新方法。

自然邻点插值法广泛应用于一
些研究领域中。

其基本原理是对于一组泰森(Thiessen)多边形,当在数据集中加入一个新的数据点(目标)时,就会修改这些泰森多边形,而使用邻点的权重平均值将决定待插点的权重,待插点的权重和目标泰森多边形成比例[9]。

实际上,在这些多边形中,有一些多边形的尺寸将缩小,并且没有一个多边形的大小会增加。

同时,自然邻点插值法在数据点凸起的位置并不外推等值线(如泰森多边形的轮廓线)。

9.最近邻点插值法
最近邻点插值法(NearestNeighbor)又称泰森多边形方法,泰森多边形(Thiesen,又叫Dirichlet或V oronoi多边形)分析法是荷兰气象学家A.H.Thiessen提出的一种分析方法。

最初用于从离散分布气象站的降雨量数据中计算平均降雨量,现在GIS和地理分析中经常采用泰森多边形进行快速的赋值[2]。

实际上,最近邻点插值的一个隐含的假设条件是任一网格点p(x,y)的属性值都使用距它最近的位置点的属性值,用每一个网格节点的最邻点值作为待的节点值[3]。

当数据已经是均匀间隔分布,要先将数据转换为SURFER的网格文件,可以应用最近邻点插值法;或者在一个文件中,数据紧密完整,只有少数点没有取值,可用最近邻点插值法来填充无值的数据点。

有时需要排除网格文件中的无值数据的区域,在搜索椭圆(SearchEllipse)设置一个值,对无数据区域赋予该网格文件里的空白值。

设置的搜索半径的大小要小于该网格文件数据值之间的距离,所有的无数据网格节点都被赋予空白值。

在使用最近邻点插值网格化法,将一个规则间隔的XYZ数据转换为一个网格文件时,可设置网格间隔和XYZ数据的数据点之间的间距相等。

最近邻点插值网格化法没有选项,它是均质且无变化的,对均匀间隔的数据进行插值很有用,同时,它对填充无值数据的区域很有效。

相关文档
最新文档