SIFT原理和python实现学习笔记

17 篇文章 0 订阅
2 篇文章 0 订阅
本文介绍了SIFT(尺度不变特征变换)算法的基本原理,包括其尺度不变性、关键点检测和描述符生成。作者分享了使用Python的OpenCV库实现SIFT匹配的过程,并展示了匹配效果图。尽管SIFT算法在处理速度上较慢,但其在图像检索和匹配方面的鲁棒性得到了验证。文章还提供了代码示例和实际测试结果,讨论了传统算法与现代深度学习方法在图像检索领域的应用比较。
摘要由CSDN通过智能技术生成

写在前面

-----------------------------------------------------------------------------------------------

最近在研究图像检索这方面知识,作为记录。

文章内容理解需要一定的算法基础,当然也有可能是我能力有限,表述不清楚。

声明:本文章仅供个人学习之用,由于作者能力有限,相关观点和信息仅供参考。

如有侵权请联系。

欢迎各位读者老爷提问和交流。

我们的目标是星辰大海!

一. 算法介绍

Scale-invariant feature transform,SIFT,尺度不变特征变换算法,相对来说比较老,但是是传统方法的基础,比较经典。

引入了尺度的概念,在不同尺度的空间查找特征点。提取极值点,位置,尺度,旋转不变量。

因此算法的特点

1.对物体遮挡部分侦测效果好

2.与影像的大小和旋转无关,对光线、噪声、微视角改变的容忍度高。

3. 3个或者3个以上的SIFT物体特征就可以计算出位置与方位,辨识速度接近实时,适合在海量数据库中快速精确匹配。

二. 算法基本原理

什么是尺度不变性?

同一个物体,人眼在距离10米和距离100米看到的大小不一样,是因为视网膜上成像的图像尺寸发生了变化。

而尺度不变,意味着不管距离10米或者距离100米,都能够对图像进行清晰的辨认。

SIFT算法原理大致拆分如下

01 适当地模糊和加倍输入图像以生成图像金字塔的基础图像

02 计算图像金字塔中的层数

03 创建一个尺度列表(大小与高斯核大小相同)

04 反复模糊和下采样基础图像

05 减去相邻的高斯图像对,形成高斯查分的DoG图像金字塔

06 识别关键点

07 通过删除重复项并将它们转换为输入图像大小来清理这些关键点

08 为每个关键点生成描述符

09 特征点匹配

算法内容我不献丑了,我也是简单了解学习。

参考文献[1]算是一篇保姆级文章。

我自己也实际上测试了下,效果图入下:

图1: 左1为原图,右1为待匹配的图

代码跑起来速度特别慢,测试这两张图片耗时3分钟,我一度以为我电脑卡了。

 图2:匹配效果图


单纯看效果来说, 需要表达的都体现到了,而且图像也存在偏移和旋转倾斜,也能匹配。

接下来还是测试了python自带opencv包实现

三. python代码实现

写在前面,

关于python使用cv的sift问题请参考如下链接

问题:sift = cv2.xfeatures2d.SIFT_create()-2022解决办法

 ok,开始。

01 加载图像,调用库函数,计算关键点。

sift = cv2.SIFT_create()
cv2.drawKeypoints(image2, kp2, None)

效果如下:

 

 

  图3: 原图(上)与关键点图(下)对比

 step02

使用knn求取在空间中距离最近的k个数据点,进行分类

matcher = cv2.BFMatcher()
raw_matches = matcher.knnMatch(des1, des2, k = 2)

 step03

使用像素点进行适应矩阵求解

H, status = cv2.findHomography(ptsA, ptsB, cv2.RANSAC, ransacReprojThreshold);
    imgOut = cv2.warpPerspective(image2, H, (image1.shape[1], image1.shape[0]),
                                 flags=cv2.INTER_LINEAR + cv2.WARP_INVERSE_MAP)

最终匹配结果如下:

图4 匹配结果图

