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 正则表达式 概述及常用字符
May 04 Python
Python 冒泡,选择,插入排序使用实例
Feb 05 Python
Python中for循环和while循环的基本使用方法
Aug 21 Python
PYTHON基础-时间日期处理小结
May 05 Python
python实现键盘控制鼠标移动
Nov 27 Python
python+unittest+requests实现接口自动化的方法
Nov 29 Python
Python Django切换MySQL数据库实例详解
Jul 16 Python
python config文件的读写操作示例
Sep 27 Python
Python如何实现动态数组
Nov 02 Python
python matplotlib拟合直线的实现
Nov 19 Python
Django静态资源部署404问题解决方案
May 11 Python
详解python字符串驻留技术
May 21 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设计模式 注册表模式(多个类的注册)
2012/02/05 PHP
一个简洁的PHP可逆加密函数(分享)
2013/06/06 PHP
PHP PDOStatement:bindParam插入数据错误问题分析
2013/11/13 PHP
CentOS下搭建PHP环境与WordPress博客程序的全流程总结
2016/05/07 PHP
Laravel自动生成UUID,从建表到使用详解
2019/10/24 PHP
JS提交并解析后台返回的XML的代码
2008/11/03 Javascript
使用jQuery简化Ajax开发 Ajax开发入门
2009/10/14 Javascript
自己动手制作jquery插件之自动添加删除行功能介绍
2011/10/14 Javascript
js去字符串前后空格5种实现方法及比较
2013/04/03 Javascript
javascript常用函数归纳整理
2014/10/31 Javascript
Nodejs Stream 数据流使用手册
2016/04/17 NodeJs
浅谈JS运算符&amp;&amp;和|| 及其优先级
2016/08/10 Javascript
浅谈jQuery为哪般去掉了浏览器检测
2016/08/29 Javascript
JavaScript 闭包详细介绍
2016/09/28 Javascript
Vue结合原生js实现自定义组件自动生成示例
2017/01/21 Javascript
浅谈angularJS2中的界面跳转方法
2018/08/31 Javascript
微信小程序webview 脚手架使用详解
2019/07/22 Javascript
Paypal支付不完全指北
2020/06/04 Javascript
NodeJS开发人员常见五个错误理解
2020/10/14 NodeJs
Python中random模块用法实例分析
2015/05/19 Python
Python正则表达式实现截取成对括号的方法
2017/01/06 Python
python实现对列表中的元素进行倒序打印
2019/11/23 Python
Django DRF路由与扩展功能的实现
2020/06/03 Python
美国最大网上鞋店:Zappos
2016/07/25 全球购物
美国全球旅游运营商:Pacific Holidays
2018/06/18 全球购物
Famous Footwear加拿大:美国多品牌运动休闲鞋店
2018/12/05 全球购物
英国经济型酒店品牌:Travelodge
2019/12/17 全球购物
英国书籍、CD、DVD和游戏的第一道德零售商:Awesome Books
2020/02/22 全球购物
Ajax的优点和缺点
2014/11/21 面试题
法学研究生自我鉴定范文
2013/12/04 职场文书
小学校长先进事迹材料
2014/05/13 职场文书
领导干部整治奢华浪费之风思想汇报
2014/10/07 职场文书
2016年幼儿园教研活动总结
2016/04/05 职场文书
Java并发编程之Executor接口的使用
2021/06/21 Java/Android
Python如何用re模块实现简易tokenizer
2022/05/02 Python
MySQL分布式恢复进阶
2022/07/23 MySQL