图像尺度的放大,缩小是图形学中一个十分常见的问题。然而这个过程并不是无损的,缩放的过程是一个非线性的过程,因此存在许多算法在效率,平滑度,清晰度和速度上进行一些权衡(trade-off)。在图形的缩放过程中,存在插值,采样等一些关键的步骤,下面对一些在图像缩放过程中使用的算法进行简要的介绍,这些算法均有其优缺点。

参考资料:https://clouard.users.greyc.fr/Pantheon/experiments/rescaling/index-en.html#bicubic

问题定义

在处理图片的缩放问题时,需要解决的问题是:

  • 在放大过程中,新增的像素的颜色如何确定。
  • 在缩小过程中,哪些像素需要被保留。

图形缩放

下面用一个1D的问题举例,如下图,y轴表示灰度图的灰度值:

现在对这个图形进行进行放大,有两种做法:

  1. 使用最近邻方法,用左边的像素填补这个位置的像素

  1. 使用线性插值的方法,利用前后位置的像素值生成该位置上的像素

将这个问题一般化,我们通过引入卷积来完成这个操作。例如对于最近邻方法,可以使用[1,1,0]卷积核,对于插值法,可以使用[0.5,1,0.5]卷积核。


与上述思路相同,我们将卷积核推广到2D的情况,同时在x和y方向上做卷积,各个像素的取值由卷积权重决定。

Nearest Neighbor Resampling(最近邻采样)

用这种方式得到的图像块状比较明显,但是这种方法执行效率最快。

Bilinear Resampling (B-spline order 1) (双线性插值)

上诉公式是沿着x方向的线性差值的值,对于y方向同样用这种方式进行插值。

Bicubic Resampling (双三次插值)

该方法需要选取的最近的16个像素点作为计算目标图像B(X,Y)处像素值的参数。每个位置的权重与像素值,以及像素的变化率有关。当a取-0.5是,bicubic函数有以下的形状:

该算法在各中图像的缩放过程中使用的最多。其中心点像素计算公式如下:
$$
\sum_{i=0}^{3} \sum_{j=0}^{3} a_{i j} x^{i} y^{j}
$$
其中参数a需要根据临近的四个点的像素值,偏导数等等来计算。具体的计算过程可以看wiki上的解释


最后

在处理具体问题时,我们知道一张图片在显示屏上是以点阵的方式排列的。当我们要放大,或者缩小时,例如用双三次插值时,对于每个像素点,无论是放大还是缩小,我们总能找到最邻近的16个位置,可以很方便的对图片进行缩放。此外,用卷积的方式进行求解,能够并行对图片进行处理,提高图片的处理效率。