探索Superpoint与LightGlue:神奇的图像拼接技术

探索Superpoint与LightGlue:神奇的图像拼接技术

Superpoint-LightGlue

图像示例:由Superpoint和LightGlue驱动的图像拼接结果

项目简介

在中,作者融合了SuperpointLightGlue这两个强大的深度学习工具,创建了一种创新的图像拼接方案。通过自动特征点检测、匹配和优化,该解决方案能够将多张照片无缝地融合成一张全景图,为摄影爱好者和开发者提供了一种全新的视觉体验。

技术分析

Superpoint:精准的特征点检测与描述

Superpoint基于深度神经网络,训练出一种可以自监督学习的特征点检测器和描述符。它能够在各种复杂环境下稳定地提取关键点,并生成具有强鲁棒性的特征描述符,用于图像间的精确匹配。这种能力对于图像拼接中的对齐至关重要。

LightGlue:智能图像缝合

LightGlue是一个灵活的图像配准库,其主要功能在于图像几何变换和拼接的优化。它可以根据Superpoint提供的特征点信息,计算出最佳的图像融合策略,从而实现平滑过渡,消除重叠区域的不连续性。

应用场景

  1. 全景摄影:对于喜欢拍摄风景或城市风光的摄影师,此项目可以帮助他们快速、高质量地制作全景图片。
  2. 虚拟现实(VR):在VR内容创作中,图像拼接是构建沉浸式环境的基础,Superpoint和LightGlue提供了高效的解决方案。
  3. 无人机测绘:在航拍地图生成过程中,它能有效地处理大量图像并进行无缝整合。
  4. 图像修复与增强:当部分图像受损时,可以借助图像拼接技术来恢复缺失的部分。

特点与优势

  • 自动化:整个过程自动化程度高,减少了人工参与的繁琐工作。
  • 高性能:基于深度学习的方法,能在复杂场景中保持良好的性能。
  • 可扩展性:轻量级设计,易于与其他计算机视觉任务集成。
  • 开源:代码完全开源,允许用户根据需求进行调整和定制。

结语

无论是业余爱好还是专业应用,Superpoint与LightGlue的结合都为我们提供了强大的图像拼接工具。通过这个项目,你可以轻松地利用现代AI技术来创造令人惊叹的视觉效果。如果你对此感兴趣,不妨动手试试,探索更多的可能性吧!


