目录
[一、图像插值原理(缩放 / 旋转的基础)](#一、图像插值原理(缩放 / 旋转的基础))
[1.1 问题由来](#1.1 问题由来)
[1.2. 常见插值方法](#1.2. 常见插值方法)
[1.3. 双线性插值原理](#1.3. 双线性插值原理)
[2.1. 函数原型](#2.1. 函数原型)
[2.2. 应用场景](#2.2. 应用场景)
[3.1. 函数原型](#3.1. 函数原型)
[3.2. 应用场景](#3.2. 应用场景)
[4.1. 函数原型](#4.1. 函数原型)
[4.2. 应用场景](#4.2. 应用场景)
[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₁) 之间:
- 先在水平方向做两次线性插值,得到
p(u,v₀)和p(u,v₁); - 再在垂直方向做一次线性插值,得到最终的
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 // 插值方法
);
- 两种传参方式 :
- 直接指定目标尺寸:
dsize = Size(640, 480); - 指定缩放比例:
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 实际效果展示
翻转

拼接


缩放
