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单例模式与metaclass
Jan 15 Python
Python首次安装后运行报错(0xc000007b)的解决方法
Oct 18 Python
浅谈python import引入不同路径下的模块
Jul 11 Python
python编程之requests在网络请求中添加cookies参数方法详解
Oct 25 Python
Python实现的多进程和多线程功能示例
May 29 Python
Python实现string字符串连接的方法总结【8种方式】
Jul 06 Python
详解python while 函数及while和for的区别
Sep 07 Python
对python 判断数字是否小于0的方法详解
Jan 26 Python
python实现将一维列表转换为多维列表(numpy+reshape)
Nov 29 Python
Python制作简易版小工具之计算天数的实现思路
Feb 13 Python
Python insert() / append() 用法 Leetcode实战演示
Mar 31 Python
python geopandas读取、创建shapefile文件的方法
Jun 29 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
Thinkphp5框架使用validate实现验证功能的方法
2019/08/27 PHP
静态页面的值传递(三部曲)
2006/09/25 Javascript
JS图片浏览组件PhotoLook的公开属性方法介绍和进阶实例代码
2010/11/09 Javascript
js键盘上下左右键怎么触发function(实例讲解)
2013/12/14 Javascript
javascript获取鼠标点击元素对象(示例代码)
2013/12/20 Javascript
jQuery选择器简明总结(含用法实例,一目了然)
2014/04/25 Javascript
利用原生JavaScript获取元素样式只是获取而已
2014/10/08 Javascript
使用mini-define实现前端代码的模块化管理
2014/12/25 Javascript
angularjs实现文字上下无缝滚动特效代码
2016/09/04 Javascript
jQuery 常见小例汇总
2016/12/14 Javascript
利用Node.js编写跨平台的spawn语句详解
2017/02/12 Javascript
JavaScript订单操作小程序完整版
2017/06/23 Javascript
bootstrap中selectpicker下拉框使用方法实例
2018/03/22 Javascript
微信小程序实现列表页的点赞和取消点赞功能
2018/11/02 Javascript
nodejs中实现用户注册路由功能
2019/05/20 NodeJs
javascript实现抢购倒计时程序
2019/08/26 Javascript
小程序和web画三角形实现解析
2019/09/02 Javascript
Swiper实现导航栏滚动效果
2020/10/16 Javascript
[58:21]DOTA2亚洲邀请赛 4.3 突围赛 Liquid vs VGJ.T 第二场
2018/04/04 DOTA
[01:54]TI珍贵瞬间系列(五):压力
2020/08/29 DOTA
在PYQT5中QscrollArea(滚动条)的使用方法
2019/06/14 Python
如何通过python的fabric包完成代码上传部署
2019/07/29 Python
Python解析多帧dicom数据详解
2020/01/13 Python
使用matlab 判断两个矩阵是否相等的实例
2020/05/11 Python
劳资专员岗位职责
2013/12/27 职场文书
大学校园活动策划书
2014/02/04 职场文书
海飞丝的广告词
2014/03/20 职场文书
农村葬礼主持词
2014/03/31 职场文书
新春寄语大全
2014/04/09 职场文书
泰坦尼克号观后感
2015/06/04 职场文书
学校安全管理制度
2015/08/06 职场文书
2016年五四青年节校园广播稿
2015/12/17 职场文书
Django显示可视化图表的实践
2021/05/10 Python
浅谈JavaScript作用域
2021/12/06 Javascript
Redis入门基础常用操作命令整理
2022/06/01 Redis
Android移动应用开发指南之六种布局详解
2022/09/23 Java/Android