matlab怎么拟合两列数据正弦函数,matlab怎样对数据进行插值处理
【Bilinear interpolation】双线性插值详解(转)[组图]
08-08栏目:技术
TAG:双线性插值
双线性插值
【Bilinear interpolation】双线性插值详解(转)
最近在做视频拼接的项目,里面用到了图像的单应性矩阵变换,在最后的图像重映射,由于目标图像的坐标是非整数的,所以需要用到插值的方法,用的就是双线性插值,下面的博文主要是查看了前辈的博客对双线性插值算法原理进行了一个总结,在这里也感谢一些mydhk的博文。
jhua.org
http://www.cnblogs.com/linkr/p/3630902.html
jhua.org
http://www.cnblogs.com/funny-world/p/3162003.html copyright jhua.org
双线性插值
jhua.org
假设源图像大小为mxn,目标图像为axb。那么两幅图像的边长比分别为:m/a和n/b。注意,通常这个比例不是整数,编程存储的时候要用浮点型。目标图像的第(i,j)个像素点(i行j列)可以通过边长比对应回源图像。其对应坐标为(i*m/a,j*n/b)。显然,这个对应坐标一般来说不是整数,而非整数的坐标是无法在图像这种离散数据上使用的。双线性插值通过寻找距离这个对应坐标最近的四个像素点,来计算该点的值(灰度值或者RGB值)。 copyright www.jhua.org
若图像为灰度图像,那么(i,j)点的灰度值的数学计算模型是: https://www.jhua.org
f(x,y)=b1+b2x+b3y+b4xy https://www.jhua.org
其中b1,b2,b3,b4是相关的系数。关于其的计算过程如下如下:
www.jhua.org
如图,已知Q12,Q22,Q11,Q21,但是要插值的点为P点,这就要用双线性插值了,首先在x轴方向上,对R1和R2两个点进行插值,这个很简单,然后根据R1和R2对P点进行插值,这就是所谓的双线性插值。 jhua.org
www.jhua.org
附:维基百科--双线性插值:
jhua.org
双线性插值,又称为双线性内插。在数学上,双线性插值是有两个变量的插值函数的线性插值扩展,其核心思想是在两个方向分别进行一次线性插值。
jhua.org
假如我们想得到未知函数
在点
的值,假设我们已知函数
在
,
,
,
及
四个点的值。 copyright www.jhua.org
首先在 x 方向进行线性插值,得到 jhua.org
然后在 y 方向进行线性插值,得到
https://www.jhua.org
这样就得到所要的结果
, www.jhua.org
如果选择一个坐标系统使得
的四个已知点坐标分别为 (0, 0)、(0, 1)、(1, 0) 和 (1, 1),那么插值公式就可以化简为 copyright www.jhua.org
或者用矩阵运算表示为 https://www.jhua.org
这种插值方法的结果通常不是线性的,线性插值的结果与插值的顺序无关。首先进行 y 方向的插值,然后进行 x 方向的插值,所得到的结果是一样的。
copyright jhua.org
OpenCV和Matlab中的双线性插值
https://www.jhua.org
这部分的前提是,你已经明白什么是双线性插值并且在给定源图像和目标图像尺寸的情况下,可以用笔计算出目标图像某个像素点的值。当然,最好的情况是你已经用某种语言实现了网上一大堆博客上原创或转载的双线性插值算法,然后发现计算出来的结果和matlab、openCV对应的resize()函数得到的结果完全不一样。 https://www.jhua.org
那这个究竟是怎么回事呢? jhua.org
其实答案很简单,就是坐标系的选择问题,或者说源图像和目标图像之间的对应问题。
www.jhua.org
按照网上一些博客上写的,源图像和目标图像的原点(0,0)均选择左上角,然后根据插值公式计算目标图像每点像素,假设你需要将一幅5x5的图像缩小成3x3,那么源图像和目标图像各个像素之间的对应关系如下:
https://www.jhua.org
copyright jhua.org
只画了一行,用做示意,从图中可以很明显的看到,如果选择右上角为原点(0,0),那么最右边和最下边的像素实际上并没有参与计算,而且目标图像的每个像素点计算出的灰度值也相对于源图像偏左偏上。 www.jhua.org
那么,让坐标加1或者选择右下角为原点怎么样呢?很不幸,还是一样的效果,不过这次得到的图像将偏右偏下。 https://www.jhua.org
最好的方法就是,两个图像的几何中心重合,并且目标图像的每个像素之间都是等间隔的,并且都和两边有一定的边距,这也是matlab和openCV的做法。如下图: jhua.org
copyright jhua.org
如果你不懂我上面说的什么,没关系,只要在计算对应坐标的时候改为以下公式即可,
https://www.jhua.org
int x=(i+0.5)*m/a-0.5
www.jhua.org
int y=(j+0.5)*n/b-0.5 copyright www.jhua.org
代替 jhua.org
int x=i*m/a copyright www.jhua.org
int y=j*n/b copyright www.jhua.org
利用上述公式,将得到正确的双线性插值结果 www.jhua.org www.jhua.org
https://www.jhua.org
posted @ 2018-11-20 16:59 向前奔跑的少年 阅读(...) 评论(...) 编辑 收藏
www.jhua.org
www.jhua.org
jhua.org
https://www.jhua.org
copyright www.jhua.org
相关阅读
双线性插值直观理解
copyright www.jhua.org
转载:https://blog.csdn.net/u013355826/article/details/566805211.为什么要用图像的插值?在图像的放大和缩小的过程中,需要计算新
jhua.org
阅读量:100000+
上一篇:各种三角形边长的
推荐量:2005
下一篇:VC驿站精彩【组图