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

来源:互联网 发布:科技部办公厅关于优化 编辑:程序博客网 时间:2024/06/06 00:19

在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的时候我们就要用到双线性插值和三线性插值。
所谓双线性插值,原理和线性插值相同,并且也是通过使用三次线性插值实现的。首先看图。

这里写图片描述

假设已知点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)的像素值了。可能会有疑问是说,现在在二维平面上,一个点的位置是由两个坐标共同控制的,那么怎么使用线性插值呢?举个例子,对于Q11Q21来说,它们连成的线的纵坐标都是相同的,那么我们就忽略掉这个纵坐标带来的影响(但这个影响是存在的,所以我们这个线性插值是近似),而用当前点的像素值直接代替掉纵坐标。那么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

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

三线性插值

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

阅读全文
1 0