OpenCv之图像缩放翻转和拼接

OpenCv之图像缩放翻转和拼接 目录一、图像插值原理缩放 / 旋转的基础1.1 问题由来1.2. 常见插值方法1.3. 双线性插值原理二、图像缩放cv::resize()2.1. 函数原型2.2. 应用场景三、图像翻转cv::flip()3.1. 函数原型3.2. 应用场景四、图像拼接4.1. 函数原型4.2. 应用场景五、应用代码举例5.1缩放反转和拼接代码举例5.2 实际效果展示一、图像插值原理缩放 / 旋转的基础1.1 问题由来当我们把图像放大 / 缩小 / 旋转时目标图像的像素坐标会对应到原图像的非整数坐标比如(120.3, 45.7)而原图像只有整数坐标的像素值这就需要通过插值算法来估算这个非整数坐标的像素值。1.2. 常见插值方法插值方法核心逻辑优点缺点适用场景最近邻插值INTER_NEAREST取最近的整数坐标像素值速度最快计算简单边缘锯齿明显画质差放大图标 / 文字、实时性要求高的场景线性插值INTER_LINEAR取 2 个邻点的线性加权平均速度快效果比最近邻好边缘仍有轻微模糊图像缩小、实时视频流双线性插值INTER_LINEAROpenCV 默认取 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)指定缩放比例fx0.5, fy0.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缩放反转和拼接代码举例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 实际效果展示翻转拼接缩放