python opencv 图像拼接的实现方法


Posted in Python onJune 27, 2019

初级的图像拼接为将两幅图像简单的粘贴在一起,仅仅是图像几何空间的转移与合成,与图像内容无关。高级图像拼接也叫作基于特征匹配的图像拼接,拼接时消去两幅图像相同的部分,实现拼接合成全景图。

具有相同尺寸的图A和图B含有相同的部分与不同的部分,如图所示:

python opencv 图像拼接的实现方法           python opencv 图像拼接的实现方法

用基于特征的图像拼接实现后:

python opencv 图像拼接的实现方法

设图像高为h,相同部分的宽度为wx

拼接后图像的宽w=wA+wB-wx

因此,可以先构建一个高为h,宽为W*2的空白图像,将左图像向右平移wx,右图像粘贴在右侧。则右图像刚好覆盖左图像中的相同部分。最终拼接图像完成,完成后的图像左侧有宽度为wx的空白即为所检测出的两幅图像的相同部分,可根据需要选择是否去除。示例图如下。

实现上述效果的步骤如下:

1. 采用surft特征检测算法检测两幅图像的关键特征点;

2. 建立FLANN匹配器,采用目前最快的特征匹配(最近邻搜索)算法FlannBasedMatcher匹配关键点

3.从所匹配的全部关键点中筛选出优秀的特征点(基于距离筛选)

4. 根据查询图像和模板图像的特征描述子索引得出仿射变换矩阵

5. 获取左边图像到右边图像的投影映射关系

6. 透视变换将左图像放在相应的位置

7. 将有图像拷贝到特定位置完成拼接

先放python下利用opencv 进行图像拼接的代码,环境为python2.7+opencv2:

#coding: utf-8
import numpy as np
import cv2
leftgray = cv2.imread('1.jpg')
rightgray = cv2.imread('2.jpg')
hessian=400
surf=cv2.SURF(hessian) #将Hessian Threshold设置为400,阈值越大能检测的特征就越少
kp1,des1=surf.detectAndCompute(leftgray,None) #查找关键点和描述符
kp2,des2=surf.detectAndCompute(rightgray,None)
FLANN_INDEX_KDTREE=0 #建立FLANN匹配器的参数
indexParams=dict(algorithm=FLANN_INDEX_KDTREE,trees=5) #配置索引,密度树的数量为5
searchParams=dict(checks=50) #指定递归次数
#FlannBasedMatcher:是目前最快的特征匹配算法(最近邻搜索)
flann=cv2.FlannBasedMatcher(indexParams,searchParams) #建立匹配器
matches=flann.knnMatch(des1,des2,k=2) #得出匹配的关键点
good=[]
#提取优秀的特征点
for m,n in matches:
 if m.distance < 0.7*n.distance: #如果第一个邻近距离比第二个邻近距离的0.7倍小,则保留
  good.append(m)
src_pts = np.array([ kp1[m.queryIdx].pt for m in good]) #查询图像的特征描述子索引
dst_pts = np.array([ kp2[m.trainIdx].pt for m in good]) #训练(模板)图像的特征描述子索引
H=cv2.findHomography(src_pts,dst_pts)   #生成变换矩阵
h,w=leftgray.shape[:2]
h1,w1=rightgray.shape[:2]
shft=np.array([[1.0,0,w],[0,1.0,0],[0,0,1.0]])
M=np.dot(shft,H[0])   #获取左边图像到右边图像的投影映射关系
dst_corners=cv2.warpPerspective(leftgray,M,(w*2,h))#透视变换,新图像可容纳完整的两幅图
cv2.imshow('tiledImg1',dst_corners) #显示,第一幅图已在标准位置
dst_corners[0:h,w:w*2]=rightgray #将第二幅图放在右侧
#cv2.imwrite('tiled.jpg',dst_corners)
cv2.imshow('tiledImg',dst_corners)
cv2.imshow('leftgray',leftgray)
cv2.imshow('rightgray',rightgray)
cv2.waitKey()
cv2.destroyAllWindows()

所用图像为:

python opencv 图像拼接的实现方法   python opencv 图像拼接的实现方法

拼接完成后的图像为:

python opencv 图像拼接的实现方法

测试一下抗干扰能力,所用图像:

python opencv 图像拼接的实现方法     python opencv 图像拼接的实现方法

拼接结果:

python opencv 图像拼接的实现方法

可见,抗干扰能力还是不错的,在测试中若拼接不成功,则注意以下两点:

