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),此时 dsizeSize()

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 实际效果展示

翻转

拼接

缩放

相关推荐
小妖同学学AI2 小时前
AI数字人,赋予教学新的生命力
人工智能
天云数据2 小时前
OpenClaw-RL:边聊边学的统一智能体强化学习框架
人工智能
Mintopia2 小时前
团队 AI 协作开发:一套把产品快速落地的工程化方案
前端·人工智能
深小乐2 小时前
DeepWiki:AI 重塑 GitHub 代码理解新体验
人工智能
我想问问天2 小时前
OpenClaw + Obsidian 实现 AI 记忆持久化:打造真正有长期记忆的 AI 助手
人工智能
阿_旭2 小时前
基于YOLO26深度学习的茶叶病害智能检测识别系统【python源码+Pyqt5界面+数据集+训练代码】
人工智能·python·深度学习·茶叶病害检测
w_t_y_y2 小时前
知识体系——SKILL
人工智能
穿过锁扣的风2 小时前
OpenCV 高斯金字塔与拉普拉斯金字塔详解
人工智能·opencv·计算机视觉