当前位置: 首页 > news >正文

OpenCV图像缩放:resize

    图像缩放是图像处理中的基础操作之一。无论是图像预处理、数据增强还是图像金字塔构建,cv::resize 都是我们最常用的函数之一。但你是否注意到,在 OpenCV 中同时还存在一个名为 cv::Mat::resize 的方法?这两个函数虽然名字类似,但用途完全不同。

    本篇博客将系统介绍 cv::resize 的功能与使用方法,并重点提示开发者不要将其与 cv::Mat::resize 混淆。

cv::resize:图像尺寸缩放

void cv::resize(InputArray src,OutputArray dst,Size dsize,double fx = 0,double fy = 0,int interpolation = INTER_LINEAR
);
  • src: 输入图像
  • dst: 输出图像
  • dsize,fx,fy: 输出图像尺寸,可以使用dsize明确指出输出图像尺寸(如cv::Size(100,100)),或者使用fx,fy分别控制水平与垂直方向上缩放系数,如fx=0.5表示水平方向上缩小到原尺寸的0.5
  • interpolation: 插值方式,包括:INTER_NEAREST 最近邻,INTER_LINEAR 双线性(默认),INTER_CUBIC 双三次,INTER_AREA 像素区域重采样(适合缩小)
cv::Mat img = cv::imread("lena.jpg");
cv::Mat small, large, dst;// 缩小为原来一半
cv::resize(img, small, cv::Size(), 0.5, 0.5, cv::INTER_AREA);// 放大到原图2倍
cv::resize(img, large, cv::Size(), 2.0, 2.0, cv::INTER_CUBIC);// 变换到指定尺寸
// 注意:目标尺寸的指定方法只能二选一,如选择指定尺寸则缩放系数为0,反之指定尺寸为0
cv::resize(img, dst, cv::Size(100, 100), 0, 0, cv::INTER_CUBIC);

不同插值方式的比较 

插值方法缩小时效果放大时效果说明
INTER_NEAREST锯齿明显像素块状最快但最差
INTER_LINEAR较平滑较清晰适合放大,缩小时推荐平滑图像后调用
INTER_CUBIC非常平滑较锐利适合放大,缩小时推荐平滑图像后调用
INTER_AREA保细节效果一般专门为缩小图像设计,等价于平滑图像+INTER_LINEAR

常见误区:不要把 cv::resizecv::Mat::resize 混淆 

    OpenCV 中还有另一个方法 cv::Mat::resize(size_t),这个函数并不是用于图像缩放,而是改变矩阵中的元素数量。举例说明:

// 创建一个1行10列的矩阵(或向量)
cv::Mat vec = (cv::Mat_<int>(1, 10) << 1,2,3,4,5,6,7,8,9,10);// 仅保留前5个元素
// 这里通过改变Mat对象头文件实现数据尺寸改变,
// 如果改变后尺寸大于原来尺寸可能进行内存分布,否则不会进行内存分配!
vec.resize(5);  // 注意:这不是图像缩小!

    一句话总结:图像缩放用 cv::resize,向量裁剪才 Mat::resize。 

实用技巧

  • 图像缩小建议使用 INTER_AREA当你对图像进行缩小时,INTER_AREA 的区域重采样方法可以保留更多细节,避免马赛克感。

cv::resize(img, small, cv::Size(), 0.25, 0.25, cv::INTER_AREA);
  • 你也可以使用固定目标尺寸进行缩放,不依赖缩放因子。
cv::resize(img, resized, cv::Size(256, 256));  // 直接缩放到 256×256
  • 在一些应用中存在批量图像缩放到统一尺寸的需求,常见用法如下:
std::vector<cv::Mat> images = ...;
for (auto& img : images) {cv::resize(img, img, cv::Size(224, 224));
}

深入理解图像缩放 

    在深入理解图像插值:从原理到应用中,我们对与resize相关的图像插值进行了详细的讲解,您可以参考该博文以深入理解图像缩放相关内容。

http://www.dtcms.com/a/306160.html

相关文章:

  • 【c++】leetcode763 划分字母区间
  • Ganttable 时间仪表盘
  • java~单例设计模式
  • 小架构step系列30:多个校验注解
  • 「Linux命令基础」压缩文件
  • ica1靶机攻略
  • iOS电池寿命与App能耗监测实战 构建完整性能监控系统
  • MSVC编译KDChart过程
  • IFCVF驱动+vhost-vfio提高虚拟机网络性能
  • BWCTAKC11X64G佰维/BIWIN存储容量为64GB
  • Java内存模型(JMM)
  • 制作一款打飞机游戏84:游戏视觉优化
  • 创建型设计模式-单例模式
  • Django模型关系:从一对多到多对多全解析
  • JSON.parse解析大整数踩坑
  • 9.项目起步(3)
  • ETCD学习之路
  • 代码随想录算法训练营第三十六天
  • 微软 Power Platform 使用Power Automate自动添加用户到AD域环境并分配环境角色
  • 「源力觉醒 创作者计划」_文心大模型 4.5 开源 28 天:从车间轴承到山村课堂的 AI 突围
  • 硬件电路设计(基本元器件)
  • 微信小程序苹果手机和安卓,怎么做适配
  • 链游与传统游戏的区别
  • 2025年自动化工程与计算机网络国际会议(ICAECN 2025)
  • TypeScript:前端语言,后端哲学
  • 桶排序-Java实现
  • 关于Docker【常见问题解决方案】
  • 数学建模——01规划/整数规划
  • sql developer 中文显示问号 中文显示乱码 错误消息显示问号
  • Shopify Draggable + Vue 3 完整指南:打造现代化拖拽交互体验