「解析」双线性插值

在介绍双线性插值之前,我们先解释下 插值:百科的定义是插值是离散函数逼近的重要方法,利用函数通过的有限点的取值状况,估算出函数在临近处的近似值。
在图像领域,插值就是用来填充 图像变换时像素之间的空隙。插值算法有许多种,双线性插值只是其中一种。

线性插值

根据百科的介绍:线性插值是指插值函数为一次多项式的插值方式。线性插值的几何意义即为利用过A点和B点的 直线( y = k x + b ) (y=kx+b)(y =k x +b ) 来近似表示原函数。线性插值可以用来近似代替原函数,也可以用来计算得到查表过程中表中没有的数值。

那么如下图所示,假设已知 y 1 = f ( x 0 ) , y 2 = f ( x 1 ) y_1=f(x_0) , y_2=f(x_1)y 1 ​=f (x 0 ​),y 2 ​=f (x 1 ​) ,现在要通过线性插值的方式得到区间 [ x 0 , x 1 ] [x_0, x_1][x 0 ​,x 1 ​] 内任何一点的f ( x ) f(x)f (x )值。

「解析」双线性插值

y ′ − y 1 x ′ − x 1 = y 2 − y 1 x 2 − x 1 \frac{y’-y_1}{x’-x_1} = \frac{y_2-y_1}{x_2-x_1}x ′−x 1 ​y ′−y 1 ​​=x 2 ​−x 1 ​y 2 ​−y 1 ​​

变换得:

y ′ = x 2 − x ′ x 2 − x 1 y 1 + x ′ − x 1 x 2 − x 1 y 2 y’=\frac{x_2-x’}{x_2-x_1}y_1 + \frac{x’-x_1}{x_2-x_1}y_2 y ′=x 2 ​−x 1 ​x 2 ​−x ′​y 1 ​+x 2 ​−x 1 ​x ′−x 1 ​​y 2 ​

; 双线性插值

双线性插值是有两个变量的线性插值算法的扩展,即两个变量分别做一次线性插值。

在此我们以百度百科提供的图作为参考,每个点的数值是由 z = f ( x , y ) z=f(x,y)z =f (x ,y ) 决定的,因此借鉴于线性插值算法,双线性插值,需要通过临近点计算出 ( x ′ , y ′ ) (x’,y’)(x ′,y ′) ,

「解析」双线性插值

放在二维俯视图上,如下图所示

「解析」双线性插值

⚠️注意:线性插值的结果与插值的顺序无关。
首先进行y方向的插值,然后进行x方向的插值,所得到的结果是一样的。双线性插值的结果与先进行哪个方向的插值无关。

在此以 先进行 x方向插值,再y方向插值为例:

  1. X方向的线性插值,Q11,Q21 中插入蓝色点R1,在 Q12,Q22 中插入蓝色点R2;
  2. Y方向的线性插值,通过第一步计算出的 R1与R2 在y方向上插值计算出P点。

由线性插值算法可以得到,R 1 R_1 R 1 ​ 的值为 :
f ( R 1 ) = f ( x , y 1 ) = x 2 − x x 2 − x 1 f ( Q 11 ) + x − x 1 x 2 − x 1 f ( Q 21 ) f(R_1)=f(x,y_1) \qquad\qquad\qquad\qquad\qquad\qquad \quad\ =\frac{x_2-x}{x_2-x_1}f(Q_{11}) + \frac{x-x_1}{x_2-x_1}f(Q_{21})f (R 1 ​)=f (x ,y 1 ​)=x 2 ​−x 1 ​x 2 ​−x ​f (Q 1 1 ​)+x 2 ​−x 1 ​x −x 1 ​​f (Q 2 1 ​)

同理,R 2 R_2 R 2 ​ 的值为:
f ( R 2 ) = f ( x , y 2 ) = x 2 − x x 2 − x 1 f ( Q 12 ) + x − x 1 x 2 − x 1 f ( Q 22 ) f(R_2)=f(x,y_2) \qquad\qquad\qquad\qquad\qquad\qquad \quad\ =\frac{x_2-x}{x_2-x_1}f(Q_{12}) + \frac{x-x_1}{x_2-x_1}f(Q_{22})f (R 2 ​)=f (x ,y 2 ​)=x 2 ​−x 1 ​x 2 ​−x ​f (Q 1 2 ​)+x 2 ​−x 1 ​x −x 1 ​​f (Q 2 2 ​)

