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逐行读取文件内容的三种方法
Jan 20 Python
Python内置函数之filter map reduce介绍
Nov 30 Python
python使用xlrd实现检索excel中某列含有指定字符串记录的方法
May 09 Python
python遍历 truple list dictionary的几种方法总结
Sep 11 Python
python利用微信公众号实现报警功能
Jun 10 Python
Python实现插入排序和选择排序的方法
May 12 Python
python实现大文件分割与合并
Jul 22 Python
python实现猜拳小游戏
Apr 05 Python
python在OpenCV里实现投影变换效果
Aug 30 Python
利用python、tensorflow、opencv、pyqt5实现人脸实时签到系统
Sep 25 Python
Python3监控windows,linux系统的CPU、硬盘、内存使用率和各个端口的开启情况详细代码实例
Mar 18 Python
基于Python共轭梯度法与最速下降法之间的对比
Apr 02 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实现单链表的实例代码
2013/03/22 PHP
php实现excel中rank函数功能的方法
2015/01/20 PHP
解析dom中的children对象数组元素firstChild,lastChild的使用
2013/07/10 Javascript
JS实现点击图片在当前页面放大并可关闭的漂亮效果
2013/10/18 Javascript
推荐一个自己用的封装好的javascript插件
2015/01/29 Javascript
纯js代码实现简单计算器
2015/12/02 Javascript
js对象浅拷贝和深拷贝详解
2016/09/05 Javascript
JavaScript之Canvas_动力节点Java学院整理
2017/07/04 Javascript
利用纯JS实现像素逐渐显示的方法示例
2017/08/14 Javascript
详解Vue.js iview实现树形权限表(可扩展表)
2018/09/30 Javascript
微信小程序左滑删除功能开发案例详解
2018/11/12 Javascript
Layui动态生成select下拉选择框不显示的解决方法
2019/09/24 Javascript
vue elementui 实现搜索栏公共组件封装的实例代码
2020/01/20 Javascript
[50:27]Secret vs VG 2018国际邀请赛小组赛BO2 第二场 8.17
2018/08/20 DOTA
python中requests小技巧
2017/05/10 Python
python 把列表转化为字符串的方法
2018/10/23 Python
Python线性拟合实现函数与用法示例
2018/12/13 Python
解决Pycharm调用Turtle时 窗口一闪而过的问题
2019/02/16 Python
python进阶之自定义可迭代的类
2019/08/20 Python
pyautogui自动化控制鼠标和键盘操作的步骤
2020/04/01 Python
keras得到每层的系数方式
2020/06/15 Python
keras实现图像预处理并生成一个generator的案例
2020/06/17 Python
Win10环境中如何实现python2和python3并存
2020/07/20 Python
详解Python中的编码问题(encoding与decode、str与bytes)
2020/09/30 Python
python反爬虫方法的优缺点分析
2020/11/25 Python
CSS的background属性及CSS3的背景图片设置总结
2016/06/13 HTML / CSS
HTML5等待加载动画效果
2017/07/27 HTML / CSS
茱莉蔻美国官网:Jurlique美国
2020/11/24 全球购物
如何掌握自荐信格式呢
2013/11/19 职场文书
采购主管的岗位职责
2013/12/17 职场文书
党员入党表决心的话
2014/03/11 职场文书
《爱如茉莉》教后反思
2014/04/12 职场文书
碧霞祠导游词
2015/02/09 职场文书
处世之道:关于真诚相待的名言推荐
2019/12/02 职场文书
python blinker 信号库
2022/05/04 Python
Spring Cloud OAuth2实现自定义token返回格式
2022/06/25 Java/Android