图像超分辨——基于插值的方法(个人总结)

基于插值的单图超分辨方法包括: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空间得到。

 

图像超分辨——基于插值的方法(个人总结)_第1张图片 lena (PSNR/SSIM)

 

图像超分辨——基于插值的方法(个人总结)_第2张图片 lena x4

Nearest(最近邻插值):

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

图像超分辨——基于插值的方法(个人总结)_第3张图片 nearest (27.811/0.785)

 最近邻插值方法直接使用位置最近的像素填充缺失像素,所以会出现小方块(锯齿)效应。

Bilinear(双线性插值): 

维基百科:双线性插值,又称双线性内插。在数学上,双线性插值是对线性插值在二维直角网格上的扩展,用于对双变量函数(例如xy)进行插值,其核心思想是在两个方向分别进行一次线性插值。方法:如下图所示,假设要得到未知函数f在点P=(x,y)的值,我们已知

图像超分辨——基于插值的方法(个人总结)_第4张图片 红色表示原始数据点,绿色表示插值点

函数fQ_{11}=(x_1,y_1)Q_{12}=(x_1,y_2)Q_{21}=(x_2,y_1)Q_{22}=(x_2,y_2)四个点的值。首先在x方向上进行线性插值,得到 

图像超分辨——基于插值的方法(个人总结)_第5张图片

 然后在y方向进行线性插值,得到

图像超分辨——基于插值的方法(个人总结)_第6张图片

如果先在 y方向插值,再在x方向插值,其结果与按照上述顺序双线性插值的结果是一样的。

 

图像超分辨——基于插值的方法(个人总结)_第7张图片 bilinear(29.299/0.825)

 双线性插值没有最近邻的锯齿效应,像素基本都是连续的,但比较模糊。

Bicubic(双三线性插值方法):

维基百科:在数值分析这个数学分支中,双三次插值是二维空间中最常用的插值方法。在这种方法中,函数f在点(x,y)的值可以通过矩形网络中最近的16个采样点的加权平均得到,在这里需要使用两个多项式插值三次函数,每个方向使用一个。

图像超分辨——基于插值的方法(个人总结)_第8张图片 bicubic(30.237/0.842)

要获得超分图像中位置P(X,Y)的像素值,需要先按缩放因子找到P(X,Y)在低分辨率图像中的位置p(i,j)。然后基于与p位置最近邻的4×4矩阵中的16个像素进行P位置的像素插值。插值函数:

                                                  W(x)=\begin{cases} (a+2)\lvert x \lvert^3 - (a+3)\lvert x \lvert^2 + 1 & \lvert x \lvert\leq 1 \\ a\lvert x \lvert^3 - 5\lvert x \lvert^2 + 8a\lvert x \lvert-4a & 1<\lvert x \lvert< 2 \\ 0 & others \end{cases}

计算插值像素:

                                            P(X,Y)=\sum_{n=-1}^2\sum_{m=-1}^2p(n+j,m+i)\times W(u-m) \times W(v-n)

也可表示为矩阵形式:

A=\begin{bmatrix} W(u+1) & W(u) & W(u-1) & W(u-2) \end{bmatrix}

C=\begin{bmatrix} W(v+1) & W(v) & W(v-1) & W(v-2) \end{bmatrix}

B=\begin{bmatrix} p(j-1,i-1) & p(j-1,i) & p(j-1,i+1) & p(j-1,i+2)\\ p(j,i-1) & p(j,i) & p(j,i+1) & p(j,i+2)\\ p(j+1,i-1) & p(j+1,i) & p(j+1,i+1) & p(j+1,i+2)\\ p(j+2,i-1) & p(j+2,i) & p(j+2,i+1) & p(j+2,i+2) \end{bmatrix}

P(X,Y)=CBA^T

因为要以4×4的矩阵进行计算,考虑到图像边框上的像素点,使用边框像素为低分辨率图像外围填充像素(类似深度学习中的padding),共填充4行4列。所以Xi的关系为\lfloor X/factor \rfloor +2=i,其中factor为缩放因子,Yj也有同样的关系。由u=(X\%factor)/factorv=(Y\%factor)/factor得到uv的值。

双三次插值方法计算量比较大,但效果相对较好。

参考:维基百科,https://blog.csdn.net/yycocl/article/details/102588362,https://blog.csdn.net/qq_34885184/article/details/79163991,https://blog.csdn.net/sinat_31987445/article/details/88870757?utm_medium=distribute.pc_relevant.none-task-blog-BlogCommendFromMachineLearnPai2-2.nonecase&depth_1-utm_source=distribute.pc_relevant.none-task-blog-BlogCommendFromMachineLearnPai2-2.nonecase,https://blog.csdn.net/nandina179/article/details/85330552

 

你可能感兴趣的:(计算机视觉,#,--图像超分辨,-----计算机视觉)