网站首页 > 技术文章 正文
我们有时候在看一件事物的时候,无论物体离我们多远,或者说角度怎么变化,我们好像都可以大概分辨出是什么东西或者人,这是什么原因呢?主要是因为事物本身局部具有一些稳定的特征,他们具有不变性(亮度,形状,尺度等)。只要抓住这些特征,就很容易辨认出物体,那计算机是怎么抓住这些特征的呢。在图像处理中,使用SIFT(Scale Invariant Feature Transform)算法来获取这些特征图像特征。
什么是sift特征
此方法由David Lowe于1999年发表于ICCV(International Conference on Computer Vision),并经过5年的整理和完善,在2004年发表于IJCV(International journal of computer vision)。由于在此之前的目标检测算法对图片的大小、旋转非常敏感,而SIFT算法是一种基于局部兴趣点的算法,因此不仅对图片大小和旋转不敏感,而且对光照、噪声等影响的抗击能力也非常优秀,因此,该算法在性能和适用范围方面较于之前的算法有着质的改变。这使得该算法对比于之前的算法有着明显的优势,所以,一直以来它都在目标检测和特征提取方向占据着重要的地位。
sift算法的流程
Sifts算法主要有个流程组成:
- DOG(高斯差分)尺度空间的极值检测,
- 特征点定位
- 特征方向赋值
- 特征点描述
先来说一下什么叫尺度空间,我们知道,人的眼睛看一张图像,会随着距离的变化而变化(距离越远,越模糊),而不管距离远景,我们都能抓住事物的不变特征。所以我们需要实现模拟现实中图像在人的眼中随着距离变化的效果(越远图像越小、模糊,),计算机中则用尺度空间来模拟距离的远近效果。
模糊程度通常是通过高斯模糊来创建,当我们对原图像使用高斯模糊创建了一组图像后,就相当于创建了一个尺度空间,通过图像的模糊程度来模拟人在距离物体由远到近时物体在视网膜上成像过程,距离物体越近其尺度越大图像也越模糊,使用不同的参数,模糊图像(分辨率不变),是尺度空间的另一种表现形式。公式如下:不解释,不深究,具体去了解高斯模糊的知识。
不同σ的高斯函数决定了对图像的平滑程度,越大的σ值对应的图像越模糊。
图 1 不同的尺度空间
而图像随距离远近的大小变化可以用图像金字塔来表示。通过图像的向下采样(图像越来越小),生成一组大小不一样的的图像。最大的在底层,上一层大小一般为下一层的一半。(具体去了解图像金字塔的知识,金字塔的作用:https://www.zhihu.com/question/28748001)
DOG(高斯差分)尺度空间的创建流程
首先,创建出高斯的尺度空间,一个高斯的尺度空间可以看成一个由“组”和“层”组成的空间,“组”表示的是通过金字塔采样得到的不同分辨率的图像,而“层”则表示在各自的“组”内,通过高斯平滑得到的分辨率相同模糊程度不同的图像。如果用一个横纵坐标表示的话:这两个量合起来(O,L)就构成了高斯金字塔的尺度空间,也就是说以高斯金字塔的组(O)作为二维坐标系的一个坐标,不同层(L)作为另一个坐标,则给定的一组坐标(O,L)就可以唯一确定高斯金字塔中的一幅图像。
........
第1组:有n层
第2组:有n层,每一层的模糊程度不同
第2组:有n层,每一层的模糊程度不同
第1组:有n层
图 2 高斯金字塔
高斯金字塔创建流程:
1、先将原图像扩大一倍之后作为高斯金字塔的第1组第1层,将第1组第1层图像经高斯卷积(高斯平滑或称高斯滤波)之后作为第1组金字塔的第2层,高斯卷积函数为:
对于参数 σ,在SIFT算子中取的是固定值 1.6
2、将 σ 乘以一个比例系数k,等到一个新的平滑因子 σ = k*σ,用它来平滑第1组第2层图像,结果图像作为第3层。
3、如此重复,最后得到L层图像,在同一组中,每一层图像的尺寸都是一样的,只是平滑系数不一样。它们对应的平滑系数分别为:0,σ,kσ,k^2σ,k^3σ……k^(L-2)σ。
4,将第1组倒数第三层图像作为比例因子为2的降采样,得到的图像作为第2组的第1层,然后对第2组的第1层图像作平滑因子为 σ 的高斯平滑,得到第2组的第2层,就像步骤2中一样,如此得到第2组的L层图像,同组内它们的尺寸是一样的,对应的平滑系数分别为:0,σ,kσ,k^2σ,k^3σ……k^(L-2)σ。但是在尺寸方面第2组是第1组图像的一半。
这样反复执行,就可以得到一共O组,每组L层,共计O*L个图像,这些图像一起就构成了高斯金字塔
当创建好高斯金字塔后,就可以创建出高斯差分金字塔(DOG),用高斯金字塔同组内的相邻两图像一一相减,就可以得到高斯差分金字塔空间。
图 3 高斯差分金字塔(DOG)
每一组在层数上,DOG金字塔比高斯金字塔少一层。后续Sift特征点的提取都是在DOG金字塔上进行的。
DOG(高斯差分)尺度空间的极值检测
为了寻找尺度空间的极值点,DOG尺度空间每个像素点要和其同一图像和同一组中的所有相邻点进行比较(组内比较),当其大于(或者小于)所有相邻点时,改点就是极值点(候选关键点)。如图所示,中间的检测点要和其所在图像的3×3邻域8个像素点,以及其相邻的上下两层的3×3领域18个像素点,共26个像素点进行比较。最终得到DOG上的所有极值点(特征最显著的点)。
图 4 比较示意图
(注意:每组图像的第一层和最后一层是无法进行比较取得极值的。为了满足尺度变换的连续性,在每一组图像的顶层继续使用高斯模糊生成3幅图像,高斯金字塔每组有S+3层图像,DoG金字塔的每组有S+2层图像。)
特征点定位
通过比较检测得到的DoG的局部极值点,是在离散的空间搜索得到的,由于离散空间是对连续空间采样得到的结果,因此在离散空间找到的极值点,不一定是真正意义上的极值点。因此要设法将不满足条件的点剔除掉。
假设得到DoG空间的极值点的拟合函数为f(x)(为了说明简单:这里拿一个一元函数举例子,实际上DoG尺度空间函数—D(x,y,σ) 是个多元函数,x,y可表示在图像中的坐标),已知某一点(上一步已经知道,假设0点)的值(DoG的局部极值点),那么可以根据泰勒级数对f(x)进行个近似展开。f’(0)和f’’(0)可以根据相邻两个点的值近似取得(好像是拉格朗日公式,忘了,这里不必深究,注意重点)。
所以真实的图像函数可以近似为:
近似代替
这时候通过取一阶导数为0即可得到函数极值点
,根据
可求得x。
接着是消除边界响应
根据论文里面的描述,前面的高斯卷积操作会增加边界点响应,(由于某种原因,在进行滤波等操作的时候,边缘的“权重”变强。比如边缘对 Band pass就可能会存在影响效果加强的情况,这样带来的后果就是,如果某噪音正好在边缘上,就会被更放大。因此我们会采取一些手段抑制边缘效应。),所以这里要消除他,这里直接大概了解方法即可:通过计算出一个矩阵的特征值,从而计算出一个值,根据设定的阈值消除掉不符合条件的点。
特征点方向赋值
(L为高斯尺度空间函数L(x,y,σ),也就是不同层的函数
特征点描述
参考文献
网址:https://www.cnblogs.com/wj-1314/p/11981974.html
https://blog.csdn.net/shyjhyp11/article/details/118794045
https://blog.csdn.net/sin_geek/article/details/52661670
猜你喜欢
- 2024-10-30 爆肝整理5000字!HTAP的关键技术有哪些?| StoneDB学术分享会#3
- 2024-10-30 「经验分享」MindStudio基于AscendCL应用开发流程
- 2024-10-30 spark中 RDD代码演示 spark中的rdd
- 2024-10-30 TypeScript 4.7 正式发布「2022.05.24」「官文全文翻译」
- 2024-10-30 读书笔记丨《离线和实时大数据开发实战》
- 2024-10-30 视觉SLAM面试题汇总-2019年秋招第一部分
- 2024-10-30 一文了解GaussDB 200整体描述 一文快速了解中国5000年历史
- 2024-10-30 「Flink实时数据分析系列」10. Flink 和流式应用运维(下)
- 2024-10-30 综述:特征点检测与匹配 常用的特征点检测算法
- 2024-10-30 深度学习中的3个秘密:集成,知识蒸馏和蒸馏
你 发表评论:
欢迎- 最近发表
-
- 在 Spring Boot 项目中使用 activiti
- 开箱即用-activiti流程引擎(active 流程引擎)
- 在springBoot项目中整合使用activiti
- activiti中的网关是干什么的?(activiti包含网关)
- SpringBoot集成工作流Activiti(完整源码和配套文档)
- Activiti工作流介绍及使用(activiti工作流会签)
- SpringBoot集成工作流Activiti(实际项目演示)
- activiti工作流引擎(activiti工作流引擎怎么用)
- 工作流Activiti初体验及在数据库中生成的表
- Activiti工作流浅析(activiti6.0工作流引擎深度解析)
- 标签列表
-
- oraclesql优化 (66)
- 类的加载机制 (75)
- feignclient (62)
- 一致性hash算法 (71)
- dockfile (66)
- 锁机制 (57)
- javaresponse (60)
- 查看hive版本 (59)
- phpworkerman (57)
- spark算子 (58)
- vue双向绑定的原理 (68)
- springbootget请求 (58)
- docker网络三种模式 (67)
- spring控制反转 (71)
- data:image/jpeg (69)
- base64 (69)
- java分页 (64)
- kibanadocker (60)
- qabstracttablemodel (62)
- java生成pdf文件 (69)
- deletelater (62)
- com.aspose.words (58)
- android.mk (62)
- qopengl (73)
- epoch_millis (61)
本文暂时没有评论,来添加一个吧(●'◡'●)