单线性插值与双线性插值详解

线性插值函数其实就是一次多项式的插值方式,其几何意义就是用来拟合两点之间的一些点的数值;具体意义可以查阅百度https://baike.baidu.com/item/%E7%BA%BF%E6%80%A7%E6%8F%92%E5%80%BC/19113392?fr=aladdin

现在首先要理解线性插值的具体计算过程,对于单线性插值,求解其线性插值函数

单线性插值函数

如上图所示,就是最简单的一种线性插值函数,就是求两点之间的直线方程,与初中的直线方程函数一样,首先知道A(x_{0},y_{0}),C(x_{1},y_{1})两点的坐标,然后设B点坐标为(x,y)(x,y);从而得出

通过y_{0},y_{1}可表示为

上面得出的函数即为AC两点的线性插值函数,B点的值可由插值函数得出,其本质就是在x方向进行了一次线性插值。

双线性插值

双线性插值,又称为双线性内插。在数学上,双线性插值是有两个变量的插值函数的线性插值扩展,其核心思想是在两个方向分别进行一次线性插值。双线性插值广泛应用在数值图像处理领域;其具体过程如下图所示:

通过求插值函数来求出P点的具体数值,知道Q_{11}=(x_{1},y_{1}),Q_{12}=(x_{1},y_{2}), Q_{21}=(x_{2},y_{1}),Q_{22}=(x_{2},y_{2})四点的坐标,设R_{1}=(x,y_{1}),R_{2}=(x,y_{2}),首先通过四点在x方向进行线性插值,可得出:

然后再在y方向上进行一次线性插值

整理可得

因为双线性插值只会使用相邻的4个点,因此分母总是为1,故可以约去;原式可化为

由于插值点不一定是整数,例如点(2.5,3.5),其相邻的四个点分别为(2,3),(2,4),(3,3),(3,4);故可设插值点(x,y)由(i+u,j+v)点表示,其中的u,v为坐标的小数部分,取值为[0,1),可知其相邻点坐标分别为(i,j),(i,j+1),(i+1,j),(i+1)四点。可得

使用双线性插值处理图像时,假设源图像大小为mxn,目标图像为axb。那么两幅图像的边长比分别为:m/a和n/b。注意,通常这个比例不是整数,编程存储的时候要用浮点型。目标图像的第(i,j)个像素点(i行j列)可以通过边长比对应回源图像。其对应坐标为(i*m/a,j*n/b)。

故可得出源图像与目标图像坐标的对应关系如下式

现在假如目标图的象素坐标为(1,1),那么反推得到的对应于源图的坐标是(0.75 , 0.75), 这其实只是一个概念上的虚拟象素,实际在源图中并不存在这样一个象素,那么目标图的象素(1,1)的取值不能够由这个虚拟象素来决定,而只能由源图的这四个象素共同决定:(0,0)(0,1)(1,0)(1,1),而由于(0.75,0.75)离(1,1)要更近一些,那么(1,1)所起的决定作用更大一些,这从公式1中的系数uv=0.75×0.75就可以体现出来,而(0.75,0.75)离(0,0)最远,所以(0,0)所起的决定作用就要小一些,公式中系数为(1-u)(1-v)=0.25×0.25也体现出了这一特点。

但是这种源图像与目标图像的坐标对应方式会出现偏移的问题,按照网上一些博客上写的,源图像和目标图像的原点(0,0)均选择左上角,计算如下所示,当目标图像的像素坐标为(0,0)时,带入坐标公式可得出源图像的坐标也是(0,0)

故目标图像在原点时对应的也是源图像的原点,其所选像素值也是一样。

然后根据插值公式计算目标图像每点像素,假设你需要将一幅5x5的图像缩小成3x3,目标图像的每个像素点坐标所对应源图像的像素点坐标关系如下:

以上便是3*3的目标图像每个像素点坐标对应的源图像像素点坐标;仅从第一行像素可以看出目标图像像素点坐标(0,0),(0,1),(0,2)分别对应了源图像坐标点(0,0)(0,5/3)(0,10/3),带入插值公式可以得出

