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中使用glob和rmtree删除目录子目录及所有文件的例子
Nov 21 Python
浅析Python中的多进程与多线程的使用
Apr 07 Python
在Python的Django框架中用流响应生成CSV文件的教程
May 02 Python
python getopt详解及简单实例
Dec 30 Python
Python+matplotlib+numpy绘制精美的条形统计图
Jan 02 Python
Python3中正则模块re.compile、re.match及re.search函数用法详解
Jun 11 Python
使用python 3实现发送邮件功能
Jun 15 Python
使用python根据端口号关闭进程的方法
Nov 06 Python
Python实现堡垒机模式下远程命令执行操作示例
May 09 Python
numpy数组广播的机制
Jul 12 Python
python Pandas如何对数据集随机抽样
Jul 29 Python
python自动化调用百度api解决验证码
Apr 13 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/06/14 PHP
thinkPHP框架动态配置用法实例分析
2018/06/14 PHP
ThinkPHP5.1框架页面跳转及修改跳转页面模版示例
2019/05/06 PHP
Laravel框架实现多个视图共享相同数据的方法详解
2019/07/09 PHP
10个基于jQuery或JavaScript的WYSIWYG 编辑器整理
2010/05/06 Javascript
根据IP的地址,区分不同的地区,查看不同的网站页面的js代码
2013/02/26 Javascript
JavaScript输入邮箱自动提示实例代码
2014/01/13 Javascript
jQuery实现3D文字特效的方法
2015/03/10 Javascript
JavaScript知识点整理
2015/12/09 Javascript
jQuery基于Ajax方式提交表单功能示例
2017/02/10 Javascript
AngularJS中使用three.js的实例详解
2017/07/21 Javascript
Vue组件开发之LeanCloud带图形校验码的短信发送功能
2017/11/07 Javascript
浅谈HTTP 缓存的那些事儿
2018/10/17 Javascript
mock.js实现模拟生成假数据功能示例
2019/01/15 Javascript
前端插件之Bootstrap Dual Listbox使用教程
2019/07/23 Javascript
html+jQuery实现拖动滑块图片拼图验证码插件【移动端适用】
2019/09/10 jQuery
VUE项目axios请求头更改Content-Type操作
2020/07/24 Javascript
浅析 Vue 3.0 的组装式 API(一)
2020/08/31 Javascript
python append、extend与insert的区别
2016/10/13 Python
插入排序_Python与PHP的实现版(推荐)
2017/05/11 Python
python 计算两个日期相差多少个月实例代码
2017/05/24 Python
python numpy和list查询其中某个数的个数及定位方法
2018/06/27 Python
手把手教你pycharm专业版安装破解教程(linux版)
2019/09/26 Python
家得宝加拿大家装网上商店:The Home Depot加拿大
2016/08/27 全球购物
Fnac西班牙官网:法国文化和电子产品零售商
2021/03/14 全球购物
普通大学毕业生自荐信
2013/11/04 职场文书
工商管理毕业生推荐信
2013/12/24 职场文书
财务科科长岗位职责
2014/03/10 职场文书
成语的广告词
2014/03/19 职场文书
《鹬蚌相争》教学反思
2014/04/22 职场文书
忠诚教育心得体会
2014/09/03 职场文书
2016党校学习心得体会
2016/01/07 职场文书
导游词之云南丽江-泸沽湖
2019/09/26 职场文书
Go Gin实现文件上传下载的示例代码
2021/04/02 Golang
使用Djongo模块在Django中使用MongoDB数据库
2021/06/20 Python
SpringBoot2零基础到精通之数据与页面响应
2022/03/22 Java/Android