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虚拟环境Virtualenv使用教程
May 18 Python
Python设计足球联赛赛程表程序的思路与简单实现示例
Jun 28 Python
Python 常用的安装Module方式汇总
May 06 Python
在python中bool函数的取值方法
Nov 01 Python
python+opencv实现阈值分割
Dec 26 Python
Python文件操作中进行字符串替换的方法(保存到新文件/当前文件)
Jun 28 Python
Django实现celery定时任务过程解析
Apr 21 Python
怎么快速自学python
Jun 22 Python
python db类用法说明
Jul 07 Python
Django视图、传参和forms验证操作
Jul 15 Python
Django如何在不停机的情况下创建索引
Aug 02 Python
Python 按比例获取样本数据或执行任务的实现代码
Dec 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
将数字格式的计算结果转为汉字格式
2006/10/09 PHP
珊瑚虫IP库浅析
2007/02/15 PHP
php高级编程-函数-郑阿奇
2011/07/04 PHP
destoon出现验证码不显示时的紧急处理方法
2014/08/22 PHP
document.onreadystatechange事件的用法分析
2009/10/17 Javascript
js动态创建上传表单通过iframe模拟Ajax实现无刷新
2014/02/20 Javascript
jQuery+css实现的蓝色水平二级导航菜单效果代码
2015/09/11 Javascript
JQuery.Ajax()的data参数类型实例详解
2015/11/20 Javascript
vue+element实现批量删除功能的示例
2018/02/28 Javascript
elementUI 设置input的只读或禁用的方法
2018/10/30 Javascript
vue3.0 上手体验
2020/09/21 Javascript
springboot+vue实现文件上传下载
2020/11/17 Vue.js
[38:54]完美世界DOTA2联赛PWL S2 Rebirth vs LBZS 第一场 11.28
2020/12/01 DOTA
[46:14]完美世界DOTA2联赛PWL S3 Magma vs INK ICE 第一场 12.11
2020/12/16 DOTA
Python随机生成数模块random使用实例
2015/04/13 Python
简单介绍Python中的struct模块
2015/04/28 Python
python遍历数组的方法小结
2015/04/30 Python
Python3内置模块之base64编解码方法详解
2019/07/13 Python
解决django 新增加用户信息出现错误的问题
2019/07/28 Python
Flask使用Pyecharts在单个页面展示多个图表的方法
2019/08/05 Python
Python Web框架之Django框架文件上传功能详解
2019/08/16 Python
python argparser的具体使用
2019/11/10 Python
python实现五子棋程序
2020/04/24 Python
详解css3 object-fit属性
2018/07/27 HTML / CSS
英国虚拟主机服务商:eUKhost
2016/08/16 全球购物
台湾旅游网站:灿星旅游
2018/10/11 全球购物
初中生自我评价
2014/02/01 职场文书
心理健康活动总结
2014/04/30 职场文书
企业宣传策划方案
2014/05/29 职场文书
我的中国梦演讲稿1000字
2014/08/19 职场文书
竞选学习委员演讲稿
2014/09/01 职场文书
汇报材料怎么写
2014/12/30 职场文书
食品卫生管理制度
2015/08/06 职场文书
小学体育教学随笔
2015/08/14 职场文书
Java Socket实现多人聊天系统
2021/07/15 Java/Android
Jedis操作Redis实现模拟验证码发送功能
2021/09/25 Redis