首页 最新 热门 推荐

  • 首页
  • 最新
  • 热门
  • 推荐

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

  • 23-09-22 20:03
  • 4211
  • 11992
blog.csdn.net

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(速度较快,效果还可以)。

插值后的边缘效果:

测试代码:

  1. #include
  2. #include
  3. #define millisecond 1000000
  4. #define DEBUG_PRINT(...) printf( __VA_ARGS__); printf(" ")
  5. #define DEBUG_TIME(time_) auto time_ =std::chrono::high_resolution_clock::now()
  6. #define RUN_TIME(time_) (double)(time_).count()/millisecond
  7. using namespace std;
  8. cv::Mat image_resize(cv::Mat image, int width, int height, int interpolation, int num) {
  9. cv::Mat dest;
  10. for (int i = 0; i < num; ++i) {
  11. cv::resize(image, dest, cv::Size(width, height), 0, 0, interpolation);//最近邻插值
  12. }
  13. return dest;
  14. }
  15. int main() {
  16. string path = "../1.jpg";
  17. cv::Mat image = cv::imread(path);
  18. cv::resize(image, image, cv::Size(1000, 1000));
  19. int re_width = 900;
  20. int re_height = 900;
  21. int num=10;
  22. cv::Mat image2X_INTER_NEAREST;
  23. cv::Mat image2X_INTER_LINEAR;
  24. cv::Mat image2X_INTER_AREA;
  25. cv::Mat image2X_INTER_CUBIC;
  26. cv::Mat initMat;
  27. DEBUG_PRINT("image input size:%dx%d", image.rows, image.cols);
  28. DEBUG_TIME(T0);
  29. image2X_INTER_NEAREST=image_resize(image, re_width, re_height, cv::INTER_NEAREST, num);
  30. DEBUG_TIME(T1);
  31. image2X_INTER_LINEAR=image_resize(image, re_width, re_height, cv::INTER_LINEAR, num);
  32. DEBUG_TIME(T2);
  33. image2X_INTER_AREA=image_resize(image, re_width, re_height, cv::INTER_AREA, num);
  34. DEBUG_TIME(T3);
  35. image2X_INTER_CUBIC=image_resize(image, re_width, re_height, cv::INTER_CUBIC, num);
  36. DEBUG_TIME(T4);
  37. DEBUG_PRINT("resize_image:%dx%d,INTER_NEAREST:%3.3fms",
  38. image2X_INTER_NEAREST.rows,
  39. image2X_INTER_NEAREST.cols,
  40. RUN_TIME(T1 - T0)/num);
  41. DEBUG_PRINT("resize_image:%dx%d,INTER_LINEAR :%3.3fms",
  42. image2X_INTER_LINEAR.rows,
  43. image2X_INTER_LINEAR.cols,
  44. RUN_TIME(T2 - T1)/num);
  45. DEBUG_PRINT("resize_image:%dx%d,INTER_AREA :%3.3fms",
  46. image2X_INTER_AREA.rows,
  47. image2X_INTER_AREA.cols,
  48. RUN_TIME(T3 - T2)/num);
  49. DEBUG_PRINT("resize_image:%dx%d,INTER_CUBIC :%3.3fms",
  50. image2X_INTER_CUBIC.rows,
  51. image2X_INTER_CUBIC.cols,
  52. RUN_TIME(T4 - T3)/num);
  53. return 0;
  54. }

    运行结果:

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,一般不推荐使用

文章知识点与官方知识档案匹配,可进一步学习相关知识
OpenCV技能树首页概览20473 人正在系统学习中
AI吃大瓜
微信公众号
微信公众号
注:本文转载自blog.csdn.net的AI吃大瓜的文章"https://blog.csdn.net/guyuealian/article/details/85097633"。版权归原作者所有,此博客不拥有其著作权,亦不承担相应法律责任。如有侵权,请联系我们删除。
复制链接
复制链接
相关推荐
发表评论
登录后才能发表评论和回复 注册

/ 登录

评论记录:

未查询到任何数据!
回复评论:

分类栏目

后端 (14832) 前端 (14280) 移动开发 (3760) 编程语言 (3851) Java (3904) Python (3298) 人工智能 (10119) AIGC (2810) 大数据 (3499) 数据库 (3945) 数据结构与算法 (3757) 音视频 (2669) 云原生 (3145) 云平台 (2965) 前沿技术 (2993) 开源 (2160) 小程序 (2860) 运维 (2533) 服务器 (2698) 操作系统 (2325) 硬件开发 (2492) 嵌入式 (2955) 微软技术 (2769) 软件工程 (2056) 测试 (2865) 网络空间安全 (2948) 网络与通信 (2797) 用户体验设计 (2592) 学习和成长 (2593) 搜索 (2744) 开发工具 (7108) 游戏 (2829) HarmonyOS (2935) 区块链 (2782) 数学 (3112) 3C硬件 (2759) 资讯 (2909) Android (4709) iOS (1850) 代码人生 (3043) 阅读 (2841)

热门文章

101
推荐
关于我们 隐私政策 免责声明 联系我们
Copyright © 2020-2024 蚁人论坛 (iYenn.com) All Rights Reserved.
Scroll to Top