实验5 双线性插值
小议“双线性插值”

小议“双线性插值”摄影测量课上老师说“双线性插值”之所以叫做“双线性”,是因为在插值的时候在x、y两个方向上权是线性的,这应该是从地理要素的相关性方面来说的吧,不过我们也可以从纯数学的角度来看这个问题,并且在更一般的情况下,数学上的描述更易理解。
先来看看在二维平面的线性插值,这也是我们最熟悉的线性插值:已知平面曲线上两个点(x1,f(x1))、(x2,f(x2))(x1<x2),现在有一x落在区间[x1,x2]上,欲求x所对应的函数值f(x),由于只知道两个点,存在不能求出曲线方程的情况,于是当x2-x1为一个很小的值(即x1与x2相距很近)的情况下,我们可以认为曲线在这一个区间上是一段线段(有点像求曲率一样,呵呵),于是(x,f(x))就是这条线段上的一点,于是想要求f(x)可以如下计算:f(x)=[(x-x1)/(x2-x1)]*[f(x2)-f(x1)]+f(x1) ○1○1式即所谓的线性插值的计算式(教材上的计算公式可能不是这样,但是结果是完全一样的),[(x-x1)/(x2-x1)]实际上表示的是当自变量从x1增加到x时,因变量从f(x1)增加到f(x)时,增量在f(x2)-f(x1)这一差值上所占的比例,可以设为λ,线性函数情况下十分容易证明。
当x1、x2恰好相差一个单位长度时,令x-x1为Δx(Δx∈[0,1]),则λ=Δx,○1式可以变为f(x)= Δx*[f(x2)-f(x1)]+f(x1) ○2整理得:f(x)=(1-Δx)*f(x1)+Δx*f(x2) ○3当用λ替换Δx时,就可以用来讨论函数的凸性了。
○3式已经初具双线性插值的“形态”,下面来考虑在三维空间的线性插值,已知曲面上的四个点(x1,y1,f(x1,y1))、(x2,y2,f(x2,y2))(x1<x2),(x3,y3,f(x3,y3))、(x4,y4,f(x4,y4))(x3<x4),:现有一点(x,y,0)落在(x1,y1,0)、(x2,y2,0)、(x3,y3,0)、(x4,y4,0)四个点组成的四边形内,如下图所示图1和平面内一样,存在已知的四个点不能求出曲面方程的情况,于是假设四个点在一个很小的区域内,将这一区域看成一个平面,于是f(x,y)的计算过程如下:图2如图2,这是图1中从Z轴正上方对曲面进行平行投影得到的,两条虚线是两个平行于Z轴,分别垂直于X轴、Y轴的两个平面与平面XOY的交线,两条虚线的交点就是(x,y,0),则过(x,y,0)的一条垂直于曲面的交点就是(x,y,f(x,y)),又由于区域1234对应的曲面此时看做平面,故两个平行于Z轴的平面与此曲面的交线是两条线段,将组成区域1234的四条边在Z方向上“延伸”,则得到的四个平面与区域1234对应的曲面的交线也是线段,于是想要求得f(x,y),只需现在X轴方向以3、4点和1、2点线性内插出M、N点对应的f(M)、f(N),然后用(M,f(M))、(N,f(N)两个点在Y轴方向再做一次线性内插,就可以求得f(x,y),但是由于在内插过程中还要计算(也可以使用线性内插计算)出M、N的y坐标值,很繁琐,不再描述。
插值方法_实验报告

肖建 计科三班 20095420开课学院、实验室: 数统学院实验时间 :2011年 5 月 8 日实验项目类型课程名称数学实验实验项目名 称插值方法验证演示综合设计其他指导教师李东成 绩实验5 插值方法一、实验目的及意义[1] 了解插值的基本原理[2] 了解拉格朗日插值、线性插值、样条插值的基本思想; [3] 了解三种网格节点数据的插值方法的基本思想;[4] 掌握用MATLAB 计算三种一维插值和两种二维插值的方法;[5] 通过范例展现求解实际问题的初步建模过程;通过自己动手作实验学习如何用插值方法解决实际问题,提高探索和解决问题的能力。
通过撰写实验报告,促使自己提炼思想,按逻辑顺序进行整理,并以他人能领会的方式表达自己思想形成的过程和理由。
提高写作、文字处理、排版等方面的能力。
二、实验内容1.编写拉格朗日插值方法的函数M 文件;2.用三种插值方法对已知函数进行插值计算,通过数值和图形输出,比较它们的效果;3.针对实际问题,试建立数学模型,并求解。
三、实验步骤1.开启软件平台——MATLAB ,开启MATLAB 编辑窗口; 2.根据各种数值解法步骤编写M 文件3.保存文件并运行;4.观察运行结果(数值或图形);5.写出实验报告,并浅谈学习心得体会。
四、实验要求与任务根据实验内容和步骤,完成以下具体实验,要求写出实验报告(实验目的→问题→数学模型→算法与编程→计算结果→分析、检验和结论→心得体会)基础实验1. 一维插值 利用以下一些具体函数,考察分段线性插值、三次样条插值和拉格朗日多项式插值等三种插值方法的差异。
1),x ∈[-5,5]; 2)sin x , x ∈[0,2π]; 3)cos 10x , x ∈[0,2π].211x+M 文件:(1)clcx=linspace(-5,5,11);y=1./(1+x.^2);x0=linspace(-5,5,101);y0=1./(1+x.^2);y1=interp1(x,y,x0,'spline')y2=interp1(x,y,x0);A=[ones(11,1) x' (x.^2)' (x.^3)' (x.^4)' (x.^5)' (x.^6)' (x.^7)' (x.^8)' (x.^9)' (x.^10)']a=A\y';y3=a(1)+a(2).*x0+a(3).*x0.^2+a(4).*x0.^3+a(5).*x0.^4+a(6).*x0.^5+a(7).*x0.^6+a(8).*x0.^7+a(9).*x0.^8+a(10).*x0.^9+a(11).*x0.^10;plot(x0,y3,'r'),gtext('Lagr.'),hold on ,plot(x0,y2,'b'),gtext('Pies.Lin.'),hold on ,plot(x0,y1,'m'),gtext('Spline')hold off(2)x=linspace(0,2*pi,11); y=cos(x);x0=linspace(0,pi,101);y0=cos(x0);剩余代码和(1)中相同(3)x=linspace(0,pi,11);y=cos(x).^10;x0=linspace(0,pi,101);y0=cos(x0).^10;剩余代码和(1)中相同注意:适当选取节点及插值点的个数;比较时可以采用插值点的函数值与真实函数值的差异,或采用两个函数之间的某种距离。
双线性内插值(精)

