python实现图像拼接


Posted in Python onMarch 05, 2020

本文实例为大家分享了python实现图像拼接的具体代码,供大家参考,具体内容如下

1.待拼接的图像

python实现图像拼接

python实现图像拼接

2. 基于SIFT特征点和RANSAC方法得到的图像特征点匹配结果

python实现图像拼接

3.图像变换结果

python实现图像拼接

4.代码及注意事项

import cv2
import numpy as np
 
 
def cv_show(name, image):
 cv2.imshow(name, image)
 cv2.waitKey(0)
 cv2.destroyAllWindows()
 
 
def detectAndCompute(image):
 image = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)
 sift = cv2.xfeatures2d.SIFT_create()
 (kps, features) = sift.detectAndCompute(image, None)
 kps = np.float32([kp.pt for kp in kps]) # 得到的点需要进一步转换才能使用
 return (kps, features)
 
 
def matchKeyPoints(kpsA, kpsB, featuresA, featuresB, ratio = 0.75, reprojThresh = 4.0):
 # ratio是最近邻匹配的推荐阈值
 # reprojThresh是随机取样一致性的推荐阈值
 matcher = cv2.BFMatcher()
 rawMatches = matcher.knnMatch(featuresA, featuresB, 2)
 matches = []
 for m in rawMatches:
  if len(m) == 2 and m[0].distance < ratio * m[1].distance:
   matches.append((m[0].queryIdx, m[0].trainIdx))
 kpsA = np.float32([kpsA[m[0]] for m in matches]) # 使用np.float32转化列表
 kpsB = np.float32([kpsB[m[1]] for m in matches])
 (M, status) = cv2.findHomography(kpsA, kpsB, cv2.RANSAC, reprojThresh)
 return (M, matches, status) # 并不是所有的点都有匹配解,它们的状态存在status中
 
 
def stich(imgA, imgB, M):
 result = cv2.warpPerspective(imgA, M, (imgA.shape[1] + imgB.shape[1], imgA.shape[0]))
 result[0:imageA.shape[0], 0:imageB.shape[1]] = imageB
 cv_show('result', result)
 
 
def drawMatches(imgA, imgB, kpsA, kpsB, matches, status):
 (hA, wA) = imgA.shape[0:2]
 (hB, wB) = imgB.shape[0:2]
 # 注意这里的3通道和uint8类型
 drawImg = np.zeros((max(hA, hB), wA + wB, 3), 'uint8')
 drawImg[0:hB, 0:wB] = imageB
 drawImg[0:hA, wB:] = imageA
 for ((queryIdx, trainIdx),s) in zip(matches, status):
  if s == 1:
   # 注意将float32 --> int
   pt1 = (int(kpsB[trainIdx][0]), int(kpsB[trainIdx][1]))
   pt2 = (int(kpsA[trainIdx][0]) + wB, int(kpsA[trainIdx][1]))
   cv2.line(drawImg, pt1, pt2, (0, 0, 255))
 cv_show("drawImg", drawImg)
 
 
