最近邻插值法计算公式
vtk点云插值算法
![vtk点云插值算法](https://img.taocdn.com/s3/m/9090a249f342336c1eb91a37f111f18583d00ca2.png)
VTK点云插值算法简介VTK(Visualization Toolkit)是一个用于可视化和图形处理的开源软件系统。
它提供了各种算法和工具,用于处理和呈现各种类型的数据,包括点云数据。
点云插值是一种通过在已知点的基础上生成新点的方法,以填充空白区域或增加密度。
VTK提供了多种点云插值算法,本文将详细介绍其中的一些算法。
1. 最近邻插值算法最近邻插值算法是一种简单且常用的点云插值方法。
它的原理是在目标点附近找到最近的已知点,并将其属性值赋给目标点。
这种方法的优点是计算速度快,但缺点是生成的点云可能具有较大的误差。
VTK中的vtkKdTree类可以用于实现最近邻插值算法。
它通过构建kd树来加速最近邻搜索。
首先,我们需要将已知点云数据加载到kd树中。
然后,对于每个目标点,可以使用FindClosestPoint方法找到最近的已知点,并将其属性值赋给目标点。
以下是使用VTK进行最近邻插值的示例代码:#include <vtkSmartPointer.h>#include <vtkKdTree.h>int main(){// 加载已知点云数据vtkSmartPointer<vtkPoints> knownPoints = vtkSmartPointer<vtkPoints>::New();// ...// 构建kd树vtkSmartPointer<vtkKdTree> kdTree = vtkSmartPointer<vtkKdTree>::New();kdTree->BuildLocatorFromPoints(knownPoints);// 加载目标点云数据vtkSmartPointer<vtkPoints> targetPoints = vtkSmartPointer<vtkPoints>::New ();// ...// 最近邻插值for (vtkIdType i = 0; i < targetPoints->GetNumberOfPoints(); i++){double targetPoint[3];targetPoints->GetPoint(i, targetPoint);vtkIdType closestPointId = kdTree->FindClosestPoint(targetPoint);double closestPointValue = knownPoints->GetPointData()->GetScalars()-> GetTuple1(closestPointId);// 将属性值赋给目标点targetPoints->GetPointData()->GetScalars()->SetTuple1(i, closestPointV alue);}// ...}2. 重心插值算法重心插值算法是一种基于三角网格的点云插值方法。
cfa插值算法
![cfa插值算法](https://img.taocdn.com/s3/m/9be31646178884868762caaedd3383c4ba4cb46b.png)
cfa插值算法CFA插值算法CFA插值算法是数字图像处理中一种常用的图像重建方法。
CFA (Color Filter Array)指的是彩色滤波阵列,是数字相机中一种常见的成像传感器,用于捕捉红、绿、蓝三种颜色通道的信息。
然而,由于成本和技术限制,相机传感器上通常只包含了一部分彩色滤光片。
这就导致了在成像过程中,某些像素只有一种颜色的信息,而其他颜色通道则需要通过插值算法进行估计。
CFA插值算法的目标是根据已知颜色通道的信息,估计未知颜色通道的像素值,从而得到完整的彩色图像。
常见的CFA插值算法有最近邻插值、双线性插值和基于统计的插值方法等。
最近邻插值是最简单的一种插值算法,它通过找到离目标像素最近的已知像素的颜色值来进行估计。
该算法的计算速度快,但由于只考虑了距离最近的像素,容易产生锯齿状的估计结果。
双线性插值是一种基于线性插值的算法,它考虑了目标像素周围四个已知像素的颜色值,并根据距离和权重进行加权平均。
这种算法能够得到比最近邻插值更平滑的估计结果,但处理边缘和细节时仍然存在一定程度的失真。
基于统计的插值方法是一种更高级的CFA插值算法,它利用了图像中的统计特征来进行颜色通道的估计。
例如,可以通过分析图像中的颜色分布和纹理信息,来推测未知颜色通道的像素值。
这种方法能够有效地提高插值的准确性和图像质量。
除了上述常见的CFA插值算法,还有一些其他的改进算法被提出,如基于深度学习的CFA插值算法。
这些算法通过利用神经网络模型,能够更好地学习和估计颜色通道之间的关系,从而得到更精确的插值结果。
CFA插值算法在数字图像处理中扮演着重要的角色。
通过合理选择和应用插值算法,可以有效地提高图像的质量和细节表达能力。
未来随着技术的不断进步,相信CFA插值算法将会得到更多的改进和应用,为我们带来更加逼真和精确的彩色图像。
opencv中resize函数五种插值算法;java -回复
![opencv中resize函数五种插值算法;java -回复](https://img.taocdn.com/s3/m/78d0c9808ad63186bceb19e8b8f67c1cfad6ee0a.png)
opencv中resize函数五种插值算法;java -回复OpenCV中提供了多种图像处理函数和算法,其中之一就是resize函数,用于调整图片大小。
resize函数中有五种不同的插值算法,它们分别是:最近邻插值(Nearest-neighbor interpolation)、双线性插值(Bilinear interpolation)、双三次插值(Bicubic interpolation)、立方插值(Cubic interpolation)和区域插值(Area interpolation)。
这五种插值算法在不同的场景下有不同的效果和应用范围。
在本文中,我们将逐步解释这五种插值算法的原理和应用,然后给出一些使用Java实现的示例代码。
首先,让我们从最近邻插值算法开始。
最近邻插值算法是一种简单而直接的插值方法,它通过选择离目标像素最近的现有像素来进行图像的缩放。
这种插值算法的计算速度很快,但它会造成图像的锯齿状边缘,尤其是在图像的缩小过程中。
因此,最近邻插值算法主要适用于图像放大的情况,不过其精度相对较低。
接下来是双线性插值算法,它是一种基于线性插值的方法。
相比于最近邻插值算法,双线性插值算法通过对目标像素四个相邻像素的加权平均值来计算新的像素值。
这样可以得到更平滑的缩放效果,减少了锯齿状边缘的出现。
双线性插值算法的计算复杂度较低,是一种较常用且适用于大多数图像处理任务的插值方法。
双三次插值算法是一种更高级的插值方法,它通过在四个最近像素的基础上使用三次多项式来进行插值计算。
这种插值方法可以提供更高质量和更准确的图像缩放效果,同时也增加了计算复杂度。
双三次插值算法通常适用于需要高质量图像处理的场景,比如数字图像处理和医学图像处理等领域。
立方插值算法是一种更一般化的插值方法,它通过在二维空间中使用分数幂函数来对像素进行插值计算。
这种方法可以提供更平滑的缩放效果,并且能够处理更高阶的插值计算。
立方插值算法适用于一些对图像质量要求较高和需要更高阶插值计算的图像处理任务。
最近邻插值——精选推荐
![最近邻插值——精选推荐](https://img.taocdn.com/s3/m/047eaf33182e453610661ed9ad51f01dc281573b.png)
最近邻插值最近邻插值原理:使⽤最近邻插值: 源图⽚(simg)=⽬标图⽚(dimg)*缩放系数(k), 缩放系数k = 源图⽚尺⼨/⽬标图⽚由上,对图⽚分x、y轴:sx = dx*k sy = dy *k思路:初始化⽬标size的图⽚,然后根据位置计算⽬标图⽚对应于原图⽚的位置索引,索引结果四舍五⼊也就是说⽬标图⽚的每个像素都是根据⽬标图⽚的像素索引*缩放系数后求得⽬标图⽚对应其在源图⽚上的索引位置,索引结果四舍五⼊最近邻插值也就是⽬标图⽚的每个像素依赖于源图⽚的像素值通过缩放系数计算得到的索引,并索引源图⽚的像素值来填充1import matplotlib.pyplot as plt2import numpy as np34 img = plt.imread('source.bmp')56def nearest_interploat(img,dsize):7"""8对单通道的图⽚进⾏缩放处理9使⽤最近邻插值:源图⽚(simg)=⽬标图⽚(dimg)*缩放系数(k),缩放系数k = 源图⽚尺⼨/⽬标图⽚10由上,对图⽚分x、y轴:sx = dx*k sy = dy *k11思路:初始化⽬标size的图⽚,然后根据位置计算⽬标图⽚对应于原图⽚的位置索引,索引结果四舍五⼊12也就是说⽬标图⽚的每个像素都是根据⽬标图⽚的像素索引*缩放系数后求得⽬标图⽚对应其在源图⽚上的索引位置,索引结果四舍五⼊13最近邻插值也就是⽬标图⽚的每个像素依赖于源图⽚的像素值通过缩放系数计算得到的索引,并索引源图⽚的像素值来填充14 :param img: 源图⽚15 :param dsize: ⽬标尺⼨16 :return: ⽬标图⽚17"""1819 dimg = np.zeros((dsize),dtype=int) #初始化⽬标图⽚20 ssize_x,ssize_y = img.shape21 plt.imshow(dimg)22 plt.show()23#下⾯将dsize分开处理为x的缩放系数与y的缩放系数是因为图像的⾼宽可能不⼀致24 xk = (ssize_x/dsize[0])25 yk = (ssize_y/dsize[1])2627# np.argwhere(dimg!=None)返回⽬标图⽚的像素索引 shape=(dsize_x*disze_y,2)因为每个像素点都有x,y两个索引28 pixel_index=np.argwhere(dimg!=None) #返回的索引每个像素点[⾏,列]像素点从⾏到列293031 d_ssize_x = pixel_index[:,0]*xk3233 d_ssize_y = pixel_index[:,1] *xk343536 d_ssize_x = np.around(d_ssize_x) #四舍五⼊37 d_ssize_y = np.around(d_ssize_y)383940 d_ssize_x=d_ssize_x.astype('int')41 d_ssize_y=d_ssize_y.astype('int')4243 d_ssize_x[np.nonzero(d_ssize_x==ssize_x)[0]] = ssize_x-1 #索引不得超过size-144 d_ssize_y[np.nonzero(d_ssize_y==ssize_y)[0]] = ssize_y-14546print(d_ssize_x[np.nonzero(d_ssize_x>ssize_x)[0]])47 dimg = img[d_ssize_x,d_ssize_y]48 dimg = np.resize(dimg,dsize)49print(img.shape)50 plt.imshow(img)51 plt.show()5253 plt.imshow(dimg)54 plt.show()555657585960if__name__ == '__main__':61 c =5062 nearest_interploat(img[:,:,2],(176*c,197*c))63 a = np.random.rand(2,3)。
matlab旋转实现(最近邻值-双线性-三次卷积插值实现插值)培训课件
![matlab旋转实现(最近邻值-双线性-三次卷积插值实现插值)培训课件](https://img.taocdn.com/s3/m/fd73ecc4af45b307e9719704.png)
end end
end
subplot(2,2,1),imshow(Img,[]),title(' 原图 ');
subplot(2,2,2),imshow(Imgnew1,[]),title(' subplot(2,2,3),imshow(Imgnew2,[]),title(' subplot(2,2,4),imshow(Imgnew3,[]),title('
%新图像的宽 width
hnew=w*sin(alpha)+h*cos(alpha); %新图像的高 heighth
wnew=ceil(wnew); %取整
hnew=ceil(hnew);
u0=w*sin(alpha); %平移量
T=[cos(alpha),sin(alpha);-sin(alpha),cos(alpha)]; %变换矩阵
p4=Img(x_up,y_up);
s=x-x_low;
t=y-y_low;
Imgnew1(u,v)=Img(x,y);
Imgnew2(u,v)=(1-s)*(1-t)*p1+(1-s)*t*p3+(1-t)*s*p2+s*t*p4;
end
if x>=2 & x<=h-2 & y>=2 & y<=w-2 x_1=floor(x)-1;
最近邻插值法 '); 双线性插值法 '); 三次卷积插值法 ');
精品文档
Imgnew1=zeros(hnew,wnew);
Imgnew2=zeros(hnew,wnew);
Imgnew3=zeros(hnew,wnew);
临近插值原理-概念解析以及定义
![临近插值原理-概念解析以及定义](https://img.taocdn.com/s3/m/82f03065b5daa58da0116c175f0e7cd18525184c.png)
临近插值原理-概述说明以及解释1.引言1.1 概述临近插值是一种常用的插值方法,用于根据已知数据点的值和位置来估计未知位置的数值。
它基于一个简单的假设:在已知数据点的附近,待估计的数值与最近的已知数值相等或相似。
在该插值方法中,我们使用最接近待估计位置的已知数据点的数值作为该位置的估计值。
临近插值的优势在于计算简单、速度快。
它不需要对数据进行复杂的计算和推导,只需要根据已知数据点找到最近的邻居,并将其值作为待估计位置的值。
因此,临近插值在许多实际应用中被广泛采用。
临近插值的原理可以通过简单的几何形象或数学公式来说明。
它可以看作是将已知数据点形成的网格划分为小区域,并在每个小区域内利用最近邻原则进行数值的预测。
这种局部性质使得临近插值适用于处理局部变化较大的数据,例如地理信息系统中的地形高度数据、图像处理中的边缘插值等。
除了在数据插值中的应用,临近插值还广泛应用于图像处理、图形学、模拟仿真等领域。
例如在图像处理中,临近插值可以用于图像的缩放、旋转等操作,能够保持图像的清晰度和边缘的锐利度。
然而,临近插值方法也存在一些局限性。
由于它只考虑最近邻点的数值,忽略了其他邻域点的信息,因此在处理包含噪声或不规则数据的情况下可能会导致误差较大的估计结果。
此外,临近插值方法在处理大型或高维数据时可能效果不佳,因为它对于数据的维度灵活性较差。
尽管临近插值方法存在这些局限性,但随着计算机技术的快速发展和数据处理需求的不断增长,临近插值方法仍在不断改进和应用中。
未来,可以期待临近插值方法在大数据、深度学习等领域发挥更重要的作用,并与其他插值方法相结合,进一步提高估计的精度和效果。
1.2文章结构文章结构的目的是为了准确传达作者的思想,使读者能够清晰地理解文章的主题和论点。
在本文中,我们将按照以下结构来呈现关于临近插值原理的主要内容。
首先,引言部分将概述临近插值的概念以及本文的目的。
我们将介绍临近插值的基本定义和其在各个领域中的重要性。
常见插值方法及其的介绍
![常见插值方法及其的介绍](https://img.taocdn.com/s3/m/16776825f08583d049649b6648d7c1c708a10b25.png)
常见插值方法及其介绍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的权重。
换言之,该结点被赋给与观测点一致的值。
这就是一个准确插值。
距离倒数法的特征之一是要在格网区域产生围绕观测点位置的“牛眼"。
用距离倒数格网化时可以指定一个圆滑参数。
大于零的圆滑参数保证,对于一个特定的结点,没有哪个观测点被赋予全部的权值,即使观测点与该结点重合也是如此。
圆滑参数通过修匀已被插值的格网来降低“牛眼” 影响。
2、克里金法克里金法是一种在许多领域都很有用的地质统计格网化方法。
最近邻插值算法
![最近邻插值算法](https://img.taocdn.com/s3/m/969a49ea81c758f5f61f674a.png)
提高对比度
48
218
255
提高对比度举例
② 如果a<1, 如果a<1, b为常数时 b为常数时, 为常数时,输出图像的对 比度减小
255 202
62 0
降低对比度
255
降低对比度举例
255
0
255
③ 如果a 如果a=1,b≠0,操作仅使所有像素的 灰度值上移或下移, 灰度值上移或下移,其效果是使整个图像更 暗或更亮
255
输出
0ቤተ መጻሕፍቲ ባይዱ
输入
255
亮度调整
加亮、 加亮、减暗图像
255 218 255
加暗、 加暗、减亮图像
32 128 255 128 255
非线性拉伸实例( 非线性拉伸实例(灰度图像) 灰度图像)
非线性拉伸实例( 非线性拉伸实例(灰度图像) 灰度图像)
非线性拉伸实例( 非线性拉伸实例(灰度图像) 灰度图像)
消除背景影响
即去除不需要的叠加性图案 设:背景图像b(x 背景图像b(x ,y) ,y), 前景背景混合图像f(x 前景背景混合图像f(x ,y) g(x,y)= g(x,y)=f(x,y )=f(x,y) f(x,y)–b(x,y) b(x,y) g(x,y) g(x,y ) 为去除了背景图像
差影法
数字图像处理
双线性内插值(精)
![双线性内插值(精)](https://img.taocdn.com/s3/m/870aab7625c52cc58bd6be93.png)
三种插值算法最近邻插值法的双线性内插值:对于图像中一个目的像素,设置坐标通过反向变换得到的浮点坐标为(i+u,j+v,其中 i 、 j 均为非负整数, u 、 v 为 [0,1区间的浮点数,则这个像素得值f(i+u,j+v 可由原图像中坐标为 (i,j、 (i+1,j、 (i,j+1、 (i+1,j+1所对应的周围四个像素的值决定,即:f(i+u,j+v = (1-u(1-vf(i,j + (1-uvf(i,j+1 + u(1-vf(i+1,j + uvf(i+1,j+1其中 f(i,j表示源图像 (i,j处的的像素值,以此类推这就是双线性内插值法。
双线性内插值法计算量大,但缩放后图像质量高, 不会出现像素值不连续的的情况。
由于双线性插值具有低通滤波器的性质, 使高频分量受损,所以可能会使图像轮廓在一定程度上变得模糊插值的计算方法有很多, 比较常用的有最近像素插值算法、双线性插值算法、双三次插值算法和分形算法的四种。
其中, 最近像素插值算法是最简单的一种插值算法, 这种方法是当图片放大时, 缺少的像素通过直接使用与之最接近的原有像素的颜色生成, 也就是说照搬旁边的像素。
如图 1所示,当图片扩大时,要增加 X 点处的像素,由于 X 点与 A 、 B 这两个有效像素中的 B 点最接近,因此 X 点会直接照搬B 点的像素,从而使到 X 点生成的效果与 B 点一样。
虽然这种算法简单, 因此处理的速度很快, 但结果通常会产生明显可见的锯齿, 效果往往不佳。
双线性插值算法, 是指输出的图像的每个像素都是原图中四个像素运算的结果, 由于它是从原图四个像素中运算的, 因此这种算法很大程度上消除了锯齿现象, 而且效果也比较好。
双三次插值算法是双线性插值算法的改进算法,它输出图像的每个像素都是原图 16个像素运算的结果, 由于效果好, 运算速度也不慢, 因而这种插值方法是一种很常见的算法, 普遍用在图像编辑软件、打印机驱动和数码相机上。
常见插值算法--拉格朗日插值、三次卷积插值、三次样条插值、兰克索斯插值
![常见插值算法--拉格朗日插值、三次卷积插值、三次样条插值、兰克索斯插值](https://img.taocdn.com/s3/m/a41b295ac950ad02de80d4d8d15abe23482f039b.png)
常见插值算法--拉格朗⽇插值、三次卷积插值、三次样条插值、兰克索斯插值写在前⾯本⽂简单介绍了⼏种常见的插值算法并附带了相应的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)。
matlab插值类型
![matlab插值类型](https://img.taocdn.com/s3/m/a52e37e6b1717fd5360cba1aa8114431b80d8e49.png)
matlab插值类型在MATLAB中,插值是一种常用的数据处理技术,用于估计在已知数据点之间的数值。
MATLAB提供了多种插值方法,每种方法都有其适用的情况和特点。
以下是一些常见的插值类型:1. 线性插值(linear interpolation),线性插值是一种简单的插值方法,通过已知数据点之间的直线来估计新的数据点。
在MATLAB中,可以使用interp1函数来进行线性插值。
2. 三次样条插值(cubic spline interpolation),三次样条插值是一种平滑的插值方法,它利用已知数据点之间的三次多项式来估计新的数据点。
在MATLAB中,可以使用interp1函数并指定'cubic'选项来进行三次样条插值。
3. 最近邻插值(nearest neighbor interpolation),最近邻插值是一种简单的插值方法,它通过找到最接近新数据点的已知数据点来进行估计。
在MATLAB中,可以使用interp1函数并指定'nearest'选项来进行最近邻插值。
4. 二维插值(2D interpolation),除了在一维数据上进行插值外,MATLAB还提供了在二维数据上进行插值的方法。
可以使用interp2函数来进行二维插值,同样可以选择线性插值、三次样条插值或最近邻插值。
除了上述提到的插值方法,MATLAB还提供了其他一些特定的插值函数,如interpft、interpn等,用于处理不同类型的数据和插值需求。
选择合适的插值方法取决于数据的特点、插值精度的要求以及计算效率等因素。
在实际应用中,需要根据具体情况选择合适的插值方法来进行数据处理和分析。
matlab的griddata函数
![matlab的griddata函数](https://img.taocdn.com/s3/m/97467fdd534de518964bcf84b9d528ea81c72f8a.png)
matlab的griddata函数griddata函数是MATLAB中一个用于插值的函数,它可以根据输入的散点数据对二维或三维空间进行插值计算。
在MATLAB中,griddata函数的语法如下:vq = griddata(x, y, v, xq, yq)vq = griddata(x, y, z, v, xq, yq, zq)[vq, vqy] = griddata(x, y, v, xq, yq)[vq, vqy, vqz] = griddata(x, y, z, v, xq, yq, zq)其中,x、y、z是输入散点数据点的坐标,v是对应数据点的值。
xq、yq、zq是需要进行插值计算的网格点的坐标,vq是插值计算得到的网格点的值。
vqy和vqz是在三维情况下得到的垂直方向的插值结果。
griddata函数实现了不同的插值方法,包括最近邻插值、线性插值和三次自然松弛插值:1. 最近邻插值('nearest'):这是默认的插值方法,它基于最近的数据点进行插值计算,适用于离散数据的空间插值。
vq = griddata(x, y, v, xq, yq, 'nearest')2. 线性插值('linear'):它基于数据点之间的线性关系进行插值计算,适用于连续变化的物理量。
vq = griddata(x, y, v, xq, yq, 'linear')3. 三次自然松弛插值('cubic'):这是使用三次曲面插值方法进行插值计算,适用于光滑的数据分布。
vq = griddata(x, y, v, xq, yq, 'cubic')对于输入的散点数据,griddata函数会自动将其分为内插点(内部点)和外插点(边界点),其中内插点是在散点数据内部的点,外插点是在散点数据外部的点。
内插点可以直接用于插值计算,而外插点则需要通过不同的方法进行外推。
三维最近邻插值法
![三维最近邻插值法](https://img.taocdn.com/s3/m/64204cda18e8b8f67c1cfad6195f312b3169eb89.png)
三维最近邻插值法
三维最近邻插值法是一种空间插值方法,用于估算一个三维空间中某一点的值。
该方法根据离该点最近的已知数据点的值进行估算。
具体算法如下:
1.确定目标插值点的坐标。
2.在已知数据点的空间中,寻找与目标插值点最近的数据点。
3.将该数据点的值作为目标插值点的估计值。
4.如果目标插值点不在已知数据点的空间中,则需要在该空间中进行插值。
方法是先找到最近的数据点作为估计点,然后根据三维距离加权计算出目标插值点的估计值。
5.返回目标插值点的估计值。
三维最近邻插值法的优点是计算简单、速度快,适用于数据点密度较大的情况。
缺点是不适用于空间中存在较大波动的情况,因为该方法只考虑了离目标插值点最近的数据点的值,未考虑其它数据点的影响。
python栅格数据重采样方法的原理
![python栅格数据重采样方法的原理](https://img.taocdn.com/s3/m/7142c465e55c3b3567ec102de2bd960590c6d90c.png)
python栅格数据重采样方法的原理栅格数据重采样是指将原始栅格数据在保持其几何位置和分辨率不变的基础上,进行像元数目的调整,以满足特定应用的需求。
在遥感图像处理中,数据源的分辨率与探测器的最小分辨率密切相关。
如果当前地物类别长度小于像元宽度,则可能将多余信息带入新产品中。
因此,重采样是以适当的权重准确计算新产品的像元值的一种有效方法。
重采样方法有许多种,如最近邻(nearest neighbor)、双线性插值(bilinear interpolation)、三次卷积(cubic convolution)、拉格朗日插值(Lagrange interpolation)、多项式拟合(polynomial fitting)等,下面对其中一些进行简要介绍。
1. 最近邻插值法最近邻插值法的原理和实现非常简单。
其思想是在新网格中,像元的值取离该像元最近的已知像元的值。
这种方法可实现快速数据抽取,并能有效避免新数据附带的误差。
但是,最近邻插值法无法解决基础数据空余的问题,也无法识别微小地貌特征。
2. 双线性插值法双线性插值法是一种近邻插值方法。
它首先将新像元的位置确定为原始像素间的位置,然后通过四个相邻像素的加权平均值计算每个新像素的值。
双线性插值法二次逼近参考图像中不同位置上的颜色值,从而创建更细腻的图像显色。
这种方法可以精确地外推像元值,适用于较小差异和相等量级的数据。
3. 三次卷积法三次卷积法适用于栅格数据重采样和条带扫描图像处理。
该方法基于多提高阶多项式,利用卷积计算方式在不同的方向上平移图像。
这种方法可以比双线性插值法更精确,特别是在进行应用时显示细节的差异较大的矩阵上。
4. 拉格朗日插值法拉格朗日插值法是一种基于 Lagrange 多项式推导的插值方法。
对于目标数据未知的结点,Lagrange 插值公式将他们的值表示为标准训练数据点的多项式。
但是,由于拉格朗日插值法使用高次多项式拉伸目标数据和训练数据之间的距离,因此可能存在过度适应噪声的问题。
vwn插值算法
![vwn插值算法](https://img.taocdn.com/s3/m/9564945630b765ce0508763231126edb6f1a76f5.png)
vwn插值算法
VWN插值算法,是一种常用于图像处理、计算机视觉等领域的插值算法。
它的全称是Variable Weighted Nearest Neighbor Interpolation,即可变加权最近邻插值法。
该算法的基本思想是先找到离目标像素最近的若干个像素点,然后根据它们与目标像素的距离和权重来计算目标像素的灰度值。
具体来说,VWN插值算法包括以下几个步骤:
1. 找到目标像素的最近邻像素,即距离目标像素最近的像素点。
2. 确定若干个最近邻像素的权重,一般可采用距离的倒数作为权重,距离越近的像素点权重越大。
3. 根据最近邻像素的权重和灰度值,计算目标像素的灰度值。
具体来说,可将最近邻像素的灰度值乘以对应的权重,然后将所有这些乘积相加得到目标像素的灰度值。
VWN插值算法相比于其他插值算法的优点是:它能够根据邻近像素的权重和距离来精确计算目标像素的灰度值,同时也具有较高的计算效率。
因此,在图像处理、计算机视觉、计算机图形学等领域中,VWN插值算法被广泛应用。
- 1 -。
图像最近邻插值算法
![图像最近邻插值算法](https://img.taocdn.com/s3/m/30e9bc0053ea551810a6f524ccbff121dc36c557.png)
图像最近邻插值算法⼀. 最近邻插值法放⼤图像:最近邻插值法在放⼤图像时补充的像素是最近邻的像素的值。
由于⽅法简单,所以处理速度很快,但是放⼤图像画质劣化明显,常常含有锯齿边缘。
最近邻插值法算法原理↑⼆. 最近邻插值法算法流程:插值法放⼤图像的第⼀步都是相同的,计算新图的坐标点像素值对应原图中哪个坐标点的像素值来填充,计算公式为:srcX = dstX * (srcWidth/dstWidth)srcY = dstY * (srcHeight/dstHeight)其中,src表⽰旧图,dst表⽰新图。
新图的坐标(dstX,dstY)对应于旧图的坐标(srcX,srcY)。
srcWidth/dstWidth 和srcHeight/dstHeight 分别表⽰宽和⾼的放缩⽐。
那么问题来了,通过这个公式算出来的 srcX,scrY (旧图坐标)有可能是⼩数,但是坐标点是不存在⼩数的,都是整数,得想办法把它转换成整数才⾏。
不同插值法的区别就体现在 srcX,scrY 是⼩数时,怎么变成整数去取原图像中的像素值。
最近邻插值法:看名字就很直⽩,四舍五⼊选取最接近的整数。
这样的做法会导致像素的变化不连续,在新图中会产⽣锯齿。
三. 实验 python实现最近邻插值算法1from PIL import Image2import matplotlib.pyplot as plt3import numpy as np4import math56# 最近邻插值算法7# dstH为新图的⾼;dstW为新图的宽8def NN_interpolation(img,dstH,dstW):9 scrH,scrW,_=img.shape10 retimg=np.zeros((dstH,dstW,3),dtype=np.uint8)11for i in range(dstH-1):12for j in range(dstW-1):13 scrx=round(i*(scrH/dstH))14 scry=round(j*(scrW/dstW))15 retimg[i,j]=img[scrx,scry]16return retimg1718 im_path='../paojie.jpg'19 image=np.array(Image.open(im_path))2021 image1=NN_interpolation(image,image.shape[0]*2,image.shape[1]*2)22 image1=Image.fromarray(image1.astype('uint8')).convert('RGB')23 image1.save('out.png')四. 实验结果:原图↑最近邻插值后图像↑可以看到新图中产⽣了锯齿状的边缘。
upsample计算过程
![upsample计算过程](https://img.taocdn.com/s3/m/50f2ff0c30126edb6f1aff00bed5b9f3f80f7269.png)
upsample计算过程使用upsample进行计算的过程如下:一、什么是upsample?upsample是一种信号处理技术,用于增加信号的采样率或提高信号的分辨率。
在图像处理中,upsample可以通过插值算法将低分辨率图像放大到高分辨率图像。
二、为什么需要upsample?在某些应用中,我们需要获得更高分辨率的图像或信号。
例如,在计算机视觉任务中,如图像分类或目标检测,高分辨率图像可以提供更多的细节信息,从而提高算法的准确性和性能。
此外,对于图像重建或增强任务,upsample也可以改善图像的质量。
三、upsample的常见方法1. 最近邻插值(Nearest Neighbor Interpolation):该方法通过选择离目标像素最近的邻近像素的值来进行插值。
这种方法简单快速,但会导致图像出现锯齿状的伪影。
2. 双线性插值(Bilinear Interpolation):该方法通过对目标像素周围的四个邻近像素进行线性插值来计算目标像素的值。
这种方法在处理图像放大时效果较好,可以减少锯齿状伪影。
3. 双三次插值(Bicubic Interpolation):该方法在双线性插值的基础上,通过对目标像素周围的16个邻近像素进行三次插值来计算目标像素的值。
这种方法在处理图像放大时可以获得更平滑的结果,但计算复杂度较高。
四、upsample的计算过程以双线性插值为例,下面以一个简单的2x2的图像为例来演示upsample的计算过程。
1. 原始图像:1 23 42. 目标图像尺寸为4x4,需要将原始图像放大到目标图像。
1 2 0 03 4 0 00 0 0 00 0 0 03. 计算目标图像中每个像素的值:1. 遍历目标图像中的每个像素,计算对应的原始图像坐标。
2. 计算原始图像坐标周围的四个邻近像素的值:1 23 43. 根据双线性插值公式计算目标像素的值:目标像素 = (1 - x) * (1 - y) * 原始像素(0, 0) + x * (1 - y) * 原始像素(1, 0) + (1 - x) * y * 原始像素(0, 1) + x* y * 原始像素(1, 1),其中x和y分别为目标像素在原始图像坐标系中的相对位置。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
最近邻插值法计算公式
最近邻插值法是一种常用的图像处理和计算机图形学技术,它能够通过周围像素的值来估计缺失像素的值。
本文将详细介绍最近邻插值法的计算公式及其应用。
我们来看最近邻插值法的计算公式。
最近邻插值法的基本思想是,在缺失像素附近找到最近的已知像素,并将其值作为缺失像素的值。
具体而言,对于一个待插值的像素P,我们需要找到其在已知像素中最近的邻居像素Q。
然后,将像素Q的值赋给像素P,即可完成插值。
最近邻插值法的计算公式可以表示为:
P = Q
其中,P表示待插值的像素,Q表示最近的邻居像素。
最近邻插值法的应用十分广泛。
在图像处理中,最近邻插值法常用于图像的缩放、旋转和变换等操作中。
例如,在图像缩放中,如果需要将一幅图像放大到原来的两倍大小,那么需要对每个像素进行插值。
最近邻插值法通过找到离待插值像素最近的已知像素来估计缺失像素的值,从而实现图像的放大操作。
在计算机图形学中,最近邻插值法也常用于纹理映射和渲染等方面。
最近邻插值法的优点是计算简单、速度快。
由于只需要找到最近的邻居像素并将其值赋给待插值像素,因此最近邻插值法的计算量较小。
此外,最近邻插值法不会引入额外的模糊或锐化效果,能够保
持图像的清晰度。
然而,最近邻插值法也存在一些缺点。
由于只考虑了最近的邻居像素,最近邻插值法无法对图像进行平滑处理,因此可能导致插值结果的失真。
此外,最近邻插值法对于像素值变化较大的图像效果较差。
在这种情况下,我们可以使用其他插值方法,如双线性插值法或双三次插值法。
总结起来,最近邻插值法是一种简单且有效的图像插值方法。
它通过寻找离待插值像素最近的邻居像素来估计缺失像素的值,从而实现图像的放大、缩小、旋转和变换等操作。
最近邻插值法具有计算简单、速度快的优点,但也存在一些缺点,如无法进行平滑处理和对像素值变化较大的图像效果较差。
因此,在具体应用中,我们需要根据实际需求选择合适的插值方法。
最近邻插值法在实际应用中的广泛使用,为图像处理和计算机图形学领域的研究和应用提供了重要的技术支持。