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的迭代器和生成器使用实例
Jan 14 Python
bat和python批量重命名文件的实现代码
May 19 Python
使用 Python 实现微信公众号粉丝迁移流程
Jan 03 Python
python机器学习理论与实战(五)支持向量机
Jan 19 Python
Pandas标记删除重复记录的方法
Apr 08 Python
使用Python OpenCV为CNN增加图像样本的实现
Jun 10 Python
Python Numpy 实现交换两行和两列的方法
Jun 26 Python
django删除表重建的实现方法
Aug 28 Python
Python实现栈的方法详解【基于数组和单链表两种方法】
Feb 22 Python
2020新版本pycharm+anaconda+opencv+pyqt环境配置学习笔记,亲测可用
Mar 24 Python
PyQt5 QDockWidget控件应用详解
Aug 12 Python
Python Map 函数的使用
Aug 28 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生成静态文件的多种方法分享
2012/07/17 PHP
php编写的简单页面跳转功能实现代码
2013/11/27 PHP
php三元运算符知识汇总
2015/07/02 PHP
如何使用GDB调试PHP程序
2015/12/08 PHP
Yii+upload实现AJAX上传图片的方法
2016/07/13 PHP
Symfony2获取web目录绝对路径、相对路径、网址的方法
2016/11/14 PHP
jQuery选中select控件 无法设置selected的解决方法
2010/09/01 Javascript
jQuery.each()用法分享
2012/07/31 Javascript
JavaScript代码编写中各种各样的坑和填坑方法
2014/06/06 Javascript
javascript实现获取cookie过期时间的变通方法
2014/08/14 Javascript
使用jQuery mobile库检测url绝对地址和相对地址的方法
2015/12/04 Javascript
基于javascript实现表格的简单操作
2016/05/21 Javascript
jQuery实现订单提交页发送短信功能前端处理方法
2016/07/04 Javascript
利用Angularjs实现幻灯片效果
2016/09/07 Javascript
利用JS判断鼠标移入元素的方向
2016/12/11 Javascript
bootstrap组件之按钮式下拉菜单小结
2017/01/19 Javascript
一个简易的js图片轮播效果
2017/07/22 Javascript
AngularJS实现页面跳转后自动弹出对话框实例代码
2017/08/02 Javascript
浅谈Node.js 子进程与应用场景
2018/01/24 Javascript
vue3.0中使用postcss-pxtorem的具体方法
2019/11/20 Javascript
[01:06]DOTA2亚洲邀请赛专属珍藏-荧煌之礼
2017/03/24 DOTA
python类参数self使用示例
2014/02/17 Python
在Python3中使用asyncio库进行快速数据抓取的教程
2015/04/02 Python
Python用Bottle轻量级框架进行Web开发
2016/06/08 Python
python之文件读取一行一行的方法
2018/07/12 Python
python爬虫豆瓣网的模拟登录实现
2019/08/21 Python
Python爬取365好书中小说代码实例
2020/02/28 Python
编写python代码实现简单抽奖器
2020/10/20 Python
Python+MySQL随机试卷及答案生成程序的示例代码
2021/02/01 Python
css3背景图片透明叠加属性cross-fade简介及用法实例
2013/01/08 HTML / CSS
HTML5拖拽API经典实例详解
2018/04/20 HTML / CSS
工作失误检讨书范文大全
2014/01/13 职场文书
风险评估实施方案
2014/03/09 职场文书
2015年语文教研组工作总结
2015/05/23 职场文书
生活委员竞选稿
2015/11/21 职场文书
建房合同协议书
2016/03/21 职场文书