在图像处理过程中,对图像的缩放操作至关重要。当我们在存储图片时,其实是以矩阵的形式存在的。当我们对图像进行缩放时,实际上是在对矩阵进行操作。若想放大图片,我们需要用到过采样算法来扩大矩阵;若想缩小图片,则使用欠采样算法。
如上图所示,左图为原始图像矩阵,右图为扩大后的图像矩阵。右图中的橙色点表示矩阵扩大后通过插值算法填充的像素值。这篇文章我们将深入探讨如何通过插值算法来填充像素值。
在OpenCV中,提供了一个resize函数,用于调整图像的大小,该函数内提供了多种插值算法。下面我们将详细介绍最常用的前五种插值算法。后两种插值算法主要应用于仿射变换中。
为了方便观察不同插值算法之间的区别,我们可以随机生成一个5×5的图片,然后通过不同的插值算法将其放大10倍来对比最终图片的效果。
如果感觉灰度图不够直观,我们可以通过设置plt.imshow的cmap参数来控制颜色。matplotlib提供了几种不同的色彩映射方式,如Sequential、Diverging、Cyclic等。
最近邻插值是一种简单的一维或空间上的插值方法。它选择距离所求数据点最近点的值,而不考虑其他相邻点的值。当插入的值距离四个点都相等时,最近邻插值会选择距离最近的左上角的值作为其值。
线性插值是resize函数中默认使用的插值算法。双线性插值是对线性插值在二维坐标系上的扩展。它的核心思想是在两个方向上分别进行一次线性插值。
再来看双三次插值,这是一种更加复杂的插值算法,是二维空间中最常用的插值算法。它能使图像边缘更加平滑。双三次插值通过矩形网格中最近的十六个采样点的加权平均来计算函数在点(x,y)的值。
对于区域插值算法,它在缩小和放大图像时的工作原理有所不同。当缩小图像时,如果缩小的比例是整数倍,会采用不同的插值算法根据具体情况进行计算;当放大图像时,如果放大的比例不是整数倍,则会采用线性插值。
Lanczos插值是一种模板算法,需要根据计算模板中的权重信息来计算x对应的值。根据权重信息,再结合具体数值即可求出对应的加权平均。
不同的插值算法在缩放因子不同时耗时会有所区别。如果要缩小图像,推荐使用INTER_AREA插值效果最好;如果要放大图像,INTER_CUBIC效果虽好但速度较慢,可以考虑使用速度较快、效果也还不错的INTER_LINEAR。
参考链接:
2. zh.//%E7%BA%BF%E6%80%A7%E6%8F%92%E5%80%BC
3. 其他相关链接(略)