注意: 在实际使用前,请确保你具备相关的编程背景,熟悉Python和深度学习库如TensorFlow或PyTorch。在遇到问题时,可以通过查看项目的文档或在GitHub上提交问题寻求帮助。

  • 3
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
import cv2 as cv import numpy as np def cv_show(name,img): cv.imshow(name,img) cv.waitKey(0) cv.destroyAllWindows() def detectAndDescribe(image): gray = cv.cvtColor(image,cv.COLOR_BGR2GRAY) sift = cv.xfeatures2d.SIFT_create() (kps,features)=sift.detectAndCompute(image,None)#这里的kps是一个特征点对象,,属性有.pt关键点坐标 #.angle关键点方向 .response响应强度 .size该点的直径大小 kps = np.float32([kp.pt for kp in kps])#此刻得到kps特征点对象中每一个特征点的坐标。 return (kps,features) def matchKeypoints(kpsA,kpsB,features1,features2,ratio): bf = cv.BFMatcher() rawMatches = bf.knnMatch(features1,features2,2)#rawMatcher是一个Dmatch型对象,属性有.distance描述符间距离 #.trainIdx样本图像特征点标识符,.queryIdx测试图像的特征点标识符,.imgIdx训练图像的索引 matches = [] for m,n in rawMatches: if m.distance 4: pts1 = np.float32([kpsA[i] for (_,i) in matches])#将测试图像的坐标储存到Pts1里 pts2 = np.float32([kpsB[i] for (i,_) in matches])#将样本图像的坐标储存到pts2里 # 计算视角变换矩阵H #参数一,测试图像的特征点坐标,参数二,样本图像的特征点坐标,参数三,RANSAC算法: #RANSCA原理, 因为拟合一条直线只需要两个点,因此我们每次随机选取两个点,做出直线,划定一个距离,判断落在直线周围距离范围点的个数, # 不断的迭代,直到找出拟合的直线,使得点落在上面最多的拟合曲线 #参数四:参数范围1~10,原图像的点经过变换后点与目标图像上对应点的误差,超过了就是outlier (H, status) = cv.findHomography(pts1, pts2, cv.RANSAC, 5) return (matches, H, status) return None imageA = cv.imread("E:/opencv/picture/right1.jpg") imageB = cv.imread("E:/opencv/picture/left1.png") (kpsA,features1)=detectAndDescribe(imageA) (kpsB,features2)=detectAndDescribe(imageB) M = matchKeypoints(kpsA, kpsB, features1, features2, 0.75) (matches, H, status) = M # 将图片A进行视角变换,result是变换后图片 result = cv.warpPerspective(imageA, H, (imageA.shape[1] + imageB.shape[1], imageB.shape[0])) cv_show('result1',result) result[0:imageB.shape[0], 0:imageB.shape[1]] = imageB cv_show('result2', result) 经常遇到的一个错误: new style getargs format but argument is not a tuple 针对这句代码:result = cv.warpPerspective(imageA,M,[imageA.shape[1]+imageB.shape[1],max(imageA.shape[0],imageB.shape[0])]) 原因是size那个参数应该是tuple(),而不是list[]。即应该是()而不是[]。 下面讲一下这个案例的大体过程: 1.首先我们是通过SIFT算法找到两张图(right,left)的特征点及特征向量,并把特征点的坐标储存起来。 2.通过蛮力匹配算法的得到kWmatches对象,将kWmatches对象的queryIdx和trainIdx给存起来,其中features1对应的图像为样本图像 3.求出样本图像的特征点坐标和测试图像的特征点坐标,找出这两坐标矩阵的H变换公式(利用RANSAC算法),将H变换公式对right图像做透视变换,得到拼接后的右边图像 4.将left原图赋给result对应的ROI区域,大功告成。
好的,首先需要安装OpenCV和PyTorch,然后安装SuperGlueSuperPoint: ```python pip install opencv-python pip install torch torchvision pip install superglue-cuda100 pip install superpoint ``` 接下来是代码实现: ```python import cv2 import numpy as np import torch import superglue_cuda import superpoint # 加载模型 device = torch.device('cuda' if torch.cuda.is_available() else 'cpu') superpoint = superpoint.SuperPointFrontend(weights_path='superpoint_v1.pth', nms_dist=4, conf_thresh=0.015, nn_thresh=0.7, cuda=True) superpoint = superpoint.to(device) superglue = superglue_cuda.SuperGlue({'descriptor_dim': 256, 'weights': 'indoor.pth'}) superglue = superglue.to(device) # 加载图像 img1 = cv2.imread('img1.jpg') img2 = cv2.imread('img2.jpg') # 转换为灰度图像 gray1 = cv2.cvtColor(img1, cv2.COLOR_BGR2GRAY) gray2 = cv2.cvtColor(img2, cv2.COLOR_BGR2GRAY) # 提取特征点和描述符 kpts1, desc1, heatmap1 = superpoint.run(torch.from_numpy(gray1).unsqueeze(0).float().to(device)) kpts2, desc2, heatmap2 = superpoint.run(torch.from_numpy(gray2).unsqueeze(0).float().to(device)) # 进行匹配 matches = superglue({'descriptors0': desc1, 'descriptors1': desc2}) # 提取匹配的点 mkpts1 = kpts1[matches[0].indices0] mkpts2 = kpts2[matches[0].indices1] # 进行图像拼接 H, mask = cv2.findHomography(mkpts2[:, :2], mkpts1[:, :2], cv2.RANSAC, 5.0) result_img = cv2.warpPerspective(img2, H, (img1.shape[1] + img2.shape[1], img1.shape[0])) result_img[0:img1.shape[0], 0:img1.shape[1]] = img1 # 显示结果 cv2.imshow('Result', result_img) cv2.waitKey(0) cv2.destroyAllWindows() ``` 这个代码会将图片img2拼接到img1上。可以根据需要修改图片的文件名和路径。注意,SuperPointSuperGlue只能处理单通道的灰度图像,因此在进行特征提取和描述符匹配之前需要将图像转换为灰度图像。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

姬如雅Brina

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值