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发送SMTP邮件的教程
Apr 29 Python
python基于multiprocessing的多进程创建方法
Jun 04 Python
Python实现压缩与解压gzip大文件的方法
Sep 18 Python
浅谈Matplotlib简介和pyplot的简单使用——文本标注和箭头
Jan 09 Python
Python3使用SMTP发送带附件邮件
Jun 16 Python
python 字典修改键(key)的几种方法
Aug 10 Python
使用python批量修改文件名的方法(视频合并时)
Mar 24 Python
win10环境下配置vscode python开发环境的教程详解
Oct 16 Python
Python(PyS60)实现简单语音整点报时
Nov 18 Python
Python如何创建装饰器时保留函数元信息
Aug 07 Python
linux系统下pip升级报错的解决方法
Jan 31 Python
解决pytorch 损失函数中输入输出不匹配的问题
Jun 05 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多线程批量采集下载美女图片的实现代码(续)
2013/06/03 PHP
页面利用渐进式JPEG来提升用户体验度
2014/12/01 PHP
PHP中file_exists使用中遇到的问题小结
2016/04/05 PHP
yii框架使用分页的方法分析
2019/07/25 PHP
javascript css styleFloat和cssFloat
2010/03/15 Javascript
Ext对基本类型的扩展 ext,extjs,format
2010/12/25 Javascript
Jquery实现列表(隔行换色,全选,鼠标滑过当前行)效果实例
2013/06/09 Javascript
jQuery的each终止或跳过示例代码
2013/12/12 Javascript
js隐式全局变量造成的bug示例代码
2014/04/22 Javascript
BootStrap实现邮件列表的分页和模态框添加邮件的功能
2016/10/13 Javascript
angularjs下拉框空白的解决办法
2017/06/20 Javascript
Vue2.0生命周期的理解
2018/08/20 Javascript
layui实现数据分页功能(ajax异步)
2019/07/27 Javascript
Vue分页效果与购物车功能
2019/12/13 Javascript
利用JS如何获取form表单数据
2019/12/19 Javascript
javascript设计模式之迭代器模式
2020/01/30 Javascript
Python urlopen 使用小示例
2008/09/06 Python
python基础教程之Hello World!
2014/08/29 Python
Windows下Python2与Python3两个版本共存的方法详解
2017/02/12 Python
Python爬虫DNS解析缓存方法实例分析
2017/06/02 Python
Python matplotlib学习笔记之坐标轴范围
2019/06/28 Python
python自动循环定时开关机(非重启)测试
2019/08/26 Python
python实现的发邮件功能示例
2019/09/11 Python
Python 实现 T00ls 自动签到脚本代码(邮件+钉钉通知)
2020/07/06 Python
Pandas中DataFrame交换列顺序的方法实现
2020/12/14 Python
基于 Python 实践感知器分类算法
2021/01/07 Python
Cotton On美国网站:澳洲时装连锁品牌
2016/10/25 全球购物
十岁生日同学答谢词
2014/01/19 职场文书
物流创业计划书
2014/02/01 职场文书
软件项目实施计划书
2014/05/02 职场文书
精神文明建设标语
2014/06/16 职场文书
旅游与酒店管理专业求职信
2014/07/21 职场文书
委托公证书格式
2015/01/26 职场文书
硕士论文致谢范文
2015/05/14 职场文书
《攀登者》:“海拔8000米以上,你不能指望任何人”
2019/11/25 职场文书
MySQL为id选择合适的数据类型
2021/06/07 MySQL