https://zhuanlan.zhihu.com/p/71777362

1.1 图像拼接基本步骤

图像拼接的完整流程如上所示,首先对输入图像提取鲁棒的特征点,并根据特征描述子完成特征点的匹配,然后根据已经匹配的特征点对得到相邻图像的位置关系从而进行图像配准,由于直接进行图像配准会破坏视场的一致性,因而先将图像投影在球面或者柱面上,最后计算相邻图像的拼缝并完成重叠区域的融合,得到最终的全景图像。

2.1 输入图像

2.2 特征点提取和特征匹配

特征点指的是图像灰度值发生剧烈变化的点或者在图像边缘上曲率较大的点,用直白的话来说就是指,从不同的角度对同一个场景进行拍照,在每一幅照片中都能鲁棒的提取的图像的点就是特征点。一个好的特征点提取算法需要具有以下的特征:数量多,在不同场景下都能提取得到足够数量的特征点;独特性好,从而便于对特征点进行匹配;抗旋转,抗亮度变化,抗尺度缩放等,常用的特征点提取算法包括SIFT,SURF,ORB等,OpenCV的拼接模块集成了SURF/ORB两种特征点提取算法,代码如下:

特征描述子就是描述一个特征点的属性,比如sift算法就是使用一个128维的向量,通过比较不同图像特征点的特征向量的欧式距离从而判断这两个特征点是否能进行匹配。

2.3 图像配准

该步骤的计算思路是计算两幅图像的单应性矩阵,从而得到一幅图像相对于另一幅图像的位置,用公式描述为

由于每个特征点都有​  两个坐标,因此只需要四个点即可求解出该八参数模型的解,同时考虑到前面利用特征向量匹配得到的特征点对可能存在误匹配,因此使用RANSAC算法进行求解,简单地说就是,每次随机抽取四个点求解单应性矩阵,然后根据该单应性矩阵判断剩余的匹配对是否为正确匹配,选择正确匹配数量最多的一组来进行求解,一个简单的算法流程图为:

另外前面的算法孤立求解两幅图像之间的位置,如果直接进行多幅图像的拼接会造成误差的累积,因此使用光束平差法进行联合优化,可以同时优化多个相机参数,从而得到更准确的图像位置,

水平矫正

2.4 图像投影

在得到相机的相对位置,如果直接进行拼接会破坏视场的一致性,使得拼接得到的全景图看起来不够连贯,因此需要通过投影变换将所有图像都投影在球面,柱面等,投影平面的选择与相机拍摄的方式有关系,一般来说球面投影,柱面投影是最为常用的投影方式。OpenCV代码为:

到这一步为止,图像拼接可以认为基本完成了,但是此时拼接得到的结果可能存在明显的亮暗变化,可能存在部分错位,图像与图像之间的重叠区域也会有明显的过渡痕迹,为了解决这些问题,通过下面的后处理手段可以得到更好的结果。

2.5曝光补偿

如果在拍摄过程中,由于未固定曝光,就会导致不同时刻拍摄得到的图片的整体亮度不同,那么直接进行拼接就会出现明显的明暗上的变化,因此需要设置曝光补偿,使得不同照片的整体亮度一致:

2.6 拼缝计算和图像融合

拼缝就是指图像之间重叠区域中最为相似的那条线,在得到相邻两幅图像的拼缝位置后,在拼缝附近的若干个像素使用融合算法,对于重叠区域中远离拼缝的位置只选择一侧的图像,通过这样的方法,可以有效的去除图像之间的错位,伪像,得到更好的拼接结果。

常用的融合算法有羽化融合和拉普拉斯融合算法,羽化融合就是对拼缝附近的位置根据与接缝的距离求出权重,加权融合,而拉普拉斯融合算法相当于求出图像不同频率的分量,然后按频率进行融合,显然拉普拉斯融合算法效果更好,但计算复杂度也更高。

