双线性插值

暑假的时候做项目需要将图像修改尺寸,当时就了解到插值可以改变图像的大小,而且效果还是不错的,最近上课的时候老师又讲到了插值法,我感觉这个插值法和我用到的插值法是一个意思,今天一查果然是一种插值,索性今天就把插值法改变图像大小彻底弄懂。okay,开始吧



1 先来理解单线性插值

已知数据 (x0, y0) 与 (x1, y1),要计算 [x0, x1] 区间内某一位置 x 在直线上的y值。 


图1


公式1

果然用到的公式和我们上课的时候讲的公式是一样的,就是已知了X0,X1,Y0,Y1和X就可以求X对应位置上的Y值,而双线性插值本质上就是在X,Y两个方向上做线性插值。

2 双线性插值

二话不说,上图


图2

可以看得出来,为了求P点的像素值,在X,Y两个方向上分别作了线性插值,假设我们已知函数 f 在 Q11 = (x1, y1)、Q12 = (x1, y2), Q21 = (x2, y1) 以及 Q22 = (x2, y2) 四个点的值。然后我们先在X方向做线性插值:


图3

然后在Y方向做线性插值:


图4

最后综合起来就可以得出P点的值:


图5

由于图像双线性插值只会用相邻的4个点,因此上述公式的分母都是1。opencv中的源码如下,用了一些优化手段,比如用整数计算代替float(下面代码中的*2048就是变11位小数为整数,最后有两个连乘,因此>>22位),以及源图像和目标图像几何中心的对齐 

- SrcX=(dstX+0.5)* (srcWidth/dstWidth) -0.5 

- SrcY=(dstY+0.5) * (srcHeight/dstHeight)-0.5, 

这个要重点说一下,源图像和目标图像的原点(0,0)均选择左上角,然后根据插值公式计算目标图像每点像素,假设你需要将一幅5x5的图像缩小成3x3,那么源图像和目标图像各个像素之间的对应关系如下。如果没有这个中心对齐,根据基本公式去算,就会得到左边这样的结果;而用了对齐,就会得到右边的结果: 


图6

参考文件:

https://blog.csdn.net/xbinworld/article/details/65660665

https://blog.csdn.net/qq_37577735/article/details/80041586

©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容