1. 所用两幅图像尺寸是否相同,是否有相同的部分。

2. 适当调整hessian的值。

总结

以上所述是小编给大家介绍的python opencv 图像拼接的实现方法,希望对大家有所帮助,如果大家有任何疑问欢迎给我留言,小编会及时回复大家的!

Python 相关文章推荐
Python datetime时间格式化去掉前导0
Jul 31 Python
在阿里云服务器上配置CentOS+Nginx+Python+Flask环境
Jun 18 Python
使用Python实现windows下的抓包与解析
Jan 15 Python
Python cookbook(数据结构与算法)将序列分解为单独变量的方法
Feb 13 Python
解决python写入mysql中datetime类型遇到的问题
Jun 21 Python
python3+opencv3识别图片中的物体并截取的方法
Dec 05 Python
Python list与NumPy array 区分详解
Nov 06 Python
TensorFlow——Checkpoint为模型添加检查点的实例
Jan 21 Python
关于python 的legend图例,参数使用说明
Apr 17 Python
Python类及获取对象属性方法解析
Jun 15 Python
通过代码实例了解Python3编程技巧
Oct 13 Python
python自动计算图像数据集的RGB均值
Jun 18 Python
python实现鸢尾花三种聚类算法(K-means,AGNES,DBScan)
Jun 27 #Python
Pandas中Series和DataFrame的索引实现
Jun 27 #Python
Python中使用双下划线防止类属性被覆盖问题
Jun 27 #Python
PyTorch的深度学习入门教程之构建神经网络
Jun 27 #Python
PyTorch的深度学习入门之PyTorch安装和配置
Jun 27 #Python
解决pycharm remote deployment 配置的问题
Jun 27 #Python
python turtle库画一个方格和圆实例
Jun 27 #Python
You might like
php遍历目录输出目录及其下的所有文件示例
2014/01/27 PHP
PHP COOKIE及时生效的方法介绍
2014/02/14 PHP
ThinkPHP整合百度Ueditor图文教程
2014/10/21 PHP
PHP实现将HTML5中Canvas图像保存到服务器的方法
2014/11/28 PHP
php注册登录系统简化版
2020/12/28 PHP
PHP中call_user_func_array回调函数的用法示例
2016/11/26 PHP
实现超用户体验 table排序javascript实现代码
2009/06/22 Javascript
JavaScript 浏览器验证代码(来自discuz)
2010/07/17 Javascript
jQuery实现伸展与合拢panel的方法
2015/04/30 Javascript
简述AngularJS的控制器的使用
2015/06/16 Javascript
微信小程序 基础组件与导航组件详细介绍
2017/02/21 Javascript
vuejs绑定class和style样式
2017/04/11 Javascript
ES6中Math对象新增的方法实例详解
2017/04/25 Javascript
webpack学习--webpack经典7分钟入门教程
2017/06/28 Javascript
使用store来优化React组件的方法
2017/10/23 Javascript
angular4笔记系列之内置指令小结
2018/11/09 Javascript
vue项目创建并引入饿了么elementUI组件的步骤
2019/04/11 Javascript
uni-app微信小程序登录并使用vuex存储登录状态的思路详解
2019/11/04 Javascript
node.js域名解析实现方法详解
2019/11/05 Javascript
Vuex中的Mutations的具体使用方法
2020/06/01 Javascript
python使用wxpython开发简单记事本的方法
2015/05/20 Python
python学习教程之使用py2exe打包
2017/09/24 Python
Python实现桶排序与快速排序算法结合应用示例
2017/11/22 Python
Python实现破解12306图片验证码的方法分析
2017/12/29 Python
Python socket连接中的粘包、精确传输问题实例分析
2020/03/24 Python
python将字典内容写入json文件的实例代码
2020/08/12 Python
Foot Locker澳洲官网:美国运动服和鞋类零售商
2019/10/11 全球购物
高中综合实践活动总结
2014/07/07 职场文书
民主评议党员工作总结
2014/10/20 职场文书
校本课程教学计划
2015/01/19 职场文书
纪委立案决定书
2015/06/24 职场文书
社区低保工作总结2015
2015/07/23 职场文书
创业计划书之个人工作室
2019/08/22 职场文书
Spring中bean的生命周期之getSingleton方法
2021/06/30 Java/Android
Vue鼠标滚轮滚动切换路由效果的实现方法
2021/08/04 Vue.js
Python+Tkinter打造签名设计工具
2022/04/01 Python