双线性插值

双线性插值的原理以及计算方法详解

1. 原理
在图像的放射变换以及DCGAN深度学习网络的上采样模块中,经常会用到双线性插值算法,常见的插值算法包括最近邻插值、双线性插值、双三次插值等等。Opencv和深度学习框架中也提供了这些插值算法的API,方便我们调用,其中双线性插值由于折中的插值效果和处理速度,运用的比较广泛。
下面我们先从最近邻插值算法看起,逐步介绍。首先我们先看下面这样一个例子,假设有这样一幅256级灰度图像,大小为3 x 3。像素值如下所示:
在这里插入图片描述
在这个图像坐标系中,原点在图像左上角,X轴和Y轴的增长方向如上图所示。
好了,现在问题来了,我们想把上图的3 x 3大小的图像resize到4 x 4大小的图像,应该怎样操作呢?
首先,我们的想法是先生成一个4 x 4大小的空矩阵,矩阵中不填充任何值,可以把图像理解为一个二维矩阵,这样一来,二维矩阵中的值就是图像上对应位置的点的像素值,如下图所示,这个二维4 x 4大小的矩阵中的值等待我们去填充。
在这里插入图片描述
那么问题来了,这个二维矩阵中需要填充的像素值从哪里来呢?当然是原图了。首先必须清楚的一点是我们的目标图像和原图像的坐标对应关系,有如下公式:
在这里插入图片描述
在这里插入图片描述
上面这个公式很好理解,首先我们从目标图像(dst)的左上角出发,开始计算二维矩阵中需要填充的像素值,套用公式就可以计算出目标图像的(0,0)点坐标对应到原图像(src)的坐标位置。(0 x (3/4),0 x (3/4)=>(0,0),计算出结果后,我们将原图中(0,0)位置的像素值赋值给目标图像(0,0)的位置,如下图所示:
在这里插入图片描述
下面我们来计算目标图像(1,0)位置的像素值,首先带入公式计算对应到原图中的坐标值,(1 x (3/4),0 x (3/4))
>(0.75,0)。我们得到了这样带有小数点的坐标信息,我们也知道图像在计算机中的存储方式,最小单位为1,没有小数,这可怎么办呢?当然有同学可能会想到用我们小学学到的方法,四舍五入呗~,当然这种方法是可行的,如此我们便可得到坐标(0.75,0)=>(1,0)。将原图像(1,0)位置处的像素值插入其中,可得如下图所示:
在这里插入图片描述
同理,依次填入剩下的像素,可得到如下图所示的像素填充方案:
在这里插入图片描述
这种放大图像的方法也就是最基本的最近邻插值法,这种方法有个很大的问题就是,放大后的图像会有严重的马赛克,缩小后的图像也会出现严重的失真,问题的根本在于从目标图像的坐标反推到原图像的坐标过程中采用了四舍五入的方法,拿目标图像中(1,0)位置来看,我们通过公式计算出的值为(0.75,0),我们四舍五入到(1,0),我们不应该简单的取(1,0),而应该根据(0.75,0)周围的四个虚拟点来确定我们应取的值。
双线性插值就是基于这样的思路,坐标的取值由该点周围的四个虚拟的点的坐标来共同确定。
对于一个目标像素,该目标像素坐标通过反向变换得到浮点坐标(i+u,j+v)(i为横坐标的整数部分,j为纵坐标的整数部分。u、v分别为横纵坐标的浮点位。像素值f(i+u,j+v)由(i+u,j+v)周围的四个点的像素值共同决定。这四个点的坐标为(i,j)、(i+1,j)、(i,j+1)、(i+1,j+1)。具体的像素值计算公式为:f(i+u,j+v) = (1-u)(1-v)f(i,j) + (1-u)vf(i,j+1) + u(1-v)f(i+1,j) + uvf(i+1,j+1) ,下面我们重点讲述这个公式是怎样得到的,首先看下面这幅图:
在这里插入图片描述

2. 计算方法
在这里插入图片描述首先在X方向进行两次线性插值运算,得到R1和R2两个点的坐标值,然后在Y方向进行一次线性插值,有如下公式:
在这里插入图片描述
我么在这里解释一下公式1,
在这里插入图片描述
这里的f(x,y1)即就是R1的像素值,R1位于Q1和Q2之间,从上图可以看出,R1更靠近Q1,因此它的像素值也应该接近Q1的像素值。(x2-x)的值大于(x-x1)的值,(x2-x1)的值是固定的,从上式可以看出,对于f(Q1)分配了比较大的权重,对于f(Q2)分配了比较小的权重。
然后,在Y的方向进行线性插值,可以得到如下公式:
在这里插入图片描述
在图像处理的时候,我们先根据
  srcX=dstX* (srcWidth/dstWidth) ,
  srcY = dstY * (srcHeight/dstHeight)
来计算目标像素在源图像中的位置,这里计算的srcX和srcY一般都是浮点数,比如f(1.2, 3.4)这个像素点是虚拟存在的,先找到与它临近的四个实际存在的像素点
  (1,3) (2,3)
  (1,4) (2,4)
  写成f(i+u,j+v)的形式,则u=0.2,v=0.4, i=1, j=3
  在沿着X方向差插值时,f(R1)=u(f(Q21)-f(Q11))+f(Q11)
  沿着Y方向同理计算。
  或者,直接整理一步计算,f(i+u,j+v) = (1-u)(1-v)f(i,j) + (1-u)vf(i,j+1) + u(1-v)f(i+1,j) + uvf(i+1,j+1) 。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值