可以看出其四个相关像素点中,只有左上角和右上角的像素参与了计算,左下角和右下角的像素实际上并没有参与计算,而且目标图像的每个像素点计算出的灰度值也相对于源图像偏左偏上。即在如同田字的四个像素中只有田字的上面两个口进行了计算,下面的没有进行运算是一个道理。更直观的可以看下图

只画了一行,用做示意,从图中可以很明显的看到,如果选择左上角为原点(0,0),那么最右边和最下边的像素实际上并没有参与计算,而且目标图像的每个像素点计算出的灰度值也相对于源图像偏左偏上。其他坐标的话可以推出其最下面的像素没有参与计算。
那么,让坐标加1或者选择右下角为原点怎么样呢?很不幸,还是一样的效果,不过这次得到的图像将偏右偏下。
最好的方法就是,两个图像的几何中心重合,并且目标图像的每个像素之间都是等间隔的,并且都和两边有一定的边距,这也是matlab和openCV的做法。如下图:

在计算对应坐标的时候改为以下公式

 

  • 5
    点赞
  • 26
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
在科学研究与工程技术中,常会遇到函数表达式过于复杂而不便于计算,且又需要计算众多点处的函数值;或只已知又实验或测量得到的某一函数y=f(x)在区间[a,b]中互异的n+1个x0,x1,……,xn处的值y0,y1,……,yn,需要构造一个简函数P(x)作为函数y=f(x)的近似表达式y=f(x)≈P(x),使得P(xi)=f(xi)=yi,(i=0,1,……,n).这类问题就是插值问题,P(x)即称为插值函数。时至今日,随着电子计算机的普及,插值法的应用范围已涉及到了生产、科研、的各个领域。特别是由于航空、造船、精密机械加工等实际问题的需要,更使得插值法在实践与理论上显得尤其重要并得到了进一步发展,尤其是近几十年发展起来的样条(Spline)插值,更获得了广泛的应用。另外,在科学研究与工程技术中,常常需要从一组测量数据(xi,yi)(i=0,1,……,n)处发,寻找变量x与y的函数关系的近似表达式,且是从给定的一组实验数据出发,寻求已知函数的一个逼近函数y=ρ(x),使得逼近函数从总体上来说与已知函数的偏差按某种方法度量能达到最小而又不一定过全部的点(xi,yi),即是最小二乘曲线拟合。本软件就是针对这些问题而设计的,内容包括:线性插值、抛物线插值、分段线性插值、分段线性插值、分段抛物线插值、拉格朗日插值多项式、牛顿插值多项式、等距节点插值多项式『牛顿前插公式、牛顿后插公式』、埃尔米特插值、三次样条插值『用节点处一阶导数表示的样条函数(给定两端点处的一阶导数值、给定两端点处的二阶导数值)、用节点处二阶导数表示的样条函数(给定两端点处的一阶导数值、给定两端点处的二阶导数值)』;最小二乘曲线拟合。
UART(通用异步收发器)是一种串行通信协议,它通常需要两根线(TXD和RXD)来实现数据的发送和接收。但有时候,由于系统的限制,我们需要将UART的双线信号转换成线信号进行通信。接下来我将简介绍一下UART双线转线电路图。 首先,我们需要明确线通信所需的信号,一般来说,线通信需要一个时钟信号(CLK)和一个数据线(DIO)。因此,我们需要在原有的UART双线信号的基础上进行信号转换。 首先,我们需要将接收端(RXD)和发送端(TXD)的信号通过转换电路转换成线的数据信号。转换电路通常可以采用移位寄存器、串并转换芯片等器件来实现。这些器件可以将双线的数据信号转换成线的数据信号,并通过一个时钟信号进行同步发送和接收数据。 其次,我们需要将原本的UART时钟信号(BAUD)通过时钟分频电路进行处理,将其转换成适合线通信的时钟信号。时钟分频电路通常可以采用分频器或者锁相环芯片来实现。这样就可以生成适合线通信使用的时钟信号。 最后,我们需要将转换后的线数据信号和时钟信号通过信号线进行传输。一般情况下,我们可以通过电缆或者其他传输介质将这些信号传输到另一端的线通信设备上。 这就是简的UART双线转线电路图。通过这样的设计,我们可以实现在有限线路资源的情况下完成UART通信。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值