https://blog.csdn.net/gzhermit/article/details/75261713
在Fully Convolutional Networks for Semantic Segmentation这篇文章中,介绍到Bilinear Upsampling这种上菜样的方式,虽然文章最后用的是deconvolution,给出的理由就是不希望upsampling filter是固定的= =! 但是碰到了还是学习记录一下。因为以前用的upsampling的方式是很简单的,比如放大两倍,就是把一个像素点复制一下变成四个。这样的做法会导致图像变得模糊。
线性插值
在介绍双线性插值前,先介绍一下线性插值。
已知A=(x0,y0),B=(x1,y1)A=(x0,y0),B=(x1,y1),那么求C=(x,y)C=(x,y)。已知xx,求yy。
∵ ∴ y1−yx1−x=y−y0x−x0y=y0+(y1−y)x1−x(x−x0)=x−x0x1−x0y1+x1−xx1−x0y0
∵ y1−yx1−x=y−y0x−x0∴ y=y0+(y1−y)x1−x(x−x0)=x−x0x1−x0y1+x1−xx1−x0y0
其实说白了就很简单,就是两点确定一条线,然后在这条线上知道了xx,自然可以推出yy。同样的,已知yy的话,自然也可以推导出xx。
双线性插值
在图像中,我们面对的往往是两维,甚至三维(包含channel)的图像,那么,在进行upsampling的时候我们就要用到双线性插值和三线性插值。
所谓双线性插值,原理和线性插值相同,并且也是通过使用三次线性插值实现的。首先看图。
假设已知点Q11=(x1,y1),Q12=(x1,y2),Q21=(x2,y1),Q22=(x2,y2)Q11=(x1,y1),Q12=(x1,y2),Q21=(x2,y1),Q22=(x2,y2),并且假设图像中每个像素点服从一个未知函数ff,使得像素值R11=f(Q11)R11=f(Q11),以此类推。那么如何求出点P=(x,y)P=(x,y)的像素值RPRP呢?
首先做两次线性插值,分别求出点R1=(x,y1)R1=(x,y1)和点R2=(x,y2)R2=(x,y2)的像素值,然后再用这两个点再做一次线性插值,就可以求出点P=(x,y)P=(x,y)的像素值了。可能会有疑问是说,现在在二维平面上,一个点的位置是由两个坐标共同控制的,那么怎么使用线性插值呢?举个例子,对于Q11Q11和Q21Q21来说,它们连成的线的纵坐标都是相同的,那么我们就忽略掉这个纵坐标带来的影响(但这个影响是存在的,所以我们这个线性插值是近似),而用当前点的像素值直接代替掉纵坐标。那么Q11=(x1,f(Q11))Q11=(x1,f(Q11))
f(R1)f(R2)f(P) ≈x−x1x2−x1f(Q21)+x2−xx2−x1f(Q11), R1=(x,y1)≈x−x1x2−x1f(Q22)+x2−xx2−x1f(Q12), R2=(x,y2)≈y−y1y2−y1f(R2)+y2−yy2−y1f(R1)
f(R1)≈x−x1x2−x1f(Q21)+x2−xx2−x1f(Q11), R1=(x,y1)f(R2)≈x−x1x2−x1f(Q22)+x2−xx2−x1f(Q12), R2=(x,y2)f(P) ≈y−y1y2−y1f(R2)+y2−yy2−y1f(R1)
写成矩阵乘的形式:
f(P)≈[y−y1y2−y1y2−yy2−y1][f(Q22)f(Q22)f(Q12)f(Q12)][x−x1x2−x1x2−xx2−x1]
f(P)≈[y−y1y2−y1y2−yy2−y1][f(Q22)f(Q12)f(Q22)f(Q12)][x−x1x2−x1x2−xx2−x1]
这样的话,产生的新图像的效果更好,过渡更自然,边缘也更为光滑。
三线性插值
三线性插值原理同双线性插值,不再赘述。
---------------------
作者:GZHermit
来源:CSDN
原文:https://blog.csdn.net/gzhermit/article/details/75261713
版权声明:本文为博主原创文章,转载请附上博文链接!
网友评论