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 MD5文件生成码
Jan 12 Python
总结Python编程中三条常用的技巧
May 11 Python
python xml.etree.ElementTree遍历xml所有节点实例详解
Dec 04 Python
python+pyqt实现12306图片验证效果
Oct 25 Python
python对excel文档去重及求和的实例
Apr 18 Python
python调用xlsxwriter创建xlsx的方法
May 03 Python
详解pandas中MultiIndex和对象实际索引不一致问题
Jul 23 Python
python flask搭建web应用教程
Nov 19 Python
Python使用matplotlib绘制Logistic曲线操作示例
Nov 28 Python
使用 Python 读取电子表格中的数据实例详解
Apr 17 Python
详解python变量与数据类型
Aug 25 Python
anaconda python3.8安装后降级
Jun 11 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实现图象锐化代码
2007/06/14 PHP
PHP中文分词的简单实现代码分享
2011/07/17 PHP
6种php上传图片重命名的方法实例
2013/11/04 PHP
php版微信公众平台接口参数调试实现判断用户行为的方法
2016/09/23 PHP
javascript 类定义的4种方法
2009/09/12 Javascript
jQuery EasyUI 中文API Layout(Tabs)
2010/04/27 Javascript
根据邮箱的域名跳转到相应的登录页面的代码
2012/02/27 Javascript
js动态添加onload、onresize、onscroll事件(另类方法)
2012/12/26 Javascript
Js 代码中,ajax请求地址后加随机数防止浏览器缓存的原因
2013/05/07 Javascript
Firefox中通过JavaScript复制数据到剪贴板(Copy to Clipboard 跨浏览器版)
2013/11/22 Javascript
jquery的trigger和triggerHandler的区别示例介绍
2014/04/20 Javascript
javascript中innerText和innerHTML属性用法实例分析
2015/05/13 Javascript
js如何打印object对象
2015/10/16 Javascript
详解iframe与frame的区别
2016/01/13 Javascript
js和jq使用submit方法无法提交表单的快速解决方法
2016/05/17 Javascript
jQuery实现获取隐藏div高度的方法示例
2017/02/09 Javascript
angular.js中解决跨域问题的三种方式
2017/07/12 Javascript
Vue 2.0 侦听器 watch属性代码详解
2019/06/19 Javascript
JavaScript监听一个DOM元素大小变化
2020/04/26 Javascript
Vue实现点击箭头上下移动效果
2020/06/11 Javascript
vue组件中传值EventBus的使用及注意事项说明
2020/11/16 Javascript
Vue 组件注册全解析
2020/12/17 Vue.js
[00:56]PWL开团时刻DAY8——追追追追追!
2020/11/09 DOTA
python进阶教程之函数参数的多种传递方法
2014/08/30 Python
python处理PHP数组文本文件实例
2014/09/18 Python
用python的turtle模块实现给女票画个小心心
2019/11/23 Python
Python调用C语言程序方法解析
2020/07/07 Python
CSS3的颜色渐变效果的示例代码
2017/09/29 HTML / CSS
Fresh馥蕾诗英国官网:法国LVMH集团旗下高端天然护肤品牌
2018/11/01 全球购物
EJB2和EJB3在架构上的不同点
2014/09/29 面试题
政法大学毕业生自荐信范文
2014/01/01 职场文书
学习礼仪心得体会
2014/09/01 职场文书
2014乡镇干部对照检查材料思想汇报
2014/09/26 职场文书
2016年教师党员创先争优承诺书
2016/03/24 职场文书
MySQL中几种插入和批量语句实例详解
2021/09/14 MySQL
「魔法少女伊莉雅」美游粘土人开订
2022/03/21 日漫