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中tell()方法的使用详解
May 24 Python
详解Python中的__getitem__方法与slice对象的切片操作
Jun 27 Python
Python创建xml文件示例
Mar 22 Python
详解Python3操作Mongodb简明易懂教程
May 25 Python
15行Python代码带你轻松理解令牌桶算法
Mar 21 Python
详解Django中间件的5种自定义方法
Jul 26 Python
Django添加sitemap的方法示例
Aug 06 Python
Python 获取命令行参数内容及参数个数的实例
Dec 20 Python
matlab中imadjust函数的作用及应用举例
Feb 27 Python
Python通过文本和图片生成词云图
May 21 Python
python程序需要编译吗
Jun 19 Python
Python操控mysql批量插入数据的实现方法
Oct 27 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-fpm的两种进程管理模式详解
2013/06/03 PHP
开源php中文分词系统SCWS安装和使用实例
2014/04/11 PHP
学习php设计模式 php实现装饰器模式(decorator)
2015/12/07 PHP
php正则提取html图片(img)src地址与任意属性的方法
2017/02/08 PHP
PDO::quote讲解
2019/01/29 PHP
JS 继承实例分析
2008/11/04 Javascript
javascript判断iphone/android手机横竖屏模式的函数
2011/12/20 Javascript
JavaScript每天必学之事件
2016/09/18 Javascript
浅谈JavaScript中的apply/call/bind和this的使用
2017/02/26 Javascript
Node.js使用gm拼装sprite图片
2017/07/04 Javascript
vue开发环境配置跨域的方法步骤
2019/01/16 Javascript
js逆向解密之网络爬虫
2019/05/30 Javascript
npm 语义版本控制详解
2019/09/10 Javascript
用原生JS实现爱奇艺首页导航栏代码实例
2019/09/19 Javascript
微信小程序跳转到其他网页(外部链接)的实现方法
2019/09/20 Javascript
vue+element 实现商城主题开发的示例代码
2020/03/26 Javascript
JavaScript如何实现监听键盘输入和鼠标监点击
2020/07/20 Javascript
JavaScript实现移动端拖动元素
2020/11/24 Javascript
[14:50]2018DOTA2亚洲邀请赛开幕式
2018/04/03 DOTA
利用Python脚本实现ping百度和google的方法
2017/01/24 Python
详解python基础之while循环及if判断
2017/08/24 Python
python下10个简单实例代码
2017/11/15 Python
浅谈python3发送post请求参数为空的情况
2018/12/28 Python
keras小技巧——获取某一个网络层的输出方式
2020/05/23 Python
OpenCV+python实现实时目标检测功能
2020/06/24 Python
英国时尚和家居用品零售商:Matalan
2021/02/28 全球购物
澳大利亚领先的在线礼品网站:Gifts Australia
2020/08/15 全球购物
国际贸易专业个人求职信范文分享
2013/12/14 职场文书
《泉水》教学反思
2014/04/11 职场文书
大学计划书范文800字
2014/08/14 职场文书
工作作风建设心得体会
2014/10/22 职场文书
工作期间打牌检讨书范文
2014/11/20 职场文书
聘用合同范本
2015/09/21 职场文书
中学教代会开幕词
2016/03/04 职场文书
创业计划书之寿司
2019/07/19 职场文书
新手入门Mysql--概念
2021/06/18 MySQL