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中条件选择和循环语句使用方法介绍
Mar 13 Python
python每隔N秒运行指定函数的方法
Mar 16 Python
python遍历数组的方法小结
Apr 30 Python
Python调用微信公众平台接口操作示例
Jul 08 Python
Django入门使用示例
Dec 12 Python
opencv改变imshow窗口大小,窗口位置的方法
Apr 02 Python
对python多线程SSH登录并发脚本详解
Feb 14 Python
python 处理telnet返回的More,以及get想要的那个参数方法
Feb 14 Python
解决Django加载静态资源失败的问题
Jul 28 Python
python模拟预测一下新型冠状病毒肺炎的数据
Feb 01 Python
python 链接sqlserver 写接口实例
Mar 11 Python
python 实现Harris角点检测算法
Dec 11 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分页时出现的Fatal error的解决方法
2011/04/18 PHP
对PHP语言认识上需要避免的10大误区
2014/06/12 PHP
分享PHP源码批量抓取远程网页图片并保存到本地的实现方法
2015/12/01 PHP
php微信公众平台开发之微信群发信息
2016/09/13 PHP
php中实现进程锁与多进程的方法
2016/09/18 PHP
php从身份证获取性别和出生年月
2017/02/09 PHP
php自定义截取中文字符串-utf8版
2017/02/27 PHP
解决laravel5中auth用户登录其他页面获取不到登录信息的问题
2019/10/08 PHP
Javascript操纵Cookie实现购物车程序
2007/02/15 Javascript
javascript基础第一章 JavaScript与用户端
2010/07/22 Javascript
js 创建书签小工具之理论
2011/02/25 Javascript
基于jQuery的公告无限循环滚动实现代码
2012/05/11 Javascript
jQuery:节点(插入,复制,替换,删除)操作
2013/03/04 Javascript
jQuery .attr()和.removeAttr()方法操作元素属性示例
2013/07/16 Javascript
仅9张思维导图帮你轻松学习Javascript 就这么简单
2016/06/01 Javascript
js判断浏览器是否支持严格模式的方法
2016/10/04 Javascript
Angular的事件和表单详解
2016/12/26 Javascript
Angular 向组件传递模板的两种方法
2018/02/23 Javascript
Javascript中绑定click事件的四种方式介绍
2018/10/26 Javascript
在移动端使用vue-router和keep-alive的方法示例
2018/12/02 Javascript
python装饰器初探(推荐)
2016/07/21 Python
python flask中静态文件的管理方法
2018/03/20 Python
python实现数独游戏 java简单实现数独游戏
2018/03/30 Python
python3利用venv配置虚拟环境及过程中的小问题小结
2018/08/01 Python
python实现从pdf文件中提取文本,并自动翻译的方法
2018/11/28 Python
在Python 不同级目录之间模块的调用方法
2019/01/19 Python
详解Python中pandas的安装操作说明(傻瓜版)
2019/04/08 Python
基于h5py的使用及数据封装代码
2019/12/26 Python
Django封装交互接口代码
2020/07/12 Python
html5 input属性使用示例
2013/06/28 HTML / CSS
世界最大的票务市场:viagogo
2017/02/16 全球购物
寻找完美的房车租赁:RVShare
2019/02/23 全球购物
文案策划专业自荐信
2014/07/07 职场文书
2014年保卫科工作总结
2014/12/05 职场文书
小学母亲节活动总结
2015/02/10 职场文书
2015年教务主任工作总结
2015/07/22 职场文书