OpenCV中resize()函数的插值方式对比 - CodeAntenna

在进行图像缩放过程中,opencv中的resize函数是最常用的,其速度相对较快,只需要一行代码即可。此函数中提供5种缩放插值的方法。在下文中将进行对比。

1、resize函数简介

void resize(InputArray src, OutputArray dst, Size dsize, double fx=0, double fy=0, int interpolation=INTER_LINEAR );

参数含义

opencvresize opencv resize 插值方法_插值

 

2、算法对比


算法

INTER_NEAREST

INTER_LINEAR

INTER_CUBIC

INTER_LANCZOS4

INTER_AREA

主要思想

用距离采样点最近的像素值最为采样点的灰度值

用双线性方式计算采样点周围的4个点,计算其灰度值

根据采样点的周围16个像素值的双线性关系以及像素变化率,计算出采样点的灰度值

在x,y方向分别对相邻的八个点进行插值,也就是计算加权和,傅立叶变换有关的三角函数的方法

使用像素区域关系进行重采样,图像放大时类似于双线性插值,缩放时类似于最近邻插值

锯齿现象

不可避免

可避免

可避免

可避免

可避免

周围像素

未考虑

未考虑

已考虑

已考虑

已考虑

速度

最快

较快

一般

较慢

最慢


  1. 为考虑图像的分辨率,尤其是INTER_AREA、INTER_CUBIC和INTER_LANCZOS4插值,图像分辨率的大小对其有一定的影响,一般情况INTER_AREA效率低一些;
  2. 算法运行过程中,opencv内部进行了优化,所以实际时间有些许波动;
  3. 测试过程中,硬件设备的干扰;

3、总结

    如果缩小图像,INTER_AREA插值效果最好,而且可以有效防止产生波纹现象,如果放大图像,通常使用INTER_CUBIC或是INTER_LANCZOS4,此两种方法速度较慢,但效果相对较好。尽管INTER_NEAREST算法相当快,但使其效果大打折扣,一般很少使用。
    值得注意的是INTER_LINEAR速度较快,效果一般,其会抑制图像信号中的高频分量(即图像边缘会变模糊)。对于要求不高的场景,可以考虑此算法,但是如果需要最大限度的保留图像中的边缘与其他特征(如角点等),且对程序的效率要求并不是很苛刻,则不建议优先使用此算法。