天天看点

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

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

1、resize函数简介

参数含义

参数含义: 
InputArray src     -原图像 
OutputArray dst    -输出图像 
Size dsize         -目标图像的大小 
double fx=0        -在x轴上的缩放比例 
double fy=0        -在y轴上的缩放比例 
int interpolation  -插值方式,有以下5种方式 
 
INTER_NEAREST      -最近邻插值 
INTER_LINEAR       -双线性插值 (默认使用) 
INTER_AREA         -区域插值。 
INTER_CUBIC        -三次样条插值,也叫立方插值(超过4*4像素邻域内的双三次插值)
INTER_LANCZOS4     -Lanczos插值(超过8*8像素邻域的Lanczos插值)
           

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速度较快,效果一般,其会抑制图像信号中的高频分量(即图像边缘会变模糊)。对于要求不高的场景,可以考虑此算法,但是如果需要最大限度的保留图像中的边缘与其他特征(如角点等),且对程序的效率要求并不是很苛刻,则不建议优先使用此算法。