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

翻转

拼接

缩放

相关推荐
AI浩4 小时前
PaveSync:用于路面病害分析与分类的统一综合数据集
人工智能·机器学习·分类·数据挖掘
code 小楊4 小时前
通义千问Wan2.7系统图像&视频模型全解析(含实测测评+多模型对比+核心数据)
人工智能·计算机视觉
deephub4 小时前
机器学习特征工程:缩放、编码、聚合、嵌入与自动化
人工智能·python·机器学习·特征工程
小龙报5 小时前
【Coze-AI智能体平台】Coze智能体实操:翻译助手从工作流搭建到应用发布全流程详解
人工智能·深度学习·计算机视觉·chatgpt·语音识别·文心一言·集成学习
IT_陈寒10 小时前
React Hooks闭包陷阱:你以为的state可能早就过期了
前端·人工智能·后端
Thomas.Sir12 小时前
第一章:Agent智能体开发实战之【初步认识 LlamaIndex:从入门到实操】
人工智能·python·ai·检索增强·llama·llamaindex
笨笨饿12 小时前
29_Z变换在工程中的实际意义
c语言·开发语言·人工智能·单片机·mcu·算法·机器人
boy快快长大12 小时前
【大模型应用开发】记忆
人工智能
LaughingZhu12 小时前
Product Hunt 每日热榜 | 2026-04-05
前端·数据库·人工智能·经验分享·神经网络
OPHKVPS12 小时前
GoBruteforcer(GoBrut)僵尸网络新攻势:AI 生成弱配置成“帮凶”,瞄准加密货币及区块链数据库
网络·人工智能·区块链