赞
踩
线性插值函数其实就是一次多项式的插值方式,其几何意义就是用来拟合两点之间的一些点的数值;具体意义可以查阅百度https://baike.baidu.com/item/%E7%BA%BF%E6%80%A7%E6%8F%92%E5%80%BC/19113392?fr=aladdin
现在首先要理解线性插值的具体计算过程,对于单线性插值,求解其线性插值函数
单线性插值函数
如上图所示,就是最简单的一种线性插值函数,就是求两点之间的直线方程,与初中的直线方程函数一样,首先知道
通过
上面得出的函数即为AC两点的线性插值函数,B点的值可由插值函数得出,其本质就是在x方向进行了一次线性插值。
双线性插值
双线性插值,又称为双线性内插。在数学上,双线性插值是有两个变量的插值函数的线性插值扩展,其核心思想是在两个方向分别进行一次线性插值。双线性插值广泛应用在数值图像处理领域;其具体过程如下图所示:
通过求插值函数来求出P点的具体数值,知道
然后再在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的做法。如下图:
在计算对应坐标的时候改为以下公式
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。