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 相关文章推荐
使用Python3 编写简单信用卡管理程序
Dec 21 Python
使用Django和Python创建Json response的方法
Mar 26 Python
Python对数据进行插值和下采样的方法
Jul 03 Python
详解pandas如何去掉、过滤数据集中的某些值或者某些行?
May 15 Python
python 使用plt画图,去除图片四周的白边方法
Jul 09 Python
Python学习笔记之Zip和Enumerate用法实例分析
Aug 14 Python
基于python及pytorch中乘法的使用详解
Dec 27 Python
Python 读取xml数据,cv2裁剪图片实例
Mar 10 Python
python爬虫可以爬什么
Jun 16 Python
Django修改app名称和数据表迁移方案实现
Sep 17 Python
Django搭建项目实战与避坑细节详解
Dec 06 Python
写一个Python脚本下载哔哩哔哩舞蹈区的所有视频
May 31 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
Home Coffee Roasting
2021/03/03 咖啡文化
php中sql注入漏洞示例 sql注入漏洞修复
2014/01/24 PHP
Laravel关系模型指定条件查询方法
2019/10/10 PHP
Laravel中GraphQL接口请求频率实战记录
2020/09/01 PHP
双击滚屏-常用推荐
2006/11/29 Javascript
javascript中attachEvent用法实例分析
2015/05/14 Javascript
cocos2dx骨骼动画Armature源码剖析(三)
2015/09/08 Javascript
详解js图片轮播效果实现原理
2015/12/17 Javascript
jQuery+css实现炫目的动态块漂移效果
2016/01/28 Javascript
jQuery bt气泡实现悬停显示及移开隐藏功能的方法
2016/07/12 Javascript
值得分享的JavaScript实现图片轮播组件
2016/11/21 Javascript
VUE搭建手机商城心得和遇到的坑
2019/02/21 Javascript
微信小程序收货地址API兼容低版本解决方法
2019/05/18 Javascript
使用webpack搭建vue项目及注意事项
2019/06/10 Javascript
python插入数据到列表的方法
2015/04/30 Python
PyQt5 QSerialPort子线程操作的实现
2018/04/21 Python
python实现基于朴素贝叶斯的垃圾分类算法
2019/07/09 Python
Python Django实现layui风格+django分页功能的例子
2019/08/29 Python
django中的图片验证码功能
2019/09/18 Python
Python实现将蓝底照片转化为白底照片功能完整实例
2019/12/13 Python
Tensorflow 模型转换 .pb convert to .lite实例
2020/02/12 Python
python网络编程socket实现服务端、客户端操作详解
2020/03/24 Python
Python模拟登入的N种方式(建议收藏)
2020/05/31 Python
LG西班牙网上商店:Tienda LG Online Es
2019/07/30 全球购物
波兰在线杂货店:Polski Koszyk
2019/11/02 全球购物
俄罗斯披萨、寿司和面食送货到家服务:2 Берега
2019/12/15 全球购物
线程同步的方法
2016/11/23 面试题
初二物理教学反思
2014/01/29 职场文书
《苏珊的帽子》教学反思
2014/04/07 职场文书
搞笑的爱情检讨书
2014/10/01 职场文书
教育项目合作协议书格式
2014/10/17 职场文书
2014小学语文教学工作总结
2014/12/17 职场文书
教师党员个人总结
2015/02/10 职场文书
2015年乡镇卫生院工作总结
2015/04/22 职场文书
2015党建工作简报
2015/07/21 职场文书
SQL实现LeetCode(175.联合两表)
2021/08/04 MySQL