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

OpenCV图像处理——图像缩放函数 resize

目录

1. cv::resize() 介绍

2. 插值方法(关键)

3. 应用示例


在某些情况下,我们通常需要将图像转换成指定的大小,这就需要调整图像尺寸。

1. cv::resize() 介绍

void cv::resize

(

InputArray

src,

OutputArray

dst,

Size

dsize,

double

fx =0,

double

fy =0,

int

interpolation =INTER_LINEAR

)

参数说明:

src——输入图像

dst——输出图像;其尺寸为 dsize(当 dsize 非零时),或由 src.size()、fx 和 fy 计算得出;dst 的类型与 src 相同。

dsize——输出图像大小,dsize = Size(round(fx*src.cols), round(fy*src.rows))

fx——沿水平轴的缩放因子,当其为0时,计算为:(double)dsize.width/src.cols

fy——沿垂直轴的缩放因子,当其为0时,计算为:(double)dsize.height/src.rows

interpolation——插值方法。

2. 插值方法(关键)

所谓插值(指内插值(interpolation),相对于外插值,即外推(extrapolation)),就是通过已有的像素去计算并得出需要填充的像素值。插值是图像大小调整的关键。原图像中的像素值位于一个整数网格上;例如,我们可以引用 (20,17) 处的像素。当这些整数位置映射到新的图像后,可能存在间隙——因为,原图像中的整数位置像素映射到了目标图像的浮点位置,因此必须四舍五入到最近的整数位置,或者因为映射后目标图像是空的,没有像素填充(考虑双倍拉伸图像,则新图像有一半的位置没有像素)。这些问题通常称为正向投影问题(forward projection problems)。

为了处理这样一种舍入问题和目标图像间隙问题,我们实际上是反向(backward)来解决这个问题的:我们逐像素遍历目标图像的每一个像素并问,“源图像中哪一个像素需要用于填充这个目标像素?”这些源像素将会总是位于分数像素位置,因此我们必须对源像素进行插值来推导出目标位置正确的像素值。该函数默认使用的方法是双线性(bilinear)插值(即一种基于双变量的插值方法),但你也可以选择其它插值方法。常用的插值方法有:

插值方法

说明

INTER_NEAREST

最近领域插值

INTER_LINEAR

双线性插值

INTER_CUBIC

双三次插值(bicubic)

INTER_AREA

基于像素面积关系的重采样。对于图像抽取(下采样)而言,这可能是一种首选方法,因为它能产生无Moiré条纹的结果。但在对图像进行放大时,其效果与 INTER_NEAREST 方法相似

INTER_LANCZOS4

基于8x8领域的Lanczos插值

INTER_LINEAR_EXACT

INTER_NEAREST_EXACT

位精确双线性插值

INTER_MAX

插值代码掩码插值

WARP_FILL_OUTLIERS

该标志会填充目标图像的所有像素。如果其中某些像素对应于源图像中的离群点(outliers),则会被置为零。

WARP_INVERSE_MAP

逆变换标识,例如,linearPolar 或 logPolar 变换

填充目标图像最简单的方法就是取源图像中最近像素的值;这就是选择INTER_NEAREST能达到的效果。

3.应用示例

(1)用宽度和高度调整图像

voidTest_resize()

{

// Load the image

cv::Matimage = cv::imread("D:\\TestVideo\\Flower6-2.jpg");

// Define new width and height

intnew_width = 600;

intnew_height = 400;

// Create an empty Mat object for the resized image

cv::Matresized_image;

// Resize the image

cv::resize(image, resized_image, cv::Size(new_width, new_height));

// Display the resized image

cv::imshow("Resized Image", resized_image);

cv::waitKey(0);

}

(2)按长宽比缩放(aspect ratio)

voidTest_resize()

{

// Load the image

cv::Matimage = cv::imread("D:\\TestVideo\\Flower6-2.jpg");

// Get the original dimensions

intoriginal_width = image.cols;

intoriginal_height = image.rows;

// Define new width while maintaining the aspect ratio

intnew_width = 2000;

doubleaspect_ratio =static_cast<double>(new_width) / original_width;

intnew_height =static_cast<int>(original_height * aspect_ratio);// Compute height based on aspect ratio

// Create an empty Mat object for the resized image

cv::Matresized_image;

// Resize the image

cv::resize(image, resized_image, cv::Size(new_width, new_height));

// Display the resized image

cv::imshow("Resized Image", resized_image);

cv::waitKey(0);

}

