当我们进行图像缩放的时候,我们就需要用到插值算法。常见的插值有:
- 最邻近插值
- 双线性插值
- 双立方(三次)插值
在这三种算法中,双立方(三次)插值最为复杂,效果也最好。在之前的文章中,我们介绍过最邻近插值和双向性插值。接下来我们来介绍下双立方(三次)插值的原理。
数学原理
用双立方插值得到的结果图上的某个像素是由原图上的16个像素值进行加权平均得到。所以接下来关键点就是如何求解对应的16个像素位置以及各自的系数。
如上图所示,当我们求出结果图某个像素对应于原图的像素P00时(映射点),其他的15个像素位置就知道了。
首先,我们通过计算得到原图的映射点坐标:
如上图所示,如果我们的结果图的坐标为(distI, distJ)求出对应的映射点坐标是(i+u, j+v)。其中u,v可能为负。(i,j)为坐标(i+u,j+v)离得最近的整数坐标。比如(1.1,2.8)就是对应(1, 3)。即i=1,j=3,u和v分别0.1和-0.2。至此,我们就知道了所有16个点的位置(即(i, j)就对应于图一16个点中的P00点)。因此,16个点的横、纵坐标的取值范围分别是[i-1, i+2], [j-1, j+2]。接下来就是16个像素值各自对应的加权系数了。
采样公式:
其中可以 a 为常数。选取不同的 a 可以用来逼近不同的样条函数。
当 a 取值为 -1 时,公式如下:
此时逼近的函数为:
y = sin(Pi * x) / (Pi * x)
当 a 取值为 -0.5 时,公式如下:
此时逼近三次样条函数。
最后,我们将所有的像素点乘以其对应的系数并加权相加就得到我们最后所求点的像素值。公式如下: