OpenCv之图像缩放翻转和拼接

目录

[一、图像插值原理(缩放 / 旋转的基础)](#一、图像插值原理(缩放 / 旋转的基础))

[1.1 问题由来](#1.1 问题由来)

[1.2. 常见插值方法](#1.2. 常见插值方法)

[1.3. 双线性插值原理](#1.3. 双线性插值原理)

二、图像缩放:cv::resize()

[2.1. 函数原型](#2.1. 函数原型)

[2.2. 应用场景](#2.2. 应用场景)

三、图像翻转:cv::flip()

[3.1. 函数原型](#3.1. 函数原型)

[3.2. 应用场景](#3.2. 应用场景)

四、图像拼接

[4.1. 函数原型](#4.1. 函数原型)

[4.2. 应用场景](#4.2. 应用场景)

五、应用代码举例

5.1缩放反转和拼接代码举例

[5.2 实际效果展示](#5.2 实际效果展示)


一、图像插值原理(缩放 / 旋转的基础)

1.1 问题由来

当我们把图像放大 / 缩小 / 旋转 时,目标图像的像素坐标会对应到原图像的非整数坐标 (比如 (120.3, 45.7)),而原图像只有整数坐标的像素值,这就需要通过插值算法来估算这个非整数坐标的像素值。

1.2. 常见插值方法

插值方法 核心逻辑 优点 缺点 适用场景
最近邻插值(INTER_NEAREST) 取最近的整数坐标像素值 速度最快,计算简单 边缘锯齿明显,画质差 放大图标 / 文字、实时性要求高的场景
线性插值(INTER_LINEAR) 取 2 个邻点的线性加权平均 速度快,效果比最近邻好 边缘仍有轻微模糊 图像缩小、实时视频流
双线性插值(INTER_LINEAR,OpenCV 默认) 取 4 个邻点的二维线性加权 效果平滑,无锯齿 计算稍慢 通用缩放、日常图像处理(默认选择)
双三次插值(INTER_CUBIC) 取 16 个邻点的三次多项式拟合 画质最优,边缘清晰 计算最慢 高清图像放大、摄影后期
Lanczos 插值(INTER_LANCZOS4) 基于 sinc 函数的高阶插值 细节保留最好 计算最慢,易产生振铃 专业图像修复、超分辨率

1.3. 双线性插值原理

目标点 p(u,v) 落在 4 个已知点 p(u₀,v₀)、p(u₁,v₀)、p(u₀,v₁)、p(u₁,v₁) 之间:

  1. 先在水平方向做两次线性插值,得到 p(u,v₀) 和 p(u,v₁);
  2. 再在垂直方向做一次线性插值,得到最终的 p(u,v)。
  • f(u,v0)f(u,v1)f(u,v)=(u1−u)f(u0,v0)+(u−u0)
  • f(u1,v0)=(u1−u)f(u0,v1)+(u−u0)
  • f(u1,v1)=(v1−v)f(u,v0)+(v−v0)f(u,v1)

二、图像缩放:cv::resize()

2.1. 函数原型

复制代码
void cv::resize(
    InputArray src,        // 输入图像
    OutputArray dst,       // 输出图像(类型与src一致)
    Size dsize,            // 目标尺寸(Size(w,h))
    double fx = 0,         // 水平缩放比例(优先dsize)
    double fy = 0,         // 垂直缩放比例(优先dsize)
    int interpolation = INTER_LINEAR  // 插值方法
);
  • 两种传参方式 :
    1. 直接指定目标尺寸:dsize = Size(640, 480);
    2. 指定缩放比例:fx=0.5, fy=0.5(缩小为原来的 1/2),此时 dsize 传 Size()。

2.2. 应用场景

  • 适配显示:将高分辨率图像缩放到适合屏幕 / 控件的尺寸;
  • 减少计算:将大图缩小后再做特征检测 / 深度学习,提升速度;
  • 图像放大:将小图放大用于预览 / 打印(需配合高质量插值)。

三、图像翻转:cv::flip()

3.1. 函数原型

复制代码
void cv::flip(
    InputArray src,    // 输入图像
    OutputArray dst,   // 输出图像(尺寸/类型/通道数与src一致)
    int flipCode       // 翻转方式
);
  • flipCode 取值 :
    • flipCode > 0:绕 Y 轴 翻转(水平翻转,左右镜像);
    • flipCode = 0:绕 X 轴 翻转(垂直翻转,上下颠倒);
    • flipCode < 0:同时绕 X、Y 轴翻转(180° 旋转)。

3.2. 应用场景

  • 数据增强:深度学习训练时,翻转图像增加样本多样性;
  • 镜像预览:相机预览 / 自拍时,显示镜像效果更符合直觉;
  • 图像校正:扫描 / 拍摄时方向颠倒,用翻转校正。

四、图像拼接

4.1. 函数原型

复制代码
// 水平拼接(左右拼):要求两张图**高度一致**
void cv::hconcat(InputArray src1, InputArray src2, OutputArray dst);
// 垂直拼接(上下拼):要求两张图**宽度一致**
void cv::vconcat(InputArray src1, InputArray src2, OutputArray dst);
  • 注意:拼接的图像必须通道数相同、数据类型相同。

4.2. 应用场景

  • 结果对比:将原图 / 处理后图并排展示,方便调试;
  • 全景拼接:多张相邻图像拼接成全景图;
  • 多图排版:生成对比报告、海报排版。

五、应用代码举例

5.1缩放反转和拼接代码举例

cpp 复制代码
void testResize()
{
	Mat GrayMat = imread(R"(D:\Study\OpenCvStudy\lean.jpg)", ImreadModes::IMREAD_GRAYSCALE);
	//图像缩放
	Mat resizeMat1, resizeMat2, resizeMat3;
	resize(GrayMat, resizeMat1, Size(200, 400), 0, 0, INTER_NEAREST);
	resize(GrayMat, resizeMat2, Size(200, 400), 0, 0, INTER_LINEAR);
	resize(GrayMat, resizeMat3, Size(200, 400), 0, 0, INTER_CUBIC);


	//图像反转
	Mat flipH,flipV,flipHV;
	flip(GrayMat, flipH, 0);//0 x 正值 y  负值 xy中心对称
	flip(GrayMat, flipV, 1);
	flip(GrayMat, flipHV, -1);

	//图像拼接
	Mat catH,catV;
	hconcat(GrayMat, flipV, catH);
	vconcat(GrayMat, flipH, catV);

	waitKey();

}

5.2 实际效果展示

翻转

拼接

缩放

相关推荐
奕鼎竜瑆7 小时前
Solid 前端响应式开发从零到精通
前端·人工智能
YOLO数据集集合7 小时前
无人机桥梁损伤目标检测数据集 | 桥梁损伤 无人机巡检 结构健康监测 多类别检测9135期
人工智能·目标检测·无人机
动恰客流统计7 小时前
景区客流统计怎么做?兼顾管控与运营的实施方案解析
大数据·前端·人工智能
weixin_443883017 小时前
合规整改倒计时:高等级签名证书的应用场景
大数据·人工智能·法大大·法大大电子签·电子合同
魔猴疯猿7 小时前
从0到1用Python开发第一个智能体
人工智能·python·深度学习·神经网络·机器学习
天一生水water8 小时前
变分模态分解(VMD)的教程
人工智能
荆棘鸟智能8 小时前
林业遥感长势评估怎么做?从NDVI时序分析到LiDAR蓄积量回归
人工智能·算法·智慧林业
代码方舟8 小时前
数据科学风控实战:基于天远全能消金报告构建自动化信用评估网关
运维·人工智能·自动化
Yan-英杰8 小时前
2026年数据采集服务怎么选?4大主流平台(亮数据 Bright Data、Apify、ScrapingBee、Zyte)深度对比
人工智能·神经网络·microsoft·机器学习·ai开发工具