(3)利用 fx 和 fy 参数来对图像进行缩放

与其手动指定宽度和高度,我们可以利用 fx 和 fy 参数来对图像进行缩放。将 fx 设置为等于 fy,即可确保保持图像的纵横比。

voidTest_resize()

{

// Load the image

cv::Matimage = cv::imread("D:\\TestVideo\\Flower6-2.jpg");

// Scaling factors

doublescale_down = 0.8;

doublescale_up = 1.2;

// Create Mat objects for the resized images

cv::Matresized_down, resized_up;

// Resize the image (scaling down)

cv::resize(image, resized_down, cv::Size(), scale_down, scale_down, cv::INTER_LINEAR);

// Resize the image (scaling up)

cv::resize(image, resized_up, cv::Size(), scale_up, scale_up, cv::INTER_LINEAR);

// Display the images

cv::imshow("Original Image", image);

cv::imshow("Scaled Down Image", resized_down);

cv::imshow("Scaled Up Image", resized_up);

cv::waitKey(0);

}

http://www.jsqmd.com/news/659785/

相关文章:

  • 【AI简历生成器实战指南】:SITS2026官方认证的5大黄金模板+3步定制法,HR秒回率提升217%?
  • 2026年具身机器人数据匮乏,智元旗下觅蜂推平台,欲让数据如水电即取即用
  • 从数据到地图:Arcgis等值线图实战避坑指南
  • 如何彻底解决TranslucentTB启动问题:Microsoft.UI.Xaml依赖修复终极指南
  • GitHub中文化插件:3步解锁母语级代码协作体验的完整指南
  • [特殊字符] 凌晨 3 点,我靠这个工具救回了被格式毁掉的毕业论文
  • 有实力的净化产品品牌盘点,兴达净化产品价格贵吗为你解读 - mypinpai
  • PyTorch 2.8镜像惊艳效果:供应链数据→韧性评估动态视频建模
  • 告别网盘限速:8大平台直链解析工具LinkSwift深度评测
  • 深度解析江苏华厦给排水科技有限公司,其设备价格是否合理值得探讨 - 工业品网
  • Qwen3-0.6B-FP8详细步骤:从镜像拉取、服务启动、日志排查到Chainlit联调全链路
  • Android Studio编译卡在阿里云Maven仓库?手把手教你搞定‘unable to find valid certification path’玄学报错
  • UDOP-large实战案例:英文技术报告摘要生成,快速理解文档内容
  • 智能代码生成在团队中落地失败的7个隐性陷阱(92%团队踩过第4个)
  • 采用符合FIPS标准的OpManager,加固数据安全防线
  • SAP ECC6 EC-CS 标准报表项目 FS Item 编码表
  • 从原理到实战:雷达脉冲压缩如何破解探测距离与精度的矛盾
  • 从MATLAB复数到VPI光波:手把手教你搞定相干光通信仿真的‘数据桥梁’搭建
  • 别再手动敲变量了!用Matlab逗号分隔列表批量处理元胞和结构体数据
  • TranslucentTB启动失败?3步修复Microsoft.UI.Xaml依赖问题
  • 海康设备网络SDK实战:NET_DVR_SetDeviceConfig配置区域入侵侦测
  • DIY USB2.0拓展坞:从原理图到PCB布局全解析
  • ANTLR4与SparkSQL深度联动:从SqlBase.g4到AstBuilder的完整语法扩展指南
  • 性能测试演进:云原生环境新挑战
  • G-Helper完整指南:华硕笔记本轻量级性能控制工具实战教程
  • 手把手教你用Holt-Winters模型预测下个月的电费(Python statsmodels实战)
  • MogFace人脸检测模型-large:电商场景下的人脸识别应用全解析
  • 3034基于单片机的浮点数加减计算器设计(数码管)
  • OBS多路RTMP推流插件:单次编码,多平台同步直播的技术实现
  • 如何快速解锁微信网页版:wechat-need-web 终极解决方案指南