OpenCV图像缩放resize各种插值方式的比较

您所在的位置:网站首页 灭鼠哪种效果最好用 OpenCV图像缩放resize各种插值方式的比较

OpenCV图像缩放resize各种插值方式的比较

2024-07-17 00:27:17| 来源: 网络整理| 查看: 265

OpenCV图像缩放resize各种插值方式的比较

目录

OpenCV图像缩放resize各种插值方式的比较

1. resize函数说明

2.各种插值方式的比较

2.1 INTER_NEAREST(最近邻插值)

2.2 INTER_CUBIC  (三次样条插值)

2.3 INTER_LINEAR(线性插值)

2.4 INTER_AREA  (区域插值)

3. 总结

1. resize函数说明

    OpenCV提供了resize函数来改变图像的大小,函数原型如下:

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

    参数说明:

src:输入,原图像,即待改变大小的图像;dst:输出,改变大小之后的图像,这个图像和原图像具有相同的内容,只是大小和原图像不一样而已;dsize:输出图像的大小。如果这个参数不为0,那么就代表将原图像缩放到这个Size(width,height)指定的大小;如果这个参数为0,那么原图像缩放之后的大小就要通过下面的公式来计算:

       dsize = Size(round(fx*src.cols), round(fy*src.rows))

       其中,fx和fy就是下面要说的两个参数,是图像width方向和height方向的缩放比例。

fx:width方向的缩放比例,如果它是0,那么它就会按照(double)dsize.width/src.cols来计算;fy:height方向的缩放比例,如果它是0,那么它就会按照(double)dsize.height/src.rows来计算;interpolation:这个是指定插值的方式,图像缩放之后,肯定像素要进行重新计算的,就靠这个参数来指定重新计算像素的方式,有以下几种:

      INTER_NEAREST - 最邻近插值       INTER_LINEAR - 双线性插值,如果最后一个参数你不指定,默认使用这种方法       INTER_AREA -区域插值 resampling using pixel area relation. It may be a preferred method for image decimation, as it gives moire’-free results. But when the image is zoomed, it is similar to the INTER_NEAREST method.       INTER_CUBIC - 4x4像素邻域内的双立方插值       INTER_LANCZOS4 - 8x8像素邻域内的Lanczos插值

使用注意事项:

   dsize和fx/fy不能同时为0,要么你就指定好dsize的值,让fx和fy空置直接使用默认值,就像

resize(img, imgDst, Size(30,30));

要么你就让dsize为0,指定好fx和fy的值,比如fx=fy=0.5,那么就相当于把原图两个方向缩小一倍!

OpenCV官方说明:注意红色方框那句话:OpenCV: Geometric Image Transformations

To shrink an image, it will generally look best with cv::INTER_AREA interpolation, whereas to enlarge an image, it will generally look best with cv::INTER_CUBIC (slow) or cv::INTER_LINEAR (faster but still looks OK).

2.各种插值方式的比较

    OpenCV的cv::resize函数支持多种插值方式,这里主要比较下面四个常用的插值方式。

    参考资料:《OpenCV中resize函数五种插值算法的实现过程》OpenCV中resize函数五种插值算法的实现过程_fengbingchun的博客-CSDN博客_opencv插值函数 

2.1 INTER_NEAREST(最近邻插值)

    最近邻插值是最简单的插值方法,选取离目标点最近的点作为新的插入点,计算公式表示如下:

插值后的边缘效果:由于是以最近的点作为新的插入点,因此边缘不会出现缓慢的渐慢过度区域,这也导致放大的图像容易出现锯齿的现象

2.2 INTER_CUBIC  (三次样条插值)

插值后的边缘效果:可以有效避免出现锯齿的现象

2.3 INTER_LINEAR(线性插值)

    线性插值是以距离为权重的一种插值方式。

插值后的边缘效果:可以有效避免出现锯齿的现象

2.4 INTER_AREA  (区域插值)

   区域插值共分三种情况,图像放大时类似于双线性插值,图像缩小(x轴、y轴同时缩小)又分两种情况,此情况下可以避免波纹出现。因此对图像进行缩小时,为了避免出现波纹现象,推荐采用区域插值方法。

  OpenGL说明文档有这么解释:To shrink an image, it will generally look best with #INTER_AREA interpolation, whereas to enlarge an image, it will generally look best with #INTER_CUBIC (slow) or #INTER_LINEAR (faster but still looks OK).

    如果要缩小图像,通常推荐使用INTER_AREA插值效果最好,而要放大图像,通常使用INTER_CUBIC(速度较慢,但效果最好),或者使用INTER_LINEAR(速度较快,效果还可以)。

插值后的边缘效果:

测试代码:

