双线性插值是啥?

前言

今天看FASTER RCNN的pytorch实现源码,进行图像缩放时用到了双线性插值算法,记录一下自己的理解。

目的

当将一幅图像从100x100的尺寸放大到200x200时,势必要新增30000个像素点。那么这些新增的像素点的灰度值如何得到呢?

原理

双线性插值的做法是这样:

1. 建立坐标的对应关系

将放大前的图像A和放大后的图形B的几何中心对齐,然后有

如果按照上面公式计算出来是整数,就直接将原图中的对应位置的灰度值复制过来。如果是小数,说明原图像中没有对应点,就将x/y分别向上/下取整得到4个坐标。

其实也无所谓,一律按照下面方法计算即可,只不过是整数的时候取得是两个相同灰度值的均值,也就是还是他自己罢了。省的在这讨论,x整数y小数,x小数y整数这些问题了。

2. 用A上4个对应像素点的灰度值计算B上1个像素点的灰度值

双线性插值说白了就是先将这4个点分成两组在一个方向上进行线性插值,得到两个中间值,然后用这两个中间值再进行一次线性插值,得到最终结果。

即,先有

然后,有

其中,P为所求的B上$(x_B, y_B)$处的灰度值,$(x,y)$就是上面的$(x_A, y_A)$,四个Q就是A上四个对应像素点的灰度值,R为中间值。