【CV】图像插值算法

插值的定义

设函数 y=f(x)y=f(x) 在区间[a,b][a,b]上有定义,且已知在点ax0<x1<<xnba≤x_0<x_1<…<x_n≤b上的值为y0,y1,,yny_0,y_1,…,y_n ,若存在简单函数P(x)P(x)使得 P(xi)=yi(i=0,1,,n) P(x_i)=y_i (i=0,1,…,n)

成立,就称P(x)P(x)f(x)f(x)的插值函数, x0,x1,,xnx_0,x_1,…,x_n称为插值节点,包含插值节点的区间[a,b][a,b]称为插值区间,求插值函数P(x)P(x)的方法就是插值法。

有时,在图像的几何变换中,比如缩放和旋转,输出图像上的像素点坐标有可能对应于原图像上几个像素点之间的位置,这个时候就需要通过灰度插值处理来计算出该输出点的灰度值。

常用的图像插值算法可以分为

  • 最近邻插值 – Nearest-neighbor interpolation – nearest
  • 双线性插值 – Bilinear interpolation – bilinear
  • 立方卷积插值 – Bicubic interpolation –bicubic

最近邻插值法 (Nearest-neighbor interpolation)

最简单的插值方法是最近邻插值,即选择离它所映射到的位置最近的输入像素的灰度值为插值结果。若几何变换后输出图像上坐标为xy(x,y)的像素点在原图像上的对应值坐标为uv(u,v),则近邻插值公式为:

KaTeX parse error: No such environment: equation at position 7: \begin{̲e̲q̲u̲a̲t̲i̲o̲n̲}̲ \left\{ \begin…

最邻近元法计算量较小,但可能会造成插值生成的图像灰度上的不连续,在灰度变化的地方可能出现明显的锯齿状。

双线性插值(Bilinear interpolation)

(x,y)(x,y)的点对应于原图像上的坐标为 (u,v)(u,v) 附近,如下图所示
【CV】图像插值算法

(x,y)(x,y)周围的四点存入二维数组a[2][2]a[2][2],并令u=0u=0v=1v=1,简化后可以得到双线性插值公式:

  • xx 方向上的线性插值 $ G_x = (1-x)a[0][0] + xa[1][0] $
  • yy 方向上的线性插值 $ G_y = (1-y)a[0][1] + ya[1][1] $
  • 临近4点同时线性插值 G=(1x)(1y)a[0][0]+x(1y)a[1][0]+(1x)ya[0][1]+xya[1][1]G = (1-x)*(1-y)*a[0][0] + x*(1-y)*a[1][0] + (1-x)*y*a[0][1]+x*y*a[1][1]

示例图如下:

【CV】图像插值算法

相比邻近插值,双线性插值计算上比邻近插值复杂,但是在图像的边缘上明显要优于邻近插值运算的结果。

立方卷积插值 – Bicubic interpolation

该方法利用三次多项式S(x)S(x)求逼近理论上最佳插值函数sin(x)x\frac {\sin (x)}x, 其数学表达式为:

S(x)={12x2+x3(x<1)48x+5x2x3(1x<2)0(x2)S(x)=\left\{ \begin {aligned} & 1-2*\vert x \vert ^2 + \vert x \vert ^3 \qquad (\vert x \vert \lt 1) \\ & 4- 8*\vert x \vert + 5*\vert x \vert ^2 - \vert x \vert ^3 \qquad ( 1 \le \vert x \vert \lt 2) \\ & 0 \qquad (\vert x \vert \ge 2) \end{aligned} \right.

目标像素的灰度值由邻近16个像素点的加权插值得到:
【CV】图像插值算法
具体运算过程为:

g(x,y)=f(u,v)=ABCA=[s(1+u)  s(u)  s(1u)  s(2u)]C=[s(1+v)  s(v)  s(1v)  s(2v)]TB=[f(i1,j1)f(i1,j)f(i1,j+1)f([u1],j+2)f(i,j1)f(i,j)f(i,j+1)f(i,j+2)f(i+1,j1)f(i+1,j)f(i+1,j+1)f(i+1,j+2)f(i+2,j1)f(i+2,j)f(i+2,j+1)f(i+2,j+2)]g(x^{'}, y^{'})=f(u,v)=ABC \\ A=[s(1+u) \ \ s(u) \ \ s(1-u) \ \ s(2-u)]\\ C=[s(1+v) \ \ s(v) \ \ s(1-v) \ \ s(2-v)]^T\\ B= \left[ \begin{matrix} f(i-1,j-1) & f(i-1,j) & f(i-1,j+1) & f([u-1],j+2) \\ f(i,j-1) & f(i,j) & f(i,j+1) & f(i,j+2)\\ f(i+1,j-1) & f(i+1,j) & f(i+1,j+1) & f(i+1,j+2)\\ f(i+2,j-1) & f(i+2,j) & f(i+2,j+1) & f(i+2,j+2) \end{matrix} \right]

基于双线性插值,考虑最近的 4x44x4已知像素点 —总共1616个像素点。由于离待插像素点的距离不同, 在计算中距离近的像素给出的权重较大。双三次产生的图像比前两次的尖锐,有理想的处理时间和输出质量。因此,在很多图像编辑程序中是标准算法 (包括 Adobe Photoshop), 打印机和相机插值。

Ref