opencv3.1的SIFT特征检测参数图文详解

本文转载自:http://livezingy.com/sift-in-opencv3-1/

 SIFT算法的实现过程大致如下:对源图像进行高斯模糊处理,根据源图尺寸和相关设定参数生成图像的高斯金字塔和高斯差分金字塔(DOG尺度空间),在DOG尺度空间中搜索特征点,计算尺度,构建特征描述子。本文以SIFT的参数为主线来尝试说明SIFT算法的原理。

      SIFT算法图像匹配的效果图如下图所示,接下来会有文章分析surf特征检测,sift特征匹配和surf特征匹配的代码在下一篇文章中将一并给出。

GoogleMatch

1. 参考资料

【OpenCV】SIFT原理与源码分析

SIFT算法详解 

上述参考资料中将SIFT算法的原理讲述的非常清楚,受益匪浅,感谢原作者。

2. SIFT构造函数参数概述

SIFT算法并未被集成到opencv3.1中,它属于opencv_contribopencv_contrib的编译方法可以参考cmake-gui和vs2013编译opencv和opencv_contrib源码.

在opencv3.1中,实现SIFT算法的文件为opencv_contrib\modules\xfeatures2d\src\sift.cpp,SIFT的构造函数:

SIFT相关参数的简要介绍如下:

nfeatures:特征点数目(算法对检测出的特征点排名,返回最好的nfeatures个特征点)。
nOctaveLayers:金字塔中每组的层数(算法中会自己计算这个值,后面会介绍)。
contrastThreshold:过滤掉较差的特征点的对阈值。contrastThreshold越大,返回的特征点越少。
edgeThreshold:过滤掉边缘效应的阈值。edgeThreshold越大,特征点越多(被过滤掉的越少)。
sigma:金字塔第0层图像高斯滤波系数,也就是σ。

       参数nfeatures指定最终返回的特征点数量,并不影响SIFT特征检测的结果,本文不对该参数进行分析。参数nOctaveLayers和sigma主要影响图像高斯金字塔的构成,而contrastThreshold和edgeThreshold则影响在DOG中寻找极值点的过程与结果。根据SIFT的四个参数的作用范围,本文先讲述以下5个部分:高斯金字塔,高斯模糊,高斯差分金字塔(DOG算子),空间极值点检测,消除极值点的边缘响应;然后本文会给出用SIFT算法进行图像匹配的范例。

3. 高斯金字塔

      首先我们来看一下SIFT算法中图像的高斯金字塔。图像的金字塔模型是指,将原始图像不断降阶采样,得到一系列大小不一的图像,由大到小,从下到上构成的塔状模型。

GaussianPrymid

      金字塔的第一层是根据参数sigma进行高斯模糊处理后的源图,第二层的尺寸则是源图像长宽各一半,第三层是第二层长宽的各一半,以此类推。金字塔的总层数由源图像中长与宽的较小值决定,计算方法如图中的nOctaves的计算公式。

       每一层金字塔总包含(nOctaveLayers+3)层相同尺寸的图像,同层金字塔尺寸相同,但每一层都进行了不同系数的高斯模糊处理,这一点会在高斯模糊一节中详述。第N层金字塔的第一层图是第N-1层金字塔的最后一层图的resize处理。

       根据金字塔层数的计算公式,我绘制了源图像尺寸与金字塔层数的趋势图。由趋势图可知,金字塔层数随图像尺寸变化及其缓慢,且不同尺寸源图像的顶层金字塔的尺寸基本相当。

nOctaves of Gaussianprymid

4. 高斯模糊

       高斯模糊是一种图像滤波器,本文讲述的高斯模糊以高斯模糊的实验结果和数据为主。高斯金字塔的每一层由个(nOctaveLayers+3)图层组成。表格中的i表示每层金字塔中图层的序号,同层金字塔不同图层之间的高斯模糊参数计算方法如下图所示。

Gaussiasigma