利用OpenCV实现图像拼接Stitching模块讲解的更多相关文章

  1. opencv笔记--stitching模块

    opencv 提供了全景图像拼接的所有实现,包括: 1)stitching 模块提供了图像拼接过程中所需要的基本元素,该模块主要依赖于 features2d 模块: 2)提供了 stitching_d ...

  2. 基于OpenCV进行图像拼接原理解析和编码实现(提纲 代码和具体内容在课件中)

    一.背景 1.1概念定义 我们这里想要实现的图像拼接,既不是如题图1和2这样的"图片艺术拼接",也不是如图3这样的"显示拼接",而是实现类似"BaiD ...

  3. Stitching模块中对特征提取的封装解析(以ORB特性为例)

    titching模块中对特征提取的封装解析(以ORB特性为例)     OpenCV中Stitching模块(图像拼接模块)的拼接过程可以用PipeLine来进行描述,是一个比较复杂的过程.在这个过程 ...

  4. 如何利用OpenCV自带的级联分类器训练程序训练分类器

    介绍 使用级联分类器工作包括两个阶段:训练和检测. 检测部分在OpenCVobjdetect 模块的文档中有介绍,在那个文档中给出了一些级联分类器的基本介绍.当前的指南描述了如何训练分类器:准备训练数 ...

  5. 【OpenCV开发】使用OpenCV的OpenCL(ocl)模块

    参加OpenCV的OpenCL模块(以下称OCL)移植工作已经有2个月了.这里我说移植而不是开发,是因为大部分OCL模块的函数都是从已经很成熟的GPU模块移植过来的.于是目前阶段OCL模块所支持的函数 ...

  6. 小白的Python之路 day5 shelve模块讲解

    shelve模块讲解 一.概述 之前我们说不管是json也好,还是pickle也好,在python3中只能dump一次和load一次,有什么方法可以向dump多少次就dump多少次,并且load不会出 ...

  7. #利用openCV裁脸

    #利用openCV裁脸import cv2 def draw_rects(img, rects): for x, y, w, h in rects: cv2.rectangle(img, (x, y) ...

  8. 利用OpenCV给图像添加中文标注

    利用OpenCV给图像添加中文标注 : 参考:http://blog.sina.com.cn/s/blog_6bbd2dd101012dbh.html  和https://blog.csdn.net/ ...

  9. 善于利用python中的os模块

    作为一个程序猿,平时善于利用python中的os模块进行路径等操作,会省去很多麻烦,下面总结一下我平时经常用到的方法: import os os.getcwd() # 获取当前文件所在的目录 os.p ...

随机推荐

  1. AcWing 803. 区间合并

    网址 https://www.acwing.com/solution/AcWing/content/1590/ 题目描述给定n个区间[l, r]. 合并所有有交集的区间. 输出合并完成后的区间个数. ...

  2. 创建windows服务方法

    将exe程序创建windows服务 sc create TestService binpath= "c:/in estapp.exe" displayname= "Tes ...

  3. Windows许可证 即将过期

    最近打开电脑,系统总是自动弹出Windows许可证即将过期的弹窗,现在总结方法如下. 命令都是在运行窗口输入的打开方式:win+R组合键或者右键点击win10开始菜单,点击“运行”查看系统版本:win ...

  4. vscode相关设置

    一.如何设置vs每次点击文件打开新的窗口: 1.打开设置 2.搜索:"workbench.editor.enablePreview" 3.设置"workbench.edi ...

  5. 解决最新Java12 安装

    题外话: 因为我笔记本上的java用的版本是比较老的,从java8开始已经不再需要classpath java-home  path  这几个安装界的行业规范,基本上只需要安装 然后在path路径下 ...

  6. 常用的app包名和类名

    应用 包名 启动类 QQ com.tencent.mobileqq com.tencent.mobileqq.activity.HomeActivity 微信 com.tencent.mm com.t ...

  7. SQL Server内部如何管理对象的数据Page?

    一个表或Index使用的数据页空间是由IAM Page Chain来管理的.SQL Server 使用一个IAM(Index Allocation Map)Page来管理数据库文件中最多4GB的空间, ...

  8. zookeeper — 实现分布式锁

    一.前言 在之前的文章中介绍过分布式锁的特点和利用Redis实现简单的分布式锁.但是分布式锁的实现还有很多其他方式,但是万变不离其宗,始终遵循一个特点:同一时刻只能有一个操作获取.这篇文章主要介绍如何 ...

  9. Spring Boot 启动以后然后再加载缓存数据 CommandLineRunner

    实际应用中,我们会有在项目服务启动完成以后去加载一些数据或做一些事情(比如缓存)这样的需求. 为了解决这样的问题,Spring Boot 为我们提供了一个方法,通过实现接口 CommandLineRu ...

  10. Core源码(二) Linq的Distinct扩展

    先贴源码地址 https://github.com/dotnet/corefx/tree/master/src/System.Linq/src .NET CORE很大一个好处就是代码的开源,你可以详细 ...