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标准库os.path包、glob包使用实例
Nov 25 Python
Python实现扫描局域网活动ip(扫描在线电脑)
Apr 28 Python
Python实现的HTTP并发测试完整示例
Apr 23 Python
Python的Django框架中使用SQLAlchemy操作数据库的教程
Jun 02 Python
Python黑魔法Descriptor描述符的实例解析
Jun 02 Python
numpy中的delete删除数组整行和整列的实例
May 09 Python
Python中的类与类型示例详解
Jul 10 Python
Flask框架实现的前端RSA加密与后端Python解密功能详解
Aug 13 Python
python 字典有序并写入json文件过程解析
Sep 30 Python
如何在Python项目中引入日志
May 31 Python
Python中的np.argmin()和np.argmax()函数用法
Jun 02 Python
详解Python生成器和基于生成器的协程
Jun 03 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
PHP4中session登录页面的应用
2008/07/25 PHP
PHP循环语句笔记(foreach,list)
2011/11/29 PHP
PHP简洁函数(PHP简单明了函数语法)
2012/06/10 PHP
使用Curl进行抓取远程内容时url中文编码问题示例探讨
2013/10/29 PHP
PHP实现发送邮件的方法(基于简单邮件发送类)
2015/12/17 PHP
解析WordPress中控制用户登陆和判断用户登陆的PHP函数
2016/03/01 PHP
PHP实现小偷程序实例
2016/10/31 PHP
php中html_entity_decode实现HTML实体转义
2018/06/13 PHP
laradock环境docker-compose操作详解
2019/07/29 PHP
高亮显示web页表格行的javascript代码
2010/11/19 Javascript
JQuery live函数
2010/12/24 Javascript
分别用marquee和div+js实现首尾相连循环滚动效果,仅3行代码
2011/09/21 Javascript
解析dom中的children对象数组元素firstChild,lastChild的使用
2013/07/10 Javascript
js中split函数的使用方法说明
2013/12/26 Javascript
不使用jquery实现js打字效果示例分享
2014/01/19 Javascript
js中日期的加减法
2015/05/06 Javascript
实例详解jQuery结合GridView控件的使用方法
2016/01/04 Javascript
基于Bootstrap+jQuery.validate实现表单验证
2016/05/30 Javascript
js-FCC算法-No repeats please字符串的全排列(详解)
2017/05/02 Javascript
vue按需引入element Transfer 穿梭框
2017/09/30 Javascript
vue源码解析之事件机制原理
2018/04/21 Javascript
详解React服务端渲染从入门到精通
2019/03/28 Javascript
Vue脚手架编写试卷页面功能
2020/03/17 Javascript
基于小程序请求接口wx.request封装的类axios请求
2020/07/02 Javascript
python中requests爬去网页内容出现乱码问题解决方法介绍
2017/10/25 Python
Python补齐字符串长度的实例
2018/11/15 Python
解决PyCharm控制台输出乱码的问题
2019/01/16 Python
Python3安装psycopy2以及遇到问题解决方法
2019/07/03 Python
pytorch 实现打印模型的参数值
2019/12/30 Python
解决Tensorflow 使用时cpu编译不支持警告的问题
2020/02/03 Python
Python enumerate内置库用法解析
2020/02/24 Python
北京某公司的.net笔试题
2014/03/20 面试题
心理学专业毕业生推荐信范文
2013/11/21 职场文书
经济贸易专业自荐信
2014/06/11 职场文书
浅谈JavaScript作用域
2021/12/06 Javascript
通过feDisplacementMap和feImage实现水波特效
2022/04/24 HTML / CSS