SIFT和SURF特征提取分析(小结篇)_sift surf计算复杂度-程序员宅基地

                              

引言

本节主要是David Lowe对于SIFT算法的阐述Distinctive Image Features from Scale-Invariant Keypoints和 Herbert Bay, Andreas Ess, Tinne Tuytelaars, Luc Van Gool, 对于SURF算法的 阐述 以及小结。

SIFT特征提取小结

根据LOWE的文章(更为SIFT特征提取分析,请见详参考博文 尺度不变特征变换(SIFT)特征提取分析 ) 。

首先, 先对SIFT算法的主要原理、流程做一个简要阐述。由于 该算法的核心是“尺度不变”特征点的提取 ,所以特征点得筛选资源从 高斯金字塔产生的差分高斯空间中的局部极值点获得 。

  • 第一、个人认为关于高斯金字塔以及拉普拉斯算子的原理可以作以下直观理解:SIFT算法的尺度不变特征点大多是边缘上的点(更进一步是边缘上的角点(如矩形的四个顶点),关于边缘上非角点得去除会在下文提到),而边缘上的点即是高频(亮度与邻接点相差大)的点,它的亮度变化率取到一个极大值,即亮度变化率的变化率(亮度的二阶导数)等于0,即拉普拉斯算子△I=0。
  • 第二、由于当图像与高斯核卷积后,I(x,y)变为G(X,Y,σ),求二阶偏导数可以转化为求关于尺度σ的一阶偏导数(高斯核即二维正态分布是热传导方程的一个解),且求这个偏导数更易实现,所以引入以σ为变量的高斯差分空间。对高斯差分空间可作如下直观理解:当人眼由远及近地观察一个物体,物体的细节会变化,但大体轮廓不会变化,由此可以通过比较站在远处和近处的两个画面来确定轮廓。事实上高斯差分空间中的图像看起来像浮雕,轮廓非常明显,所以求出高斯差分空间邻接图像的极值点即可。】

其次,进行初步取得的极值点得筛选工作,分两步,筛出特征点。

  • 用二次曲面来模拟每个极值点附近的图像亮度函数,求出理论上极值点,设定一个界限,舍去实际点与理论点偏差大于界限的点。
  • 去除仅落在边缘上而非角点的点。这类应被舍去的点有一个特征:沿着边缘切线方向的图像函数平缓(曲率小),垂直边缘方向陡峭(曲率大)。由于Hessian矩阵的两个特征值是X,Y方向的曲率,所以求出每个极值点两个特征值的比值,设定一个界限,舍去不合格的点即可。