sigma值的大小对高斯模糊的结果到底影响有多大呢?我们先来看一下相同图片经过不同高斯模糊系数处理后的结果:

GaussiBlurCompare

5. 空间极值点检测

       在实际计算时,使用高斯金字塔每组中相邻上下两层图像相减,得到高斯差分图像,在高斯差分图像上进行极值检测。极值点的初步探查是通过同一组内各DOG相邻两层图像之间比较完成的。为了寻找DoG函数的极值点,每一个像素点要和它所有的相邻点比较,看其是否比它的图像域和尺度域的相邻点大或者小。如图所示,中间的检测点和它同尺度的8个相邻点和上下相邻尺度对应的9×2个点共26个点比较,以确保在尺度空间和二维图像空间都检测到极值点。

DOG

  初步认定某个点为极值点,需要遍历DOG金字塔中每一个点,若
a.当前点的绝对值>threshold
b.当前点的值>0,则当前点的值大于周围26个点的值;若当前点的值<0,则当前点的值小于周围26的点的值;
同时满足以上两个条件,则初步判定其为极值点。

       其中,threshold的计算公式如下:

int threshold = cvFloor(0.5 * contrastThreshold / nOctaveLayers * 255 * SIFT_FIXPT_SCALE)

       需要强调的是SIFT算法要求的输入图像深度为CV_8U,因此SIFT算法中处理的图像矩阵中的值为0~255,因此threshold应该也在此范围内才有意义。其中, SIFT_FIXPT_SCALE=1,  cvFloor为向下取整,例如0.01的cvFloor为零。所以0.01<(contrastThreshold / nOctaveLayers)<2为大范围。在此大范围之内,考虑到DOG空间的形成原理,可以计算当前图像最大值与最小值之差,根据该值进一步缩小contrastThreshold / nOctaveLayers的设定范围。

6.消除极值点的边缘响应

       在参考文献SIFT算法详解 中,作者提出“一个定义不好的高斯差分算子的极值在横跨边缘的地方有较大的主曲率,而在垂直边缘的方向有较小的主曲率。”。作者也有详细讲述SIFT算法中消除边缘响应算法的原理,这里就不再重复说明了。对于算法的使用者来讲,需要知道根据消除边缘响应算法的原理,参数edgeThreshold的设定至越小,边缘点的条件越强,滤除的极值点越多,返回的特征点越少;edgeThreshold越大,被滤掉的极值点越少,特征点越多。


  • 0
    点赞
  • 26
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
提供的源码资源涵盖了小程序应用等多个领域,每个领域都包含了丰富的实例和项目。这些源码都是基于各自平台的最新技术和标准编写,确保了在对应环境下能够无缝运行。同时,源码中配备了详细的注释和文档,帮助用户快速理解代码结构和实现逻辑。 适用人群: 适合毕业设计、课程设计作业。这些源码资源特别适合大学生群体。无论你是计算机相关专业的学生,还是对其他领域编程感兴趣的学生,这些资源都能为你提供宝贵的学习和实践机会。通过学习和运行这些源码,你可以掌握各平台开发的基础知识,提升编程能力和项目实战经验。 使用场景及目标: 在学习阶段,你可以利用这些源码资源进行课程实践、课外项目或毕业设计。通过分析和运行源码,你将深入了解各平台开发的技术细节和最佳实践,逐步培养起自己的项目开发和问题解决能力。此外,在求职或创业过程中,具备跨平台开发能力的大学生将更具竞争力。 其他说明: 为了确保源码资源的可运行性和易用性,特别注意了以下几点:首先,每份源码都提供了详细的运行环境和依赖说明,确保用户能够轻松搭建起开发环境;其次,源码中的注释和文档都非常完善,方便用户快速上手和理解代码;最后,我会定期更新这些源码资源,以适应各平台技术的最新发展和市场需求。 所有源码均经过严格测试,可以直接运行,可以放心下载使用。有任何使用问题欢迎随时与博主沟通,第一时间进行解答!

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值