与上面的代码对比,cv自带的算法运行时间更快。 

 

确实能够达到实时监测的效果。

ps:

写在后面

SIFT作为传统算法,我个人只做了解,后续还是研究深度学习在图像检索方向的应用。

(有需要代码和效果图的小伙伴可以联系我)

 

参考文献

【1】 Python实现SIFT算法,附详细公式推导和代码

  • 2
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
未使用包,python源码实现SIFT 尺度不变特征转换(Scale-invariant feature transform或SIFT)是一种电脑视觉的算法用来侦测与描述影像中的局部性特征,它在空间尺度中寻找极值点,并提取出其位置、尺度、旋转不变量,此算法由 David Lowe在1999年所发表,2004年完善总结。 其应用范围包含物体辨识、机器人地图感知与导航、影像缝合、3D模型建立、手势辨识、影像追踪和动作比对。 此算法有其专利,专利拥有者为英属哥伦比亚大学。 局部影像特征的描述与侦测可以帮助辨识物体,SIFT 特征是基于物体上的一些局部外观的兴趣点而与影像的大小和旋转无关。对于光线、噪声、些微视角改变的容忍度也相当高。基于这些特性,它们是高度显著而且相对容易撷取,在母数庞大的特征数据库中,很容易辨识物体而且鲜有误认。使用 SIFT特征描述对于部分物体遮蔽的侦测率也相当高,甚至只需要3个以上的SIFT物体特征就足以计算出位置与方位。在现今的电脑硬件速度下和小型的特征数据库条件下,辨识速度可接近即时运算。SIFT特征的信息量大,适合在海量数据库中快速准确匹配。 SIFT算法的特点有: 1. SIFT特征是图像的局部特征,其对旋转、尺度缩放、亮度变化保持不变性,对视角变化、仿射变换、噪声也保持一定程度的稳定性; 2. 独特性(Distinctiveness)好,信息量丰富,适用于在海量特征数据库中进行快速、准确的匹配; 3. 多量性,即使少数的几个物体也可以产生大量的SIFT特征向量; 4. 高速性,经优化的SIFT匹配算法甚至可以达到实时的要求; 5. 可扩展性,可以很方便的与其他形式的特征向量进行联合。 SIFT算法可以解决的问题: 目标的自身状态、场景所处的环境和成像器材的成像特性等因素影响图像配准/目标识别跟踪的性能。而SIFT算法在一定程度上可解决: 1. 目标的旋转、缩放、平移(RST) 2. 图像仿射/投影变换(视点viewpoint) 3. 光照影响(illumination) 4. 目标遮挡(occlusion) 5. 杂物场景(clutter) 6. 噪声 SIFT算法的实质是在不同的尺度空间上查找关键点(特征点),并计算出关键点的方向。SIFT所查找到的关键点是一些十分突出,不会因光照,仿射变换和噪音等因素而变化的点,如角点、边缘点、暗区的亮点及亮区的暗点等。 Lowe将SIFT算法分解为如下四步: 1. 尺度空间极值检测:搜索所有尺度上的图像位置。通过高斯微分函数来识别潜在的对于尺度和旋转不变的兴趣点。 2. 关键点定位:在每个候选的位置上,通过一个拟合精细的模型来确定位置和尺度。关键点的选择依据于它们的稳定程度。 3. 方向确定:基于图像局部的梯度方向,分配给每个关键点位置一个或多个方向。所有后面的对图像数据的操作都相对于关键点的方向、尺度和位置进行变换,从而提供对于这些变换的不变性。 4. 关键点描述:在每个关键点周围的邻域内,在选定的尺度上测量图像局部的梯度。这些梯度被变换成一种表示,这种表示允许比较大的局部形状的变形和光照变化。 本文沿着Lowe的步骤,参考Rob Hess及Andrea Vedaldi源码,详解SIFT算法的实现过程。 未使用包,python源码实现
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值