# 读取图像
imageA = cv2.imread('./right_01.png')
cv_show("imageA", imageA)
imageB = cv2.imread('./left_01.png')
cv_show("imageB", imageB)
# 计算SIFT特征点和特征向量
(kpsA, featuresA) = detectAndCompute(imageA)
(kpsB, featuresB) = detectAndCompute(imageB)
# 基于最近邻和随机取样一致性得到一个单应性矩阵
(M, matches, status) = matchKeyPoints(kpsA, kpsB, featuresA, featuresB)
# 绘制匹配结果
drawMatches(imageA, imageB, kpsA, kpsB, matches, status)
# 拼接
stich(imageA, imageB, M)

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Python 相关文章推荐
python中defaultdict的用法详解
Jun 07 Python
Django自定义分页效果
Jun 27 Python
python3.6.3安装图文教程 TensorFlow安装配置方法
Jun 24 Python
python爬取网易云音乐评论
Nov 16 Python
对sklearn的使用之数据集的拆分与训练详解(python3.6)
Dec 14 Python
python使用插值法画出平滑曲线
Dec 15 Python
由Python编写的MySQL管理工具代码实例
Apr 09 Python
Django使用uwsgi部署时的配置以及django日志文件的处理方法
Aug 30 Python
Python 字符串、列表、元组的截取与切片操作示例
Sep 17 Python
Python线程条件变量Condition原理解析
Jan 20 Python
PageFactory设计模式基于python实现
Apr 14 Python
Python爬虫过程解析之多线程获取小米应用商店数据
Nov 14 Python
Python求两个字符串最长公共子序列代码实例
Mar 05 #Python
Python操作MongoDb数据库流程详解
Mar 05 #Python
Python文字截图识别OCR工具实例解析
Mar 05 #Python
win10下opencv-python特定版本手动安装与pip自动安装教程
Mar 05 #Python
python+OpenCV实现图像拼接
Mar 05 #Python
windows下Pycharm安装opencv的多种方法
Mar 05 #Python
解决pycharm中opencv-python导入cv2后无法自动补全的问题(不用作任何文件上的修改)
Mar 05 #Python
You might like
php面向对象的方法重载两种版本比较
2008/09/08 PHP
PHP 服务器配置(使用Apache及IIS两种方法)
2009/06/01 PHP
如何用javascript去掉字符串里的所有空格
2007/02/08 Javascript
将光标定位于输入框最右侧实现代码
2012/12/04 Javascript
JQuery实现点击div以外的位置隐藏该div窗口
2013/09/13 Javascript
js验证IP及子网掩码的合法性有效性示例
2014/04/30 Javascript
jquery实现图片预加载
2015/12/25 Javascript
JavaScript原生编写《飞机大战坦克》游戏完整实例
2017/01/04 Javascript
jQuery EasyUI Panel面板组件使用详解
2017/02/28 Javascript
AngularJS 霸道的过滤器小结
2017/04/26 Javascript
Vue AST源码解析第一篇
2017/07/19 Javascript
JS与HTML结合实现流程进度展示条思路详解
2017/09/03 Javascript
JS获取表格视图所选行号的ids过程解析
2020/02/21 Javascript
vue前端和Django后端如何查询一定时间段内的数据
2021/02/28 Vue.js
python实现统计代码行数的方法
2015/05/22 Python
在Django的模型和公用函数中使用惰性翻译对象
2015/07/27 Python
深入讲解Python函数中参数的使用及默认参数的陷阱
2016/03/13 Python
Linux RedHat下安装Python2.7开发环境
2017/05/20 Python
linux环境下的python安装过程图解(含setuptools)
2017/11/22 Python
用Python写王者荣耀刷金币脚本
2017/12/21 Python
Python实现一个服务器监听多个客户端请求
2018/04/12 Python
python 请求服务器的实现代码(http请求和https请求)
2018/05/25 Python
Python中最大递归深度值的探讨
2019/03/05 Python
pandas实现to_sql将DataFrame保存到数据库中
2019/07/03 Python
python3用PIL把图片转换为RGB图片的实例
2019/07/04 Python
python实现的爬取电影下载链接功能示例
2019/08/26 Python
python 利用jinja2模板生成html代码实例
2019/10/10 Python
Django CSRF认证的几种解决方案
2020/03/03 Python
python打包生成so文件的实现
2020/10/30 Python
医药工作岗位求职信分享
2013/12/31 职场文书
在校学生职业规划范文
2014/01/08 职场文书
银行柜员与客户起冲突检讨书
2014/09/27 职场文书
个人自我剖析材料
2014/09/30 职场文书
2014小学数学教研组工作总结
2014/12/06 职场文书
创业计划书之酒厂
2019/10/14 职场文书
Pytorch中使用ImageFolder读取数据集时忽略特定文件
2022/03/23 Python