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

图像超分辨——基于插值的方法(个人总结)基于插值的单图超分辨方法包括 Nearest 最近邻插值 Bilinear 双线性插值 Bicubic 三线性插值 Lanczos 等

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

lena (PSNR/SSIM)

lena x4

Nearest(最近邻插值):

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

nearest (27.811/0.785)

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

Bilinear(双线性插值): 

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

红色表示原始数据点,绿色表示插值点

函数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方向上进行线性插值,得到 

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

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

bilinear(29.299/0.825)

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

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

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

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的值。

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

参考:维基百科,Bicubic介绍及Python实现_python bicubic-CSDN博客,双三次插值(BiCubic插值)_双三次插值bicubic的xyzw和luma分别是什么-CSDN博客,【图像处理】双三次插值(Bicubic interpolation)原理及matlab简易版代码_双三次插值(bicubic interpolation)降采样的代码-CSDN博客,双三次插值算法(bicubic interpolation)与图形学和计算方法的关系-CSDN博客

今天的文章 图像超分辨——基于插值的方法(个人总结)分享到此就结束了,感谢您的阅读。
编程小号
上一篇 2025-01-01 14:01
下一篇 2025-01-01 13:57

相关推荐

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。
如需转载请保留出处:https://bianchenghao.cn/bian-cheng-ji-chu/98716.html