简介
1.什么是插值
图片放大是图像处理中的一个特别基础的操作。几乎在每一个图片相关的项目中,从传统图像处理到i深度学习,都有应用。
简单来说,插值指利用已知的点来“猜”未知的点,图像领域插值常用在修改图像尺寸的过程,由下图是双线性插值的效果。
2.常用的插值算法
插值算法有很多种,这里列出关联比较密切的三种:
(1)最近邻法(Nearest Interpolation):计算速度最快,但是效果最差。
(2)双线性插值(Bilinear Interpolation):双线性插值是用原图像中4(2x2)个点计算新图像中1个点,效果略逊于双三次插值,速度比双三次插值快,属于一种平衡美,在很多框架中属于默认算法。
(3)双三次插值(Bicubic interpolation):双三次插值是用原图像中16(4x4)个点计算新图像中1个点,效果比较好,但是计算代价过大。
插值算法介绍
2.1最近邻法(Nearest Interpolation)
最近邻算法不需要计算新图像中矩阵中点的数值,直接找到原图像中对应的点,将数值赋值给新图像矩阵中的点,根据对应关系找到原图像中的对应的坐标,这个坐标可能不是整数;这时候找最近的点进行插值。对应关系如下:
上图效果是最近邻法的计算过程示意图,由上图可见,最近邻法只是把最外围的像素复制了一遍。最近邻法不需要计算只需要寻找原图中对应的点,所以最近邻法速度最快,但是会破坏原图像中像素的渐变关系,原图像中的值是渐变的,但是在新图像中局部破坏了这种渐变关系。
2.2 双线性插值对应的关系
双线性插值的对应公式和前面的最近邻法一样,不一样的是根据对应关系不再是找最近的一个点,而是找最近的四个点,如下图所示:
这里我们根据四个点来计算一个点,这一个点是根据单线性插值在两个不同方向上计算出来的。下面先介绍以下单线性插值。
2.2.1 单线性插值
已知图像中P1和P2两个点,坐标分别为 ( x 1 , y 1 ) (x1,y1) (x1,y1)、 ( x 2 , y 2 ) (x2,y2) (x2,y2),要计算 [ x 1 , x 2 ] [x1,x2] [x1,x2]区间内某一位置x在直线上的y值。
根据初中的知识,2点求一条直线公式(这是双线性插值所需要的唯一的基础公式)。
y − y 1 x − x 1 = y 2 − y 1 x 2 − x 1 (1) \frac{y-y_1}{x-x_1}=\frac{y_2-y_1}{x_2-x_1}\tag{1} x−x1y−y1=x2−x1y2−y1(1)
经过简单整理成下面的格式:
y = x 2 − x x 2 − x 1 y 1 + x − x 1 x 2 − x 1 y 2 (2) y=\frac{x_2-x}{x_2-x_1}y_1+\frac{x-x_1}{x_2-x_1}y_2\tag{2} y=x2−x1x2−xy1+x2−x1x−x1y2(2)
这里没有写成经典的AX+B的形式,因为这种形式从权重的角度很好理解。
首先看分子,分子可以看成x与x1和x2的距离作为权重,这也是很好理解的,P点与P1、P2点符合线性变化的关系,所以P离P1近就更接近P1,离P2近就更接近P2。
现在再把公式中的分式看作是一个整体,原式可以理解成y1和y2的加权系数,如何理解这个加权系数呢,要返回来思考一下,先明确根本目的:我们是要在图像中根据两个已知的像数值求未知点的像数值。这样一个公式是不满足写代码的需求的,图中的y1和y2分别代表原图像中的像素值,上面的公式可以写成如下格式。
f ( P ) = x 2 − x x 2 − x 1 f ( P 1 ) + x − x 1 x 2 − x 1 f ( P 2 ) (3) f(P)=\frac{x_2-x}{x_2-x_1}f(P_1)+\frac{x-x_1}{x_2-x_1}f(P_2)\tag{3} f(P)=x2−x1x2−xf(P1)+x2−x1x−x1f(P2)(3)
2.2.2 双线性插值
已知 Q 11 ( x 1 , y 1 ) 、 Q 12 ( x 1 , y 2 ) 、 Q 2 , 1 ( x 2 , y 1 ) 、 Q 22 ( x 2 , y 2 ) Q_{11}(x_1,y_1)、Q_{12}(x_1,y_2)、Q_{2,1}(x_2,y_1)、Q_{22}(x_2,y_2) Q11(x1,y1)、Q12(x1,y2)、Q