Loading [MathJax]/jax/output/CommonHTML/config.js
前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >【论文复现】进行不同视角图像的拼接

【论文复现】进行不同视角图像的拼接

作者头像
Eternity._
发布于 2024-12-28 02:30:17
发布于 2024-12-28 02:30:17
23300
代码可运行
举报
文章被收录于专栏:登神长阶登神长阶
运行总次数:0
代码可运行

背景描述


首先来看这样两幅图:

图1 一栋大楼的左半部分

图2 一栋大楼的右半部分

在很多情况下,我们往往会拍摄一些有重叠但是并不完整的图片。

无论对于日常的娱乐需求还是一些专业性的测绘工作,都需要我们基于这些“残缺”的图片来构建出完整的图像。

因此,本人根据先前图像处理的经验,使用一种基于SIFT特征匹配的算法来实现此任务。

算法简介


SIFT(Scale Invariant Feature Transform,尺度不变特征变换匹配算法),是由David G. Lowe在《Object Recognition from Local Scale-Invariant Features》提出的高效区域检测算法,在2004年的《Distinctive Image Features from Scale-Invariant Keypoints》中得以完善。 其主要特点如下:

(1)尺度不变性:SIFT算法可以在不同尺度的图像上检测和描述特征。这使得它对于图像中存在不同尺度的物体或图像的缩放变换具有鲁棒性。

(2)旋转不变性:SIFT算法可以检测和描述在不同旋转角度下的特征。这使得它对于图像中存在旋转变换的物体具有鲁棒性。

(3)对光照变化和视角变化具有一定的鲁棒性。

(4)提取特征:SIFT算法通过在图像中检测局部特征点(例如边缘、角点等)来提取特征。它使用一种称为DoG(Difference of Gaussian)的算法来检测图像中的特征点。

(5)描述特征:对于每个检测到的特征点,SIFT算法计算其周围区域的特征描述符,该描述符是一种对特征点的局部图像区域进行编码的向量。这些描述符对于不同的特征点具有唯一性,可以用于特征匹配和识别。

(6)特征匹配和识别:通过比较不同图像中的特征点的描述符,可以进行特征匹配和识别。SIFT算法使用一种称为RANSAC(Random Sample Consensus)的算法来寻找在多个图像中匹配的特征点,从而可以进行目标跟踪和图像配准等任务。

总而言之,SIFT算法是一种强大的图像特征提取算法,它可以在不同尺度和旋转角度下提取具有尺度不变性和旋转不变性的局部特征,并用于图像匹配、目标跟踪、图像配准等计算机视觉任务。

SIFT算法原理


这一部分简要介绍SIFT算法的执行流程。

  1. 检测尺度空间极值

图3 DOG算法示意图

  1. 关键点的精确定位 以上方法检测到的极值点是离散空间的极值点,以下通过拟合三维二次函数来精确确定关键点的位置和尺度,同时去除低对比度的关键点和不稳定的边缘响应点(因为DOG算子会产生较强的边缘响应),以增强匹配稳定性、提高抗噪声能力。
  2. 方向匹配 通过根据局部图像属性为每个关键点分配一致的方向,可以相对于该方向表示关键点描述符,从而实现图像旋转的不变性。
  3. 局部图像描述 之前的操作已经为每个关键点分配了图像位置、比例和方向。这些参数强加了一个可重复的局部 2D 坐标系,在其中描述局部图像区域,因此为这些参数提供了不变性。下一步是计算局部图像区域的描述符,该描述符具有高度独特性,对剩余变化(例如照明或 3D 视点的变化)尽可能保持不变

代码原理


为实现SIFT特征检测,主要使用到了以下的两个工具包:OpenCV,numpy。其中OpenCV是一个非常知名且受欢迎的跨平台计算机视觉库,它不仅包含常用的图像读取、显示、颜色变换,还包含一些为人熟知的经典特征检测算法,其中就包括SIFT,所以本文使用OpenCV进行读取和SIFT特征检测。numpy是一个非常优秀的数值计算库,也常用于图像的处理,这里使用numpy主要用于图像的拼接和显示。 代码的具体实现逻辑如下: (1)首先先读入待拼接的图像,例如下述代码示例中的’hanying1.jpg’和’hanying2.jpg’,然后使用opencv自带的cv2.SIFT_create()创建SIFT对象,用于计算每幅图像的特征点和特征描述符。

