数学(4) 双线性插值(Bilinear Upsampling)

在Fully Convolutional Networks for Semantic Segmentation这篇文章中,介绍到Bilinear Upsampling这种上菜样的方式,虽然文章最后用的是deconvolution,给出的理由就是不希望upsampling filter是固定的= =! 但是碰到了还是学习记录一下。因为以前用的upsampling的方式是很简单的,比如放大两倍,就是把一个像素点复制一下变成四个。这样的做法会导致图像变得模糊。


线性插值

在介绍双线性插值前,先介绍一下线性插值。

已知 A=(x0,y0),B=(x1,y1) ,那么求 C=(x,y) 。已知 x ,求 y

        y1yx1x=yy0xx0y=y0+(y1y)x1x(xx0)=xx0x1x0y1+x1xx1x0y0

其实说白了就很简单,就是两点确定一条线,然后在这条线上知道了 x ,自然可以推出 y 。同样的,已知 y 的话,自然也可以推导出 x

双线性插值

在图像中,我们面对的往往是两维,甚至三维(包含channel)的图像,那么,在进行upsampling的时候我们就要用到双线性插值和三线性插值。
所谓双线性插值,原理和线性插值相同,并且也是通过使用三次线性插值实现的。首先看图。

数学(4) 双线性插值(Bilinear Upsampling)_第1张图片

假设已知点 Q11=(x1,y1),Q12=(x1,y2),Q21=(x2,y1),Q22=(x2,y2) ,并且假设图像中每个像素点服从一个未知函数 f ,使得像素值 R11=f(Q11) ,以此类推。那么如何求出点 P=(x,y) 的像素值 RP 呢?

首先做两次线性插值,分别求出点 R1=(x,y1) 和点 R2=(x,y2) 的像素值,然后再用这两个点再做一次线性插值,就可以求出点 P=(x,y) 的像素值了。可能会有疑问是说,现在在二维平面上,一个点的位置是由两个坐标共同控制的,那么怎么使用线性插值呢?举个例子,对于 Q11 Q21 来说,它们连成的线的纵坐标都是相同的,那么我们就忽略掉这个纵坐标带来的影响(但这个影响是存在的,所以我们这个线性插值是近似),而用当前点的像素值直接代替掉纵坐标。那么 Q11=(x1,f(Q11))

f(R1)f(R2)f(P) xx1x2x1f(Q21)+x2xx2x1f(Q11), R1=(x,y1)xx1x2x1f(Q22)+x2xx2x1f(Q12), R2=(x,y2)yy1y2y1f(R2)+y2yy2y1f(R1)

写成矩阵乘的形式:
f(P)[yy1y2y1y2yy2y1][f(Q22)f(Q22)f(Q12)f(Q12)]xx1x2x1x2xx2x1

这样的话,产生的新图像的效果更好,过渡更自然,边缘也更为光滑。

三线性插值

三线性插值原理同双线性插值,不再赘述。

你可能感兴趣的:(数学)