利用OpenCV实现图像拼接Stitching模块讲解
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模块讲解的更多相关文章
- opencv笔记--stitching模块
opencv 提供了全景图像拼接的所有实现,包括: 1)stitching 模块提供了图像拼接过程中所需要的基本元素,该模块主要依赖于 features2d 模块: 2)提供了 stitching_d ...
- 基于OpenCV进行图像拼接原理解析和编码实现(提纲 代码和具体内容在课件中)
一.背景 1.1概念定义 我们这里想要实现的图像拼接,既不是如题图1和2这样的"图片艺术拼接",也不是如图3这样的"显示拼接",而是实现类似"BaiD ...
- Stitching模块中对特征提取的封装解析(以ORB特性为例)
titching模块中对特征提取的封装解析(以ORB特性为例) OpenCV中Stitching模块(图像拼接模块)的拼接过程可以用PipeLine来进行描述,是一个比较复杂的过程.在这个过程 ...
- 如何利用OpenCV自带的级联分类器训练程序训练分类器
介绍 使用级联分类器工作包括两个阶段:训练和检测. 检测部分在OpenCVobjdetect 模块的文档中有介绍,在那个文档中给出了一些级联分类器的基本介绍.当前的指南描述了如何训练分类器:准备训练数 ...
- 【OpenCV开发】使用OpenCV的OpenCL(ocl)模块
参加OpenCV的OpenCL模块(以下称OCL)移植工作已经有2个月了.这里我说移植而不是开发,是因为大部分OCL模块的函数都是从已经很成熟的GPU模块移植过来的.于是目前阶段OCL模块所支持的函数 ...
- 小白的Python之路 day5 shelve模块讲解
shelve模块讲解 一.概述 之前我们说不管是json也好,还是pickle也好,在python3中只能dump一次和load一次,有什么方法可以向dump多少次就dump多少次,并且load不会出 ...
- #利用openCV裁脸
#利用openCV裁脸import cv2 def draw_rects(img, rects): for x, y, w, h in rects: cv2.rectangle(img, (x, y) ...
- 利用OpenCV给图像添加中文标注
利用OpenCV给图像添加中文标注 : 参考:http://blog.sina.com.cn/s/blog_6bbd2dd101012dbh.html 和https://blog.csdn.net/ ...
- 善于利用python中的os模块
作为一个程序猿,平时善于利用python中的os模块进行路径等操作,会省去很多麻烦,下面总结一下我平时经常用到的方法: import os os.getcwd() # 获取当前文件所在的目录 os.p ...
随机推荐
- HEC-ResSim原文档
HEC-ResSim Reservoir System Simulation User's Manual Version 3.1 May 201 ...
- IT兄弟连 Java语法教程 流程控制语句 控制循环结构3
使用continue忽略本次循环剩下的语句 continue的功能和break有点类似,区别是continue只是忽略本次循环剩下的语句,接着开始下一次循环,并不会终止循环:而break则是完全终止循 ...
- Linux安全加固及文本处理之awk实践
1.编写脚本selinux.sh,实现开启或禁用SELinux功能 [root@ansible_centos7 ~]# cat selinux.sh #!/bin/bash # #********** ...
- Redis for OPS 05:哨兵HA Sentinel
写在前面的话 上一节的主从环境能够解决我们保证数据安全性的问题,但是却无法解决我们在主节点挂掉的时候服务继续使用的问题,同时也不能自动切换新的主. 我们运维的目的肯定是希望即使主库挂掉一个,服务依旧能 ...
- KiRaiseException函数逆向
KiRaiseException函数是记录异常的最后一步,在这之后紧接着就调用KiDispatchException分发异常. 我们在逆向前,先看一下书中的介绍: 1. 概念认知: KiRaiseEx ...
- 爬取bilibili首页菜单获取li内容
代码: import requests from bs4 import BeautifulSoup def html_save(s): with open('哔哩哔哩.csv','a')as f: f ...
- 【java提高】(16)---java注解(Annotation)
java提高(16)---java注解 注解含义注解是JDK1.5之后才有的新特性,它相当于一种标记,在程序中加入注解就等于为程序打上某种标记,之后又通过类的反射机制来解析注解. 一.JDK自带注解 ...
- GitHub 2019年年度报告:Python最受欢迎,VScode贡献者高达19.1K
前言 文的文字及图片来源于网络,仅供学习.交流使用,不具有任何商业用途,版权归原作者所有,如有问题请及时联系我们以作处理. 作者: 开源最前线(ID:OpenSourceTop) PS:如有需要Pyt ...
- String trim() ,去除当前字符串两边的空白字符
package seday01;/** * String trim() * 去除当前字符串两边的空白字符 * @author xingsir */public class TrimDemo { pub ...
- python中time、datetime模块的使用
目录 python中time.datetime模块的使用 1.前言 2.time模块 1.时间格式转换图 2.常用方法 3.datetime模块 python中time.datetime模块的使用 1 ...