(2)然后对各幅图像生成的特征描述符使用Flann算法进行匹配,并筛选出匹配结果较好的特征点用于下述单应性矩阵的计算。

(3)单应矩阵估计:通过至少4对匹配的关键点对,可以使用RANSAC(随机抽样一致性)算法估计出单应矩阵H。RANSAC算法通过随机选择一部分关键点对来估计H,并通过计算其他关键点对与估计的H之间的误差,筛选出符合约束条件的关键点对,并最终得到较好的单应矩阵估计。

(4)图像视点变换:对于每个视点的图像,使用估计得到的单应矩阵H进行变换。对于输出图像的每个像素点,通过逆变换将其映射回到原始视点的坐标系中。具体来说,对于输出图像中的每个像素点(x, y),通过矩阵乘法运算得到变换后的坐标。然后,根据相应的像素值进行插值,得到变换后的像素值。

(5)图像拼接:将变换后的图像按照一定的拼接规则进行拼接,以生成最终的全景图像或多视点切换图像。拼接规则可以根据具体需求来确定,常见的方法包括:重叠区域的像素平均值、像素最大值、图像融合等。

代码部署


需要导入的核心类库为opencv和numpy

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
import cv2
import numpy as np

核心代码


首先使用cv2.SIFT_create()创建SIFT特征检测器对象,然后就需要将图片输入到特征描述对象中,用于检测相应的特征点和计算相应的特征描述符,具体代码如下:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
# 在每个图像中检测特征点和计算描述符
keypoints = []
descriptors = []
for image in images:
    gray = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)
    kp, des = sift.detectAndCompute(gray, None)
    keypoints.append(kp)
    descriptors.append(des)
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
# 特征点匹配
matcher = cv2.FlannBasedMatcher()
matches = []
for i in range(len(descriptors)-1):
    matches.append(matcher.knnMatch(descriptors[i], descriptors[i+1], k=2))
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
# 筛选匹配点
good_matches = []
for match in matches:
    good = []
    for m, n in match:
        if m.distance < 0.7 * n.distance:
            good.append(m)
    good_matches.append(good)
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
# 计算单应矩阵
homographies = []
for i, match in enumerate(good_matches):
    if len(match) >= 4:
        src_pts = np.float32([keypoints[i][m.queryIdx].pt for m in match]).reshape(-1, 1, 2)
        dst_pts = np.float32([keypoints[i+1][m.trainIdx].pt for m in match]).reshape(-1, 1, 2)
        H, _ = cv2.findHomography(src_pts, dst_pts, cv2.RANSAC, 2.0)
        homographies.append(H)
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
# 拼接图像
result = images[0]
for i in range(len(images)-1):
    result = cv2.warpPerspective(result, homographies[i], (result.shape[1]+images[i+1].shape[1], result.shape[0]))
    result[0:images[i+1].shape[0], 0:images[i+1].shape[1]] = images[i+1]

拼接结果


图4 最终拼接结果(由于拍摄时间原因,亮度存在一定差异)

其他的图片如何进行拼接?


本博客提供的两张图片为作者自行拍摄,如果读者想要拼接自己拍摄的图片,只需将代码里相应的图片路径和名称更换为自己本地的图片路径和名称即可。如果不愿添加路径信息,仅需将自己的图片放置在代码工程下,修改为图片的名称即可。 例如我重新对如下两幅图进行拼接:

只需将其放入代码工程后,在下图相应位置改为图片名即可。

拼接结果如下图:


