基于插值的单图超分辨方法包括:Nearest(最近邻插值)、Bilinear(双线性插值)、Bicubic(双三线性插值)、Lanczos等。
本文实验基于Matlab,以下是Matlab中resize函数中对插值方法的说明:
% To control the interpolation method used by IMRESIZE, add a METHOD
% argument to any of the syntaxes above, like this:
%
% IMRESIZE(A, SCALE, METHOD)
% IMRESIZE(A, [NUMROWS NUMCOLS], METHOD)
%
% METHOD can be a string naming a general interpolation method:
%
% 'nearest' - nearest-neighbor interpolation
%
% 'bilinear' - bilinear interpolation
%
% 'bicubic' - cubic interpolation; the default method
%
% METHOD can also be a string naming an interpolation kernel:
%
% 'box' - interpolation with a box-shaped kernel
%
% 'triangle' - interpolation with a triangular kernel
% (equivalent to 'bilinear')
%
% 'cubic' - interpolation with a cubic kernel
% (equivalent to 'bicubic')
%
% 'lanczos2' - interpolation with a Lanczos-2 kernel
%
% 'lanczos3' - interpolation with a Lanczos-3 kernel
lena的原始图像为512×512,lena x4为1/4原图的低分辨图像,使用插值方法重构为与原始图像同样尺寸的超分图像,PSNR/SSIM均在RGB空间得到。


Nearest(最近邻插值):
维基百科: 最近邻插值算法选择距离所求数据点最近点的值,并且根本不考虑其他相邻点的值,从而产生一个分段常数的内插值来作为所求数据点的值。

最近邻插值方法直接使用位置最近的像素填充缺失像素,所以会出现小方块(锯齿)效应。
Bilinear(双线性插值):
维基百科:双线性插值,又称双线性内插。在数学上,双线性插值是对线性插值在二维直角网格上的扩展,用于对双变量函数(例如和
)进行插值,其核心思想是在两个方向分别进行一次线性插值。方法:如下图所示,假设要得到未知函数
在点
的值,我们已知

函数在
,
,
及
四个点的值。首先在
方向上进行线性插值,得到
然后在方向进行线性插值,得到
如果先在 方向插值,再在
方向插值,其结果与按照上述顺序双线性插值的结果是一样的。

双线性插值没有最近邻的锯齿效应,像素基本都是连续的,但比较模糊。
Bicubic(双三线性插值方法):
维基百科:在数值分析这个数学分支中,双三次插值是二维空间中最常用的插值方法。在这种方法中,函数在点
的值可以通过矩形网络中最近的16个采样点的加权平均得到,在这里需要使用两个多项式插值三次函数,每个方向使用一个。

要获得超分图像中位置的像素值,需要先按缩放因子找到
在低分辨率图像中的位置
。然后基于与
位置最近邻的4×4矩阵中的16个像素进行
位置的像素插值。插值函数:
计算插值像素:
也可表示为矩阵形式:
因为要以4×4的矩阵进行计算,考虑到图像边框上的像素点,使用边框像素为低分辨率图像外围填充像素(类似深度学习中的padding),共填充4行4列。所以与
的关系为
,其中
为缩放因子,
和
也有同样的关系。由
和
得到
和
的值。
双三次插值方法计算量比较大,但效果相对较好。
参考:维基百科,Bicubic介绍及Python实现_python bicubic-CSDN博客,双三次插值(BiCubic插值)_双三次插值bicubic的xyzw和luma分别是什么-CSDN博客,【图像处理】双三次插值(Bicubic interpolation)原理及matlab简易版代码_双三次插值(bicubic interpolation)降采样的代码-CSDN博客,双三次插值算法(bicubic interpolation)与图形学和计算方法的关系-CSDN博客