最后,选定特征点后,就对每个特征点进行描述子(模拟人眼视网膜)的制作(因为特征点对图像的变化过于敏感,而描述子不敏感)。

  • 由于SIFT对旋转有不变性,所以为每个特征点计算一个方向,这是制作描述子的预备工作。(具体实现是选定一个特征点附近的区域,算出区域中所有点的梯度大小以及方向,然后将这些方向分为36组,按梯度大小和正态分布函数加权,绘制0~360°的直方图,再用二次函数拟合求直方图的最大值点,得到一个特征点的总方向(若有次最大值点接近极大值点,则将这一特征点分为二个在同一坐标的点,但分别使用两个不同方向)。
  • 确定方向后将区域内所有点的梯度方向转过一个上述确定的主方向的角度。然后将区域分为4*4=16个正方形子区域,每个区域中的点按梯度大小和正态分布加权,绘制出8个方向的直方图,所以每个特征点可得到一个128维的描述子向量(因为要使特征点对对比度变化不敏感,还需对向量归一化处理)。这些描述子即可用于匹配,即寻找另一幅图像中与该特征点128维向量几何距离最短的点。LOWE提到的方法是用K-D树搜索,但由于高维情形耗时较长,需加一个近似最优的贪心法剪枝和一个卡时出解的策略求得近似解。至此,SIFT算法完成。
除上述对SIFT算法的理论可行性讨论外,在SIFT实现的过程中还有一个重要的方面是一些参数的选择,例如一个OCTAVE几个图,一个描述子几个子区域,以及舍弃极值点时界限阈值(threshold)的选择,这些都关系到识别的精确度和算法的效率。Lowe在文章中给出了推荐数据,但在具体情况下可能可以再作微调(如识别的场景不同)。

SIFT算法时间复杂度的瓶颈在于描述子的建立和匹配 ,如何优化对特征点的描述方法是提升SIFT效率的关键,PCA-SIFT等算法在这里做了优化。

SURT特征提取小结

SURF算法 (更为SURF特征提取分析,请见详参考博文 SURF特征提取分析 ) 是对SIFT算法的改进,其基本结构、步骤与SIFT相近,但具体实现的过程有所不同。SURF算法的优点是速度远快于SIFT且稳定性好。

首先, 先对SURF算法的中 特征点的提取

  • 在SURF算法中,特征点的判据为某像素亮度的Hessian矩阵的行列式(Dxx*Dyy-Dxy*Dxy)为一个极值。由于Hessian矩阵的计算需要用到偏导数的计算,这一般通过像素点亮度值与高斯核的某一方向偏导数卷积而成;在SURF算法里,为提高算法运行速度,在精度影响很小的情况下,用近似的盒状滤波器(0,1,1组成的box filter)代替高斯核。因为滤波器仅有0,-1,1,因此卷积的计算可以用积分图像(Integral image)来优化(O(1)的时间复杂度),大大提高了效率。每个点需计算Dxx,Dyy,Dxy三个值,故需要三个滤波器;用它们滤波后,得到一幅图像的响应图(Response image,其中每个像素的值为原图像素的Dxx*Dyy-Dxy*Dxy)。对图像用不同尺寸的滤波器进行滤波,得到同一图像在不同尺度的一系列响应图,构成一个金字塔(该金字塔无需像SIFT中的高斯一样进行降采样,即金字塔每组中的每层图像分辨率相同)。
  • 特征点的检测与SIFT一致,即若某点的Dxx*Dyy-Dxy*Dxy大于其邻域的26个点(与SIFT一致)的Dxx*Dyy-Dxy*Dxy,则该点为特征点。特征点的亚像素精确定位与SIFT一致。
其次,描述子的建立
  • 为保证特征点描述子的旋转不变性,需对每个特征点计算主方向。计算主方向的过程如下:
    1. 统计以特征点为中心,正比于特征点尺度的某个数位半径,张角为60°的扇形区域内所有像素点的 sumX=(y方向小波变换响应)*(高斯函数),sumY=(x方向小波变换响应)*(高斯函数), 计算合成向量角度θ=arctan(sumY/sumX),模长sqrt(sumy*sumy+sumx*sumx)。
    2. 将扇形沿逆时针旋转(一般取步长为0.1个弧度),以同样方法计算合成向量。
    3. 求出各方向扇形的合成向量模长最大值,其对应的角度即特征点主方向。
  • 描述子的建立过程如下:
    1. 选定以特征点为中心的一块正方形区域,将其旋转与主方向对齐。
    2. 将正方形分为4x4的16个子区域,对每个区域进行Haar 小波变换(同样用积分图像加速),得到4个系数。
    3. 由上述两步,生成4x4x4=64维向量,即描述子,用它可以进行匹配等工作。

此算法的优点 在于大量合理使用积分图像降低运输量,而且在运用的过程中并未降低精度(小波变换,Hessian矩阵行列式检测都是成熟有效的手段) 。在时间上,SURF运行速度大约为SIFT的3倍;在质量上,SURF的鲁棒性很好,特征点识别率较SIFT高,在视角、光照、尺度变化等情形下,大体上都优于SIFT。

关于Image Engineering& Computer Vision更多讨论与交流,敬请关注本博客和新浪微博songzi_tea.

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/u014792364/article/details/64438419

智能推荐

oracle 12c 集群安装后的检查_12c查看crs状态-程序员宅基地

文章浏览阅读1.6k次。安装配置gi、安装数据库软件、dbca建库见下:http://blog.csdn.net/kadwf123/article/details/784299611、检查集群节点及状态:[root@rac2 ~]# olsnodes -srac1 Activerac2 Activerac3 Activerac4 Active[root@rac2 ~]_12c查看crs状态

解决jupyter notebook无法找到虚拟环境的问题_jupyter没有pytorch环境-程序员宅基地

文章浏览阅读1.3w次,点赞45次,收藏99次。我个人用的是anaconda3的一个python集成环境,自带jupyter notebook,但在我打开jupyter notebook界面后,却找不到对应的虚拟环境,原来是jupyter notebook只是通用于下载anaconda时自带的环境,其他环境要想使用必须手动下载一些库:1.首先进入到自己创建的虚拟环境(pytorch是虚拟环境的名字)activate pytorch2.在该环境下下载这个库conda install ipykernelconda install nb__jupyter没有pytorch环境

国内安装scoop的保姆教程_scoop-cn-程序员宅基地

文章浏览阅读5.2k次,点赞19次,收藏28次。选择scoop纯属意外,也是无奈,因为电脑用户被锁了管理员权限,所有exe安装程序都无法安装,只可以用绿色软件,最后被我发现scoop,省去了到处下载XXX绿色版的烦恼,当然scoop里需要管理员权限的软件也跟我无缘了(譬如everything)。推荐添加dorado这个bucket镜像,里面很多中文软件,但是部分国外的软件下载地址在github,可能无法下载。以上两个是官方bucket的国内镜像,所有软件建议优先从这里下载。上面可以看到很多bucket以及软件数。如果官网登陆不了可以试一下以下方式。_scoop-cn

Element ui colorpicker在Vue中的使用_vue el-color-picker-程序员宅基地

文章浏览阅读4.5k次,点赞2次,收藏3次。首先要有一个color-picker组件 <el-color-picker v-model="headcolor"></el-color-picker>在data里面data() { return {headcolor: ’ #278add ’ //这里可以选择一个默认的颜色} }然后在你想要改变颜色的地方用v-bind绑定就好了,例如:这里的:sty..._vue el-color-picker

迅为iTOP-4412精英版之烧写内核移植后的镜像_exynos 4412 刷机-程序员宅基地

文章浏览阅读640次。基于芯片日益增长的问题,所以内核开发者们引入了新的方法,就是在内核中只保留函数,而数据则不包含,由用户(应用程序员)自己把数据按照规定的格式编写,并放在约定的地方,为了不占用过多的内存,还要求数据以根精简的方式编写。boot启动时,传参给内核,告诉内核设备树文件和kernel的位置,内核启动时根据地址去找到设备树文件,再利用专用的编译器去反编译dtb文件,将dtb还原成数据结构,以供驱动的函数去调用。firmware是三星的一个固件的设备信息,因为找不到固件,所以内核启动不成功。_exynos 4412 刷机

Linux系统配置jdk_linux配置jdk-程序员宅基地

文章浏览阅读2w次,点赞24次,收藏42次。Linux系统配置jdkLinux学习教程,Linux入门教程(超详细)_linux配置jdk

随便推点

matlab(4):特殊符号的输入_matlab微米怎么输入-程序员宅基地

文章浏览阅读3.3k次,点赞5次,收藏19次。xlabel('\delta');ylabel('AUC');具体符号的对照表参照下图:_matlab微米怎么输入

C语言程序设计-文件(打开与关闭、顺序、二进制读写)-程序员宅基地

文章浏览阅读119次。顺序读写指的是按照文件中数据的顺序进行读取或写入。对于文本文件,可以使用fgets、fputs、fscanf、fprintf等函数进行顺序读写。在C语言中,对文件的操作通常涉及文件的打开、读写以及关闭。文件的打开使用fopen函数,而关闭则使用fclose函数。在C语言中,可以使用fread和fwrite函数进行二进制读写。‍ Biaoge 于2024-03-09 23:51发布 阅读量:7 ️文章类型:【 C语言程序设计 】在C语言中,用于打开文件的函数是____,用于关闭文件的函数是____。

Touchdesigner自学笔记之三_touchdesigner怎么让一个模型跟着鼠标移动-程序员宅基地

文章浏览阅读3.4k次,点赞2次,收藏13次。跟随鼠标移动的粒子以grid(SOP)为partical(SOP)的资源模板,调整后连接【Geo组合+point spirit(MAT)】,在连接【feedback组合】适当调整。影响粒子动态的节点【metaball(SOP)+force(SOP)】添加mouse in(CHOP)鼠标位置到metaball的坐标,实现鼠标影响。..._touchdesigner怎么让一个模型跟着鼠标移动

【附源码】基于java的校园停车场管理系统的设计与实现61m0e9计算机毕设SSM_基于java技术的停车场管理系统实现与设计-程序员宅基地

文章浏览阅读178次。项目运行环境配置:Jdk1.8 + Tomcat7.0 + Mysql + HBuilderX(Webstorm也行)+ Eclispe(IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持)。项目技术:Springboot + mybatis + Maven +mysql5.7或8.0+html+css+js等等组成,B/S模式 + Maven管理等等。环境需要1.运行环境:最好是java jdk 1.8,我们在这个平台上运行的。其他版本理论上也可以。_基于java技术的停车场管理系统实现与设计

Android系统播放器MediaPlayer源码分析_android多媒体播放源码分析 时序图-程序员宅基地

文章浏览阅读3.5k次。前言对于MediaPlayer播放器的源码分析内容相对来说比较多,会从Java-&amp;amp;gt;Jni-&amp;amp;gt;C/C++慢慢分析,后面会慢慢更新。另外,博客只作为自己学习记录的一种方式,对于其他的不过多的评论。MediaPlayerDemopublic class MainActivity extends AppCompatActivity implements SurfaceHolder.Cal..._android多媒体播放源码分析 时序图

java 数据结构与算法 ——快速排序法-程序员宅基地

文章浏览阅读2.4k次,点赞41次,收藏13次。java 数据结构与算法 ——快速排序法_快速排序法