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的Flask框架下收发电子邮件的教程
Apr 21 Python
python使用threading获取线程函数返回值的实现方法
Nov 15 Python
Python 查看文件的编码格式方法
Dec 21 Python
python+selenium 定位到元素,无法点击的解决方法
Jan 30 Python
简单易懂Pytorch实战实例VGG深度网络
Aug 27 Python
wxPython窗体拆分布局基础组件
Nov 19 Python
Python切割图片成九宫格的示例代码
Mar 10 Python
python属于软件吗
Jun 18 Python
Python装饰器结合递归原理解析
Jul 02 Python
PyTorch中clone()、detach()及相关扩展详解
Dec 09 Python
常用的Python代码调试工具总结
Jun 23 Python
Pytest中skip skipif跳过用例详解
Jun 30 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
destoon实现VIP排名一直在前面排序的方法
2014/08/21 PHP
讲解WordPress中用于获取评论模板和搜索表单的PHP函数
2015/12/28 PHP
jquery remove方法应用详解
2012/11/22 Javascript
js实现日期级联效果
2014/01/23 Javascript
使用JavaScript实现网页版Pongo设计思路及源代码分享
2014/06/16 Javascript
Javascript基础教程之关键字和保留字汇总
2015/01/18 Javascript
jquery实现的动态回到顶部特效代码
2015/10/28 Javascript
js实现的彩色方块飞舞奇幻效果
2016/01/27 Javascript
探索Vue.js component内容实现
2016/11/03 Javascript
javascript操作cookie
2017/01/17 Javascript
jQuery获取table下某一行某一列的值实现代码
2017/04/07 jQuery
Angularjs 双向绑定时字符串的转换成数字类型的问题
2017/06/12 Javascript
JavaScript实现的斑马线表格效果【隔行变色】
2017/09/18 Javascript
Vue侧滑菜单组件——DrawerLayout
2017/12/18 Javascript
Echarts地图添加引导线效果(labelLine)
2019/09/30 Javascript
小程序使用wxs解决wxml保留2位小数问题
2019/12/13 Javascript
Vue Render函数原理及代码实例解析
2020/07/30 Javascript
js获取url页面id,也就是最后的数字文件名
2020/09/25 Javascript
python批量下载图片的三种方法
2013/04/22 Python
python中去空格函数的用法
2014/08/21 Python
Python搭建APNS苹果推送通知推送服务的相关模块使用指南
2016/06/02 Python
numpy中实现二维数组按照某列、某行排序的方法
2018/04/04 Python
python matplotlib绘图,修改坐标轴刻度为文字的实例
2018/05/25 Python
Python动态参数/命名空间/函数嵌套/global和nonlocal
2019/05/29 Python
python实现视频压缩功能
2020/12/18 Python
python 装饰器重要在哪
2021/02/14 Python
推荐10个HTML5响应式框架
2016/02/25 HTML / CSS
四年级语文教学反思
2014/02/05 职场文书
小学生读书感言
2014/02/12 职场文书
社会调查研究计划书
2014/05/01 职场文书
个人欠款担保书
2014/05/20 职场文书
民政局副局长民主生活会个人整改措施
2014/10/04 职场文书
个人培训总结
2015/03/05 职场文书
考研导师推荐信范文
2015/03/27 职场文书
停电放假通知
2015/04/14 职场文书
Zabbix对Kafka topic积压数据监控的解决方案
2022/07/07 Servers