编程未来,从这里启航!解锁无限创意,让每一行代码都成为你通往成功的阶梯,帮助更多人欣赏与学习!

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2024-12-28,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
图像配准:从SIFT到深度学习
图像配准(Image Registration)是计算机视觉中的基本步骤。在本文中,我们首先介绍基于OpenCV的方法,然后介绍深度学习的方法。
磐创AI
2019/07/30
8.4K1
图像配准:从SIFT到深度学习
关于图像配准(Image Registration)的基础知识汇总1.0
(1)图像配准(Image registration)是将同一场景拍摄的不同图像进行对齐的技术,即找到图像之间的点对点映射关系,或者对某种感兴趣的特征建立关联。
江夏四卯
2023/09/26
17.3K0
基于OpenCV全景拼接(Python)
翻译自https://www.pyimagesearch.com 基于OpenCV(Python)的图片拼接和全景图构建。“缝合”两张有重叠区域的图来创建一张全景图。构建全景图利用到了计算机视觉和图像处理技术有:关键点检测、局部不变特征、关键点匹配、RANSAC(Random Sample Consensus,随机采样一致性)和透视变形。因为在处理关键点检测和局部不变性在OpenCV 2.4.X和OpenCV 3.X中有很大的不同,比如SIFT和SURF。这里将给出兼容两个版本的代码。在之后的博客会解决多张图片的拼接,而不仅仅只是针对两张图片。
一点儿也不潇洒
2018/08/07
7.5K0
基于OpenCV全景拼接(Python)
单应性矩阵应用-基于特征的图像拼接
前面写了一篇关于单应性矩阵的相关文章,结尾说到基于特征的图像拼接跟对象检测中单应性矩阵应用场景。得到很多人留言反馈,让我继续写,于是就有这篇文章。这里有两张照片(我手机拍的),背景是我老家的平房,周围是一片开阔地带,都是麦子。有图为证:
OpenCV学堂
2020/02/21
3.2K1
熟练掌握CV中最基础的概念:图像特征,看这篇万字的长文就够了
目录 1,图像特征 2,角点特征 3,使用OpenCV和PIL进行特征提取和可视化 4,特征匹配 5,图像拼接
deephub
2020/05/09
4K0
熟练掌握CV中最基础的概念:图像特征,看这篇万字的长文就够了
计算机视觉方向简介 | 图像拼接
作者戴金艳,公众号:计算机视觉life, 编辑部成员.首发原文链接计算机视觉方向简介 | 图像拼接
用户1150922
2019/08/01
1.5K0
使用OpenCV进行图像全景拼接
图像拼接是计算机视觉中最成功的应用之一。如今,很难找到不包含此功能的手机或图像处理API。在本文中,我们将讨论如何使用Python和OpenCV进行图像拼接。也就是,给定两张共享某些公共区域的图像,目标是“缝合”它们并创建一个全景图像场景。当然也可以是给定多张图像,但是总会转换成两张共享某些公共区域图像拼接的问题,因此本文以最简单的形式进行介绍。
小白学视觉
2022/01/18
2K0
使用OpenCV进行图像全景拼接
图像的拼接—-RANSAC算法
1.RANSAC算法介绍 RANSAC算法的基本假设是样本中包含正确数据(inliers,可以被模型描述的数据),也包含异常数据(outliers,偏离正常范围很远、无法适应数学模型的数据),即数据集中含有噪声。这些异常数据可能是由于错误的测量、错误的假设、错误的计算等产生的。同时RANSAC也假设,给定一组正确的数据,存在可以计算出符合这些数据的模型参数的方法。
全栈程序员站长
2022/09/06
2.4K0
图像的拼接—-RANSAC算法
Python实现图像的全景拼接
图像的全景拼接,即“缝合”两张具有重叠区域的图来创建一张全景图。其中用到了计算机视觉和图像处理技术有:关键点特征检测、局部不变特征、关键特征点匹配、RANSAC(Random Sample Consensus,随机采样一致性)和透视变形。
用户8544541
2022/01/27
1.6K0
Python实现图像的全景拼接
超详讲解图像拼接/全景图原理和应用 | 附源码
我们探索了许多特征提取算子,如SIFT,SURF,BRISK和ORB。你可以使用这款Colab笔记本,甚至可以用你的照片试试。[这里我已经调试好源码并上传到github上面]
AI算法与图像处理
2019/09/17
10K2
超详讲解图像拼接/全景图原理和应用 | 附源码
使用C++的OpenCV进行SIFT特征检测与匹配
其他算法如SURF、AKAZE等可类似修改,但注意SIFT这些是浮点数特征描述符,而ORB这些是二进制特征描述符,因此在特征匹配时注意区分是L2还是Hamming。
小锋学长生活大爆炸
2022/05/09
2.6K0
使用C++的OpenCV进行SIFT特征检测与匹配
apap图像全景拼接
图像配准(apap)是将两张场景相关的图像进行映射,寻找其中的关系,多用在医学图像配准、图像拼接、不同摄像机的几何标定等方面,其研究也较为成熟。OpenCv中的stitching类就是使用了2007年的一篇论文(Automatic panoramic image stitching using invariant features)实现的。虽然图像配准已较为成熟,但其实其精度、鲁棒性等在某些场合仍不足够,如光线差异很大的两张图片、拍摄角度差异很大的图片等。2013年,Julio Zaragoza等人发表了一种新的图像配准算法Apap(As-Projective-As-Possible Image Stitching with Moving DLT),该算法的效果还是不错的,比opencv自带的auto-stitch效果要好。而2015年也有一篇cvpr是介绍图像配准(Non-rigid Registration of Images with Geometric and Photometric Deformation by Using Local Affine Fourier-Moment Matching),其效果貌似很牛,但没有源码,难以检验。
全栈程序员站长
2022/11/09
1.3K0
apap图像全景拼接
干货 | 基于特征的图像配准用于缺陷检测
经典的特征匹配算法有SIFT、SURF、ORB等,这三种方法在OpenCV里面都已实现。SURF基本就是SIFT的全面升级版,有 SURF基本就不用考虑SIFT,而ORB的强点在于计算时间,以下具体比较:
OpenCV学堂
2020/03/18
3K0
OpenCV 入门教程:SIFT和SURF特征描述
SIFT (尺度不变特征变换)和 SURF (加速稳健特征)是图像处理中常用的特征描述算法,用于提取图像中的关键点和生成对应的特征描述子。这些算法具有尺度不变性、旋转不变性和光照不变性等特点,适用于图像匹配、目标识别和三维重建等应用。本文将以 SIFT 和 SURF 特征描述为中心,为你介绍使用 OpenCV 进行特征提取的基本原理、步骤和实例。
小蓝枣
2023/07/11
1.7K2
【图像配准】SIFT算法原理及二图配准拼接
本篇开始,将进入图像配准领域的研究。 图像拼接主要有SIFT, BRISK, ORB, AKAZE等传统机器学习算法以及SuperPoint等深度学习算法,在后续将一一进行研究和实验。本篇主要来研究SIFT算法的原理和应用。
zstar
2023/02/02
6.2K0
【图像配准】SIFT算法原理及二图配准拼接
全面综述:图像特征提取与匹配技术
链接 | https://zhuanlan.zhihu.com/p/133301967
AI算法与图像处理
2020/08/28
6.2K0
全面综述:图像特征提取与匹配技术
2维特征Feature2D—特征点的图像匹配
基于特征点的图像匹配是图像处理中经常会遇到的问题,手动选取特征点太麻烦了。比较经典常用的特征点自动提取的办法有Harris特征、SIFT特征、SURF特征。
MachineLP
2022/05/09
5780
2维特征Feature2D—特征点的图像匹配
指纹识别实战--基于TensorFlow实现
注:本文选自中国水利水电出版社出版的《深度学习实战:基于TensorFlow2.X的计算机视觉开发应用 》一书,略有改动。经出版社授权刊登于此。
Color Space
2022/09/26
1.7K0
OpenCV中ORB特征提取与匹配
OpenCV中ORB特征提取与匹配 FAST特征点定位 ORB - (Oriented Fast and Rotated BRIEF)算法是基于FAST特征检测与BRIEF特征描述子匹配实现,相比BR
OpenCV学堂
2018/04/04
5.3K0
OpenCV中ORB特征提取与匹配
OpenCV4.5.x 中SIFT特征匹配调用演示
点击上方蓝字关注我们 微信公众号:OpenCV学堂 关注获取更多计算机视觉与深度学习知识 OpenCV4.4版本以后已经把SIFT跟SURF特征提取又重新get回来了,可以不需要编译OpenCV源码,直接下载官方预编译版本的就可以直接使用了。但是很多人还以为必须要编译源码才能使用SIFT特征检测的函数!如果还不知道SIFT特征是什么,就看这里的这篇文章就好啦。 OpenCV SIFT特征算法详解与使用 01 创建SIFT特征提取器 下面就来验证一下是否真的可以了,请看步骤与过程,首先创建SIFT特征提取器
OpenCV学堂
2022/08/29
1.6K0
OpenCV4.5.x 中SIFT特征匹配调用演示
相关推荐
图像配准:从SIFT到深度学习
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验