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 字符串格式化代码
Mar 17 Python
Python实现3行代码解简单的一元一次方程
Aug 18 Python
Python爬虫模拟登录带验证码网站
Jan 22 Python
Python中%是什么意思?python中百分号如何使用?
Mar 20 Python
用python生成与调用cntk模型代码演示方法
Aug 26 Python
Python 50行爬虫抓取并处理图灵书目过程详解
Sep 20 Python
Flask之pipenv虚拟环境的实现
Nov 26 Python
Python图片的横坐标汉字实例
Dec 04 Python
Pycharm最新激活码2019(推荐)
Dec 31 Python
在win64上使用bypy进行百度网盘文件上传功能
Jan 02 Python
matplotlib 曲线图 和 折线图 plt.plot()实例
Apr 17 Python
Python定义函数实现累计求和操作
May 03 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
LotusPhp笔记之:Cookie组件的使用详解
2013/05/06 PHP
Js 中debug方式
2010/02/07 Javascript
javascript客户端解决方案 缓存提供程序
2010/07/14 Javascript
js事件(Event)知识整理
2012/10/11 Javascript
JS获取鼠标坐标的实例方法
2013/07/18 Javascript
jquery ready函数、css函数及text()使用示例
2013/09/27 Javascript
浅谈JavaScript函数参数的可修改性问题
2013/12/05 Javascript
类似天猫商品详情随浏览器移动的示例代码
2014/02/27 Javascript
Node.js的Koa框架上手及MySQL操作指南
2016/06/13 Javascript
json实现添加、遍历与删除属性的方法
2016/06/17 Javascript
Vue项目webpack打包部署到服务器的实例详解
2017/07/17 Javascript
CheckBox多选取值及判断CheckBox选中是否为空的实例
2017/10/31 Javascript
vue中设置、获取、删除cookie的方法
2018/09/21 Javascript
在vue项目中引入highcharts图表的方法
2019/01/21 Javascript
详解使用JWT实现单点登录(完全跨域方案)
2019/08/02 Javascript
浅析vue-router中params和query的区别
2019/12/24 Javascript
微信小程序自定义弹出模态框禁止底部滚动功能
2020/03/09 Javascript
微信小程序实现拼图小游戏
2020/10/22 Javascript
Python通过PIL获取图片主要颜色并和颜色库进行对比的方法
2015/03/19 Python
详解Python中的变量及其命名和打印
2016/03/11 Python
Python中不同进制的语法及转换方法分析
2016/07/27 Python
python原类、类的创建过程与方法详解
2019/07/19 Python
python3中pip3安装出错,找不到SSL的解决方式
2019/12/12 Python
Python 使用生成器代替线程的方法
2020/08/04 Python
python time()的实例用法
2020/11/03 Python
Madewell美德威尔美国官网:美国休闲服饰品牌
2016/11/25 全球购物
英国演唱会订票网站:Ticket Selection
2018/03/27 全球购物
在使用非全零作为空指针内部表达的机器上, NULL是如何定义
2014/11/09 面试题
表彰先进的通报
2014/01/31 职场文书
2014年大学生社会实践自我鉴定
2014/09/26 职场文书
自我检讨书范文
2015/01/28 职场文书
致青春观后感
2015/06/09 职场文书
2015年教务主任工作总结
2015/07/22 职场文书
Pytorch中的学习率衰减及其用法详解
2021/06/05 Python
详解nginx location指令
2022/01/18 Servers
Python中Schedule模块使用详解 周期任务神器
2022/04/19 Python