得到R 1 , R 2 R_1, R_2 R 1 ​,R 2 ​ 的插值之后,再通过一次线性插值计算 P P P 点的插值。
f ( P ) = f ( x , y ) = y 2 − y y 2 − y 1 f ( R 1 ) + y − y 1 y 2 − y 1 f ( R 2 ) f(P)=f(x,y) \qquad\qquad\qquad\qquad\qquad\qquad \ =\frac{y_2-y}{y_2-y_1}f(R_1) + \frac{y-y_1}{y_2-y_1}f(R_2)f (P )=f (x ,y )=y 2 ​−y 1 ​y 2 ​−y ​f (R 1 ​)+y 2 ​−y 1 ​y −y 1 ​​f (R 2 ​)

将上面的 R 1 , R 2 R_1, R_2 R 1 ​,R 2 ​ 代入上式,得:
f ( P ) = f ( x , y ) = ( x 2 − x ) ( y 2 − y ) ( x 2 − x 1 ) ( y 2 − y 1 ) f ( Q 11 ) + ( x − x 1 ) ( y 2 − y ) ( x 2 − x 1 ) ( y 2 − y 1 ) f ( Q 21 ) + ( x 2 − x ) ( y − y 1 ) ( x 2 − x 1 ) ( y 2 − y 1 ) f ( Q 12 ) + ( x − x 1 ) ( y − y 1 ) ( x 2 − x 1 ) ( y 2 − y 1 ) f ( Q 22 ) f(P)=f(x,y) \qquad \qquad \qquad \qquad \qquad\qquad\qquad\qquad\qquad\qquad\qquad \ =\frac{(x_2-x)(y_2-y)}{(x_2-x_1)(y_2-y_1)}f(Q_{11}) + \frac{(x-x_1)(y_2-y)}{(x_2-x_1)(y_2-y_1)}f(Q_{21}) \ + \frac{(x_2-x)(y-y_1)}{(x_2-x_1)(y_2-y_1)}f(Q_{12}) + \frac{(x-x_1)(y-y_1)}{(x_2-x_1)(y_2-y_1)}f(Q_{22})f (P )=f (x ,y )=(x 2 ​−x 1 ​)(y 2 ​−y 1 ​)(x 2 ​−x )(y 2 ​−y )​f (Q 1 1 ​)+(x 2 ​−x 1 ​)(y 2 ​−y 1 ​)(x −x 1 ​)(y 2 ​−y )​f (Q 2 1 ​)+(x 2 ​−x 1 ​)(y 2 ​−y 1 ​)(x 2 ​−x )(y −y 1 ​)​f (Q 1 2 ​)+(x 2 ​−x 1 ​)(y 2 ​−y 1 ​)(x −x 1 ​)(y −y 1 ​)​f (Q 2 2 ​)

图像中的双线性插值

接触图像处理的小伙伴可能经常遇到图像放大等操作,即图像的上采样处理,此时很大一部分采用的便是双线性插值算法。

「解析」双线性插值

在图像中,双线性插值算法一般采用最邻近的4个像素点,因此x 2 − x 1 = 1 , y 2 − y 1 = 1 x_2-x_1=1, y_2-y_1=1 x 2 ​−x 1 ​=1 ,y 2 ​−y 1 ​=1,并且设 x − x − 1 = u , y − y 1 = v x-x-1=u, y-y_1=v x −x −1 =u ,y −y 1 ​=v,因此上述公式可以简化为:
f ( P ) = ( 1 − u ) ( 1 − v ) f ( Q 11 ) + u ( 1 − v ) f ( Q 21 ) + ( 1 − u ) v f ( Q 12 ) + u v f ( Q 22 ) f(P)=(1-u)(1-v)f(Q_{11}) + u(1-v)f(Q_{21}) \ \qquad \quad+(1-u)vf(Q_{12})\quad \quad + \quad uvf(Q_{22}) \qquad f (P )=(1 −u )(1 −v )f (Q 1 1 ​)+u (1 −v )f (Q 2 1 ​)+(1 −u )v f (Q 1 2 ​)+u v f (Q 2 2 ​)

; Pytorch 实现

在 Pytorch 中的 Upsample 算法,其实内部实现算法便是双线性插值处理即 'bilinear' 模式

import torch.nn.functional as F

F.interpolate(x, size=input_shape, mode='bilinear', align_corners=False)

mode (str) –
algorithm used for upsampling: 'nearest' | 'linear' | 'bilinear' |
'bicubic' | 'trilinear' | 'area' | 'nearest-exact'.

Default: 'nearest'

参考:

  • https://blog.csdn.net/qq_37541097/article/details/112564822

Original: https://blog.csdn.net/ViatorSun/article/details/124517707
Author: ViatorSun
Title: 「解析」双线性插值

原创文章受到原创版权保护。转载请注明出处:https://www.johngo689.com/645387/

转载文章受原作者版权保护。转载请注明原作者出处!

(0)

大家都在看

亲爱的 Coder【最近整理,可免费获取】👉 最新必读书单  | 👏 面试题下载  | 🌎 免费的AI知识星球