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 相关文章推荐
SublimeText 2编译python出错的解决方法(The system cannot find the file specified)
Nov 27 Python
python 设置文件编码格式的实现方法
Dec 21 Python
Python实现获取前100组勾股数的方法示例
May 04 Python
python中ASCII码和字符的转换方法
Jul 09 Python
基于python实现百度翻译功能
May 09 Python
Python+OpenCV+pyQt5录制双目摄像头视频的实例
Jun 28 Python
Python Pandas 转换unix时间戳方式
Dec 07 Python
python实现实时视频流播放代码实例
Jan 11 Python
python机器学习库xgboost的使用
Jan 20 Python
Django自定义全局403、404、500错误页面的示例代码
Mar 08 Python
判断Threading.start新线程是否执行完毕的实例
May 02 Python
Python函数调用追踪实现代码
Nov 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 GD 图像处理组件的常用函数总结
2010/04/28 PHP
非常实用的php弹出错误警告函数扩展性强
2014/01/17 PHP
php输出指定时间以前时间格式的方法
2015/03/21 PHP
PHP+Ajax实现的博客文章添加类别功能示例
2018/03/29 PHP
采用CSS和JS,刚好我最近有个站点要用到下拉菜单!
2006/06/26 Javascript
JavaScript 计算图片加载数量的代码
2011/01/01 Javascript
JavaScript 学习笔记之语句
2015/01/14 Javascript
jQuery中live()方法用法实例
2015/01/19 Javascript
JavaScript设置body高度为浏览器高度的方法
2015/02/09 Javascript
Function.prototype.apply()与Function.prototype.call()小结
2016/04/27 Javascript
浏览器兼容的JS写法总结
2016/04/27 Javascript
Javascript打印局部页面实例
2016/06/21 Javascript
Extjs让combobox写起来简洁又漂亮
2017/01/05 Javascript
js, jQuery实现全选、反选功能
2017/03/08 Javascript
vue.js 实现输入框动态添加功能
2018/06/25 Javascript
vue-cli配置环境变量的方法
2018/07/09 Javascript
vue+mousemove实现鼠标拖动功能(拖动过快失效问题解决方法)
2018/08/24 Javascript
react配置antd按需加载的使用
2019/02/11 Javascript
微信小程序的开发范式BeautyWe.js入门详解
2019/07/10 Javascript
vue中使用腾讯云Im的示例
2020/10/23 Javascript
python获得linux下所有挂载点(mount points)的方法
2015/04/29 Python
Python实现线程池代码分享
2015/06/21 Python
python语言中with as的用法使用详解
2018/02/23 Python
利用Python在一个文件的头部插入数据的实例
2018/05/02 Python
如何优雅地改进Django中的模板碎片缓存详解
2018/07/04 Python
python按键按住不放持续响应的实例代码
2019/07/17 Python
django中上传图片分页三级联动效果的实现代码
2019/08/30 Python
使用python切片实现二维数组复制示例
2019/11/26 Python
pytorch程序异常后删除占用的显存操作
2020/01/13 Python
Java的类可以定义为Protected或者Private得吗
2015/09/25 面试题
团员学习总结的自我评价范文
2013/10/14 职场文书
大学生优秀自荐信范文
2014/02/25 职场文书
社会实践评语
2014/04/28 职场文书
学校四群教育实施方案
2014/06/12 职场文书
大学军训通讯稿
2015/07/18 职场文书
pytorch finetuning 自己的图片进行训练操作
2021/06/05 Python