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 );
参数含义
2、算法对比
算法 | INTER_NEAREST | INTER_LINEAR | INTER_CUBIC | INTER_LANCZOS4 | INTER_AREA |
主要思想 | 用距离采样点最近的像素值最为采样点的灰度值 | 用双线性方式计算采样点周围的4个点,计算其灰度值 | 根据采样点的周围16个像素值的双线性关系以及像素变化率,计算出采样点的灰度值 | 在x,y方向分别对相邻的八个点进行插值,也就是计算加权和,傅立叶变换有关的三角函数的方法 | 使用像素区域关系进行重采样,图像放大时类似于双线性插值,缩放时类似于最近邻插值 |
锯齿现象 | 不可避免 | 可避免 | 可避免 | 可避免 | 可避免 |
周围像素 | 未考虑 | 未考虑 | 已考虑 | 已考虑 | 已考虑 |
速度 | 最快 | 较快 | 一般 | 较慢 | 最慢 |
- 为考虑图像的分辨率,尤其是INTER_AREA、INTER_CUBIC和INTER_LANCZOS4插值,图像分辨率的大小对其有一定的影响,一般情况INTER_AREA效率低一些;
- 算法运行过程中,opencv内部进行了优化,所以实际时间有些许波动;
- 测试过程中,硬件设备的干扰;
3、总结
如果缩小图像,INTER_AREA插值效果最好,而且可以有效防止产生波纹现象,如果放大图像,通常使用INTER_CUBIC或是INTER_LANCZOS4,此两种方法速度较慢,但效果相对较好。尽管INTER_NEAREST算法相当快,但使其效果大打折扣,一般很少使用。
值得注意的是INTER_LINEAR速度较快,效果一般,其会抑制图像信号中的高频分量(即图像边缘会变模糊)。对于要求不高的场景,可以考虑此算法,但是如果需要最大限度的保留图像中的边缘与其他特征(如角点等),且对程序的效率要求并不是很苛刻,则不建议优先使用此算法。