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 相关文章推荐
web.py中调用文件夹内模板的方法
Aug 26 Python
python使用Tkinter显示网络图片的方法
Apr 24 Python
详细讲解用Python发送SMTP邮件的教程
Apr 29 Python
Python实现统计单词出现的个数
May 28 Python
浅析Python数据处理
May 02 Python
python 重定向获取真实url的方法
May 11 Python
Python3.5实现的罗马数字转换成整数功能示例
Feb 25 Python
pyqt 实现为长内容添加滑轮 scrollArea
Jun 19 Python
Python操作qml对象过程详解
Sep 26 Python
使用TensorFlow对图像进行随机旋转的实现示例
Jan 20 Python
Python3 selenium 实现QQ群接龙自动化功能
Apr 17 Python
解决pycharm导入numpy包的和使用时报错:RuntimeError: The current Numpy installation (‘D:\\python3.6\\lib\\site-packa的问题
Dec 08 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中mysqli_affected_rows作用行数返回值分析
2014/12/26 PHP
PHP中curl_setopt函数用法实例分析
2015/04/16 PHP
php使用Jpgraph绘制简单X-Y坐标图的方法
2015/06/10 PHP
php fread读取文件注意事项
2016/09/24 PHP
PHP实现负载均衡的加权轮询方法分析
2018/08/22 PHP
dwr spring的集成实现代码
2009/03/22 Javascript
Javascript的数组与字典用法与遍历对象的属性技巧
2012/11/07 Javascript
动态的绑定事件addEventListener方法的使用
2014/01/24 Javascript
JavaScript中使用typeof运算符需要注意的几个坑
2014/11/08 Javascript
JS关闭窗口时产生的事件及用法示例
2016/08/20 Javascript
微信小程序开发之实现选项卡(窗口顶部TabBar)页面切换
2016/11/25 Javascript
JS中页面与页面之间超链接跳转中文乱码问题的解决办法
2016/12/15 Javascript
BootStrap daterangepicker 双日历控件
2017/06/02 Javascript
Vuex利用state保存新闻数据实例
2017/06/28 Javascript
vuejs点击class变化的实例
2018/09/05 Javascript
NodeJS 将文件夹按照存放路径变成一个对应的JSON的方法
2018/10/17 NodeJs
对 Vue-Router 进行单元测试的方法
2018/11/05 Javascript
详解在网页上通过JS实现文本的语音朗读
2019/03/28 Javascript
vue-router两种模式区别及使用注意事项详解
2019/08/01 Javascript
Vue监听滚动实现锚点定位(双向)示例
2019/11/13 Javascript
Vue中使用Lodop插件实现打印功能的简单方法
2019/12/19 Javascript
es6中使用map简化复杂条件判断操作实例详解
2020/02/19 Javascript
Python实现Const详解
2015/01/27 Python
python通过pil模块将raw图片转换成png图片的方法
2015/03/16 Python
python去掉空白行的多种实现代码
2018/03/19 Python
python实现门限回归方式
2020/02/29 Python
如何基于python对接钉钉并获取access_token
2020/04/21 Python
python多线程实现同时执行两个while循环的操作
2020/05/02 Python
HTML5添加鼠标悬浮音响效果不使用FLASH
2014/04/23 HTML / CSS
金融专业大学生自我评价
2014/01/09 职场文书
父亲八十大寿答谢词
2014/01/23 职场文书
2014年安全员工作总结
2014/11/13 职场文书
2015年公务员试用期工作总结
2015/05/28 职场文书
2016年推广普通话宣传周活动总结
2016/04/06 职场文书
如何使用Python提取Chrome浏览器保存的密码
2021/06/09 Python
Android实现获取短信验证码并自动填充
2023/05/21 Java/Android