三种插值算法最近邻插值法的双线性内插值:对于图像中一个目的像素,设置坐标通过反向变换得到的浮点坐标为(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个像素运算的结果, 由于效果好, 运算速度也不慢, 因而这种插值方法是一种很常见的算法, 普遍用在图像编辑软件、打印机驱动和数码相机上。
双线性插值算法

双线性插值算法
双线性插值(Bilinear Interpolation)是一种非常常见的插值算法,它可以用来插值两个或多个维度的数据,广泛应用于图像处理、机器学习等领域。
双线性插值的基本原理是:从数据中取出四个点,比如a、b、c、d,然后在这四个点上构建一个双线性曲面,曲面的函数为:f(x,y)=ax+by+cxy+d,其中a,b,c,d是待求的系数。
双线性插值的具体过程是:首先确定子区域的四个顶点,比如:a(x1,y1),b(x1,y2),c(x2,y1),d(x2,y2),接着在这四个顶点上求出曲面的函数,即:f(x,y)=ax+by+cxy+d,其中a,b,c,d是待求的系数,我们可以用矩阵求解法来解出这四个系数。
最后,对于子区域内的任一点,都可以用双线性插值算法来求出它的函数值:
f(x,y)=ax+by+cxy+d。
双线性插值算法的优势在于它可以用来插值两个或多个维度的数据,而且插值的精度高,可以达到很好的效果。
此外,双线性插值算法的运算速度也比较快,不需要太多的计算量,因此在实际应用中得到了广泛的应用。
综上所述,双线性插值算法是一种高效、精确的插值算法,广泛应用于图像处理、机器学习等领域。
它可以用来插值两个或多个维度
的数据,插值精度高,且运算速度快。
双线性插值算法

终止
双线性插值图像放大/缩小算法
void ResizeWorkingBitmap(tWorkBMP *a, tWorkBMP *b, WORD bx, WORD by) {
图4
目标图像 C 像素区域对应的 Q21,Q22,Q11,Q12,以绿色区域为原点向右下 方扩展的 2*2 区域。
Q21 Q22 Q11 Q12 图5
目标图像 D 像素区域对应的 Q21,Q22,Q11,Q12,目标图像处于最后两行的 边界情况,将 Q21,Q22,Q11,Q12 这四个点的值设为一样。
unsigned int PtAR = 0, PtBR = 0, PtCR = 0, PtDR = 0, PixelValueR = 0; unsigned int PtAG = 0, PtBG = 0, PtCG = 0, PtDG = 0, PixelValueG = 0; unsigned int PtAB = 0, PtBB = 0, PtCB = 0, PtDB = 0, PixelValueB = 0; register unsigned SpixelColNum = 0, SpixelRowNum = 0, DestCol = 0, DestRow = 0; unsigned int SpixelColAddr = 0, SpixelRowAddr = 0; unsigned int ColDelta = 0, RowDelta = 0, scaleV = 0, scaleH = 0; unsigned int ContribAandBR = 0, ContribCandDR = 0; unsigned int ContribAandBG = 0, ContribCandDG = 0; unsigned int ContribAandBB = 0, ContribCandDB = 0; unsigned int ContribTem[2048 * 3];// Max width is 2048 int i = 0;
图像插值技术——双线性插值法

图像插值技术——双线性插值法在图像处理中,如果需要对图像进⾏缩放,⼀般可以采取插值法,最常⽤的就是双线性插值法。
本⽂⾸先从数学⾓度推导了⼀维线性插值和⼆维线性插值的计算过程,并总结了规律。
随后将其应⽤到图像的双线性插值上,利⽤Matlab编程进⾏图像的缩放验证,实验证明,⼆维线性插值能够对图像做出较好的缩放效果。
数学⾓度的线性插值⼀维线性插值假设有⼀个⼀元函数 y=f(x) , 已知曲线上的两点,A 和 B 的坐标分别为 (x0,y0) 、(x1,y1) 。
现在要在A 和 B 之间通过插值计算出⼀个点 P ,若已知 P点的横坐标 x,如何求出 P点的纵坐标 y ?这⾥我们的插值之所以叫做线性插值,就是因为我们假定了 P 点落在 A 点和 B 点的连线上,使得他们的坐标之间满⾜线性关系。
所以,根据初中的知识,可以得到下⾯的等式:y−y0 y1−y0=x−x0 x1−x0这⾥我们令:α=x−x0 x1−x0于是,我们可以得到P点的纵坐标 y 的表达式:y=(1−α)f(x0)+αf(x1)⼆维线性插值⼀维线性插值可以扩展到⼆维的情况。
假设有⼀个⼆元函数 z=f(x,y) , 已知曲⾯上的四点,A 、B 、C、D的坐标分别为 (x0,y0) 、(x1,y0) 、(x1,y1)、(x0,y1) 。
现在要在A 、B 、C、D之间通过插值计算出⼀个点 P ,若已知 P点的坐标 (x,y),如何求出 P点的函数值坐标 z ?这⾥我们依旧可以仿照⼀维线性插值,进⾏计算。
假设先计算 y 轴⽅向的插值点 P0 和 P1 ,则根据上⾯的推导过程,且令α=y−y0 y1−y0则, P0 的取值 z0为:z0=(1−α)f(x0,y0)+αf(x0,y1) P1 的取值 z1为:z1=(1−α)f(x1,y0)+αf(x1,y1)再计算 x 轴⽅向的插值点 P,令β=x−x0 x1−x0则 P 的取值 z为:z=(1−β)z0+βz1整理得到下⾯的式⼦:z =(1−β)(1−α)f x 0,y 0+αf x 0,y 1+β(1−α)f x 1,y 0+αf x 1,y 1=(1−β)(1−α)f x 0,y 0+(1−β)αf x 0,y 1+β(1−α)f x 1,y 0+βαf x 1,y 1⼩结由⼀维线性插值过渡到⼆维线性插值,我们发现,⼆者在表达式上有相似的规律:⼀维线性插值:y =f (x )α=x p −x 0x 1−x 0y p =(1−α)f x 0+αf x 1⼆维线性插值:z =f (x ,y )α=x p −x 0x 1−x 0,β=y p −y 0y 1−y 0z p =(1−β)(1−α)f x 0,y 0+(1−β)αf x 0,y 1+β(1−α)f x 1,y 0+βαf x 1,y 1图像中的双线性插值我们可以⽤函数来表⽰⼀幅图像(假设为单通道)。
双线性插值法(bilinearinterpolation)

双线性插值法(bilinearinterpolation)前⾯讲解了最近邻插值法缩放图像以及不⾜之处,本篇介绍另外⼀种插值法,介绍双线性插值法之前先介绍线性插值。
1. 线性插值 线性插值是指插值函数为⼀次多项式的插值⽅式,其在插值节点上的插值误差为零。
线性插值可以⽤来近似代替原函数,也可以⽤来计算得到查表过程中表中没有的数值。
如图所⽰现在已知y=f(x)的两个点坐标分别是(x0,y0),(x1,y1),现在在区间(x0,x1)内给定任意x,如何求y,线性插值法采⽤图中红点的y值代替f(x)的y值。
假设x处的直线上的红点坐标为(x,Y),那么Y约等于y。
根据图可以得到公式:⽤y0,y1表⽰得到公式很好记,将分式看做权重系数。
2. 双线性插值法 双线性插值法也叫双线性内插,其核⼼思想是在两个⽅向分别进⾏⼀次线性插值。
双线性插值作为数值分析中的⼀种插值算法,⼴泛应⽤在信号处理,数字图像和视频处理等⽅⾯。
如坐标图所⽰,⽤横纵坐标代表图像像素的位置,f(x,y)代表该像素点(x,y)的彩⾊值或灰度值。
将图像放⼤或缩⼩,⽬的像素dst对应的原像素src中的坐标转换公式如下,公式很好理解,可参考上⼀章最近邻插值法。
srcX=dstX*(srcWidth/dstWidth) srcY=dstY*(srcHeight/dstHeight) 上式中,dstX与dstY为⽬标图像的某个像素的横纵坐标,dstWidth与dstHeight为⽬标图像的长与宽;srcWidth与srcHeight为原图像的宽度与⾼度。
srcX,srcY为⽬标图像在该点(dstX,dstY)对应的原图像的坐标。
现在假设⽬标图像的像素点(x’,y’)映射到原图像中是(x,y),也就是图中的P点。
设Q11 = (x1, y1)、Q12 = (x1, y2)、Q21 = (x2, y1) 、Q22 = (x2, y2),图中Q11,Q12,Q21,Q22分别为距离P点的最近的四个点。
双线性插值的原理及应用

双线性插值的原理及应用1. 概述双线性插值是一种常用的图像处理技术,用于在离散采样的图像上进行平滑差值,以实现图像的放大、缩小和旋转等操作。
它通过对相邻像素的加权平均来估计新像素的值,从而在图像处理过程中保持细节和图像质量。
2. 原理双线性插值基于以下几个假设: - 图像上的像素是连续变化的,每个像素的值可以通过插值来估计。
- 相邻像素之间的关系可以用线性函数来表示。
具体而言,对于给定的图像大小和目标大小,双线性插值的原理如下: 1. 首先,确定目标图像中每个像素在原始图像中的位置。
2. 根据目标图像中像素的位置,找出原始图像中的四个最近像素点,分别为左上(A)、右上(B)、左下(C)和右下(D)。
3. 根据目标像素相对于这四个最近像素点的位置,计算其在原始图像中的权重。
4. 根据权重和原始图像中相应像素的值,通过加权平均计算目标像素的值。
3. 应用双线性插值在很多图像处理应用中都有广泛的应用,以下列举几个常见的应用场景:3.1 图像缩放双线性插值可以通过对图像进行缩放来调整图像的大小。
通过在目标图像上的每个像素点应用双线性插值,可以用原始图像中相邻像素的加权平均值来估计新像素的值。
这样就实现了图像的缩放,同时保持了图像的细节和质量。
3.2 图像放大当需要将图像放大时,双线性插值可以通过在原始图像中插入新像素来增加图像的大小。
通过对目标图像中每个像素点应用双线性插值,可以根据其在原始图像中的位置和相邻像素的值来估计新像素的值,从而得到放大后的图像。
3.3 图像旋转双线性插值还可以用于图像的旋转。
在旋转图像时,目标图像中像素的位置会发生变化,通过双线性插值,可以根据原始图像中相邻像素的值和目标像素在原始图像中的位置来估计旋转后的图像的像素值。
3.4 数字地图在数字地图等应用中,双线性插值可以用于估计非采样点的数值。
通过插值算法,可以根据已知的采样点的数值来推断非采样点的数值,从而实现地图的平滑显示和连续性。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
实验五图像的空间变换
一、实验目的
1、学习图像空间变换,并通过实验体会空间变换的效果,对其作出分析。
2、掌握利用最邻近插值和双线性插值算法(灰度插值)实现图像的缩放。
3、掌握MATLAB编程环境中基本的图像处理函数。
二、实验要求
1.读入图像,对其利用最邻近插值和双线性插值法进行缩放变换,要求先使用IPT函数进行变换,然后自己编写函数实现;
2.对比上述得到的结果。
三、实验原理
图像的空间变换,也称几何变换或几何运算,包括图像的平移、旋转、镜像变换、转置、缩放等。
几何运算可改变图像中各物体之间的空间关系,这种运算可以看成是将各物体在图像内移动。
空间变换可如下表示:设(u,v)为源图像上的点,(x,y)为目标图像上的点,则空间变换就是将源图像上(u,v)处的像素值与目标图像上(x,y)处的像素值对应起来,并具有以下关系:
x=X(u,v),y=Y(u,v) (即由(u,v)计算对应(x,y))(1.1)
或u=U(x,y),v=V(x,y) (即由(x,y)计算对应(u,v))(1.2) 其中X(u,v)、Y(u,v)、U(x,y)、V(x,y)均为变换。
由(1.1)对应的变换称作向前映射法也叫像素移交法,而由(1.2)对应的变换称作向后映射法也叫像素填充法,向后映射法是向前映射法的逆。
最简单的插值算法是最邻近插值,也称为零阶插值。
最邻近插值算法简单,在许多情况
下都能得到令人满意的结果,但是当图像中包含像素之间灰度级有变化的细微结构时,最邻近算法会在图像中产生人为加工的痕迹。
双线性插值算法计算量比零阶插值大,但缩放后图像质量高,不会出现像素值不连续的的情况,这样就可以获得一个令人满意的结果。
最邻近点插值取插值点的4个邻点中距离最近的邻点灰度值作为该点的灰度值。
设插值点(i,j)到周边4个邻点fk(i,j)(k =1,2,3,4)的距离为dk(k =1,2,3,4),则:g(i,j)=fk(i,j),dl =min{d1,d2,d3,d4},l=1,2,3,4 。
双线性插值是利用了需要处理的原始图像像素点周围的四个像素点的相关性,通过双线插值算法计算得出的。
对于一个目的坐标,通过后映射法得到其在原始图像的对应的浮点坐标(i+u,j+v),其中i,j均为非负整数,u,v为[0,l]区间的浮点数,则这个像素的值f(i+u,j+v)可由原图像中坐标为(i,j)、(i+l,j)、(i,j+1)、(i+1,j+1)所对应的周围四个像素的值决定,即:f(i+u,j+v)=(1-u)×(1-v)×f(i,j)+(1-u)×v×f(i,j+1)+u×(1-v)×f(i+l,j)+u×v×f(i+l,j+1),其中f(i,j)表示源图像(i,j)处的的像素值,以此类推,这就是双线性内插值法。
如下图所示,已知(0,0)、(0,1)、(1,0)、(1,1)四点的的灰度,可以由相邻像素的灰度值f(0,0)和f(1,0)在X方向上线性插值求出(x,0)的灰度f(x,0),由另外两个相邻像素f(0,1)和f(1,1)在X方向上线性插值可求出(x,1)的灰度f(x,1),最后由f(x,0),f(x,1)在Y 方向上进行线性插值就可以得到(x,y)的灰度f(x,y)。
四、实验代码
注:利用最邻近插值实现图像的放大代码在实验四报告中附,本实验中只有利用双线性插值进行放大的程序
clear all
clc
N=input('输入放大倍数:');%输入放大倍数
I=imread('lena1.bmp');%读入256*256的lena图像
G=rgb2gray(I); imshow(G);%转为灰度图像并显示
[m,n]=size(G);%计算图像大小
m_new=m*N; n_new=n*N;%计算放大后的图形大小
J=[];%用于存放放大后图像中各像素点的灰度值
for i=1:m
for j=1:n
J(N*i,N*j)=G(i,j);%将原图像各像素点的灰度值赋值给放大后图像中的对应点end
end
%-----进行双线性插值----
%-----i/N,j/N分别为放大后的像素点对应在原图像中的横纵坐标
for i=1:m_new
for j=1:n_new
if(J(i,j)==0)
a=floor(i/N);b=floor(j/N); %计算i/N,j/N的整数部分
u=(i/N)-a;v=(j/N)-b; %计算i/N,j/N的小数部分
if((a>0)&&(a+1<=m)&&(b>0)&&(b+1<=n))
%进行双线性插值
J(i,j)=(1-u)*(1-v)*G(a,b)+(1-u)*v*G(a,b+1)+u*(1-v)*G(a+1,b)+u*v*G(a,b);
end
end
end
end
figure imshow(uint8(J));显示放大后的图像
五、实验结果及分析
注:放大倍数为2
1、本实验中放大后的效果:
2、利用上次实验中最邻近插值进行放大实现的效果:
3、利用Matlab中imresize()函数分别进行最邻近插值和双线性插值后的结果如下(左侧图
像为最邻近插值,右侧图像为双线性插值):
实验结果分析:有上述对比可知,利用双线性插值对图像进行放大后的效果优于利用最邻近插值放大的效果,主要是因为最邻近插值法事实上只利用了当前像素点周围四个像素点中的一个像素点的灰度值,而双线性插值法则是对当前像素点周围四个像素点的灰度值进行了加权平均,最终得到的灰度值更加连续自然,因而效果也更优。