#include #include #define millisecond 1000000 #define DEBUG_PRINT(...) printf( __VA_ARGS__); printf("\n") #define DEBUG_TIME(time_) auto time_ =std::chrono::high_resolution_clock::now() #define RUN_TIME(time_) (double)(time_).count()/millisecond using namespace std; cv::Mat image_resize(cv::Mat image, int width, int height, int interpolation, int num) { cv::Mat dest; for (int i = 0; i < num; ++i) { cv::resize(image, dest, cv::Size(width, height), 0, 0, interpolation);//最近邻插值 } return dest; } int main() { string path = "../1.jpg"; cv::Mat image = cv::imread(path); cv::resize(image, image, cv::Size(1000, 1000)); int re_width = 900; int re_height = 900; int num=10; cv::Mat image2X_INTER_NEAREST; cv::Mat image2X_INTER_LINEAR; cv::Mat image2X_INTER_AREA; cv::Mat image2X_INTER_CUBIC; cv::Mat initMat; DEBUG_PRINT("image input size:%dx%d", image.rows, image.cols); DEBUG_TIME(T0); image2X_INTER_NEAREST=image_resize(image, re_width, re_height, cv::INTER_NEAREST, num); DEBUG_TIME(T1); image2X_INTER_LINEAR=image_resize(image, re_width, re_height, cv::INTER_LINEAR, num); DEBUG_TIME(T2); image2X_INTER_AREA=image_resize(image, re_width, re_height, cv::INTER_AREA, num); DEBUG_TIME(T3); image2X_INTER_CUBIC=image_resize(image, re_width, re_height, cv::INTER_CUBIC, num); DEBUG_TIME(T4); DEBUG_PRINT("resize_image:%dx%d,INTER_NEAREST:%3.3fms", image2X_INTER_NEAREST.rows, image2X_INTER_NEAREST.cols, RUN_TIME(T1 - T0)/num); DEBUG_PRINT("resize_image:%dx%d,INTER_LINEAR :%3.3fms", image2X_INTER_LINEAR.rows, image2X_INTER_LINEAR.cols, RUN_TIME(T2 - T1)/num); DEBUG_PRINT("resize_image:%dx%d,INTER_AREA :%3.3fms", image2X_INTER_AREA.rows, image2X_INTER_AREA.cols, RUN_TIME(T3 - T2)/num); DEBUG_PRINT("resize_image:%dx%d,INTER_CUBIC :%3.3fms", image2X_INTER_CUBIC.rows, image2X_INTER_CUBIC.cols, RUN_TIME(T4 - T3)/num); return 0; }

    运行结果:

image input size:1000x1000 resize_image:900x900,INTER_NEAREST:0.389ms resize_image:900x900,INTER_LINEAR :0.605ms resize_image:900x900,INTER_AREA   :2.611ms resize_image:900x900,INTER_CUBIC  :1.920ms

3. 总结

    测试结果表明:

 速度比较:INTER_NEAREST(最近邻插值)>INTER_LINEAR(线性插值)>INTER_CUBIC(三次样条插值)>INTER_AREA  (区域插值)对图像进行缩小时,为了避免出现波纹现象,推荐采用INTER_AREA 区域插值方法。OpenCV推荐:如果要缩小图像,通常推荐使用#INTER_AREA插值效果最好,而要放大图像,通常使用INTER_CUBIC(速度较慢,但效果最好),或者使用INTER_LINEAR(速度较快,效果还可以)。至于最近邻插值INTER_NEAREST,一般不推荐使用



【本文地址】

公司简介

联系我们

今日新闻


点击排行

实验室常用的仪器、试剂和
说到实验室常用到的东西,主要就分为仪器、试剂和耗
不用再找了,全球10大实验
01、赛默飞世尔科技(热电)Thermo Fisher Scientif
三代水柜的量产巅峰T-72坦
作者:寞寒最近,西边闹腾挺大,本来小寞以为忙完这
通风柜跟实验室通风系统有
说到通风柜跟实验室通风,不少人都纠结二者到底是不
集消毒杀菌、烘干收纳为一
厨房是家里细菌较多的地方,潮湿的环境、没有完全密
实验室设备之全钢实验台如
全钢实验台是实验室家具中较为重要的家具之一,很多

推荐新闻


图片新闻

实验室药品柜的特性有哪些
实验室药品柜是实验室家具的重要组成部分之一,主要
小学科学实验中有哪些教学
计算机 计算器 一般 打孔器 打气筒 仪器车 显微镜
实验室各种仪器原理动图讲
1.紫外分光光谱UV分析原理:吸收紫外光能量,引起分
高中化学常见仪器及实验装
1、可加热仪器:2、计量仪器:(1)仪器A的名称:量
微生物操作主要设备和器具
今天盘点一下微生物操作主要设备和器具,别嫌我啰嗦
浅谈通风柜使用基本常识
 众所周知,通风柜功能中最主要的就是排气功能。在

专题文章

    CopyRight 2018-2019 实验室设备网 版权所有 win10的实时保护怎么永久关闭