SIFT四部曲之——极值检测和定位

版权声明:本文为博主原创文章,未经博主允许不得转载。博客不用于商业活动,博主对博客的使用,拥有最终解释权本文为原创作品,未经本人同意,禁止转载,禁止用于商业用途!本人对博客使用拥有最终解释权欢迎关注我的网上图书室:晨凫追风 和 微信公众号:青春当追风

这篇博客要做的是对sift的第二个步骤进行介绍和总结。然后对opencv中的源码进行解释,因为对这一部分的理解主要是根据Opencv中的源码反推的,感谢开源的作者们!

Ok言归正传!

Sift的第二个步骤主要是在图像中找到那些尺度不变性的点,这里叫做特征点。这些特征点是由DOG金字塔中的图像通过一系列的筛选规则得到的,所以这一步骤就是为了介绍这些筛选规则,以及用这些筛选规则怎么选出代表。

首先在前面介绍一些数学的知识吧,这些知识是经过推导得到的一些结论,所以记住它们(微笑脸)。

1.有限差分法求导(这里没有推导,也不太严谨,不用怕

这个知识主要是介绍对于图像中函数的求导法则,介绍的是二元函数的求导。当然在尺度空间中,像素值f是坐标(x,y)和尺度σ的三元函数,它的求导法则可以类比。看图1和公式(1-5)这里的求导其实可以理解成,每一个像素值对哪一个方向求导,则与其他方向上的无关,就是把其他方向看成一个常数来理解。在同一层的图像中,与尺度的方向无关,所以把尺度看成一个常数。

图1

推广到三元函数,就是增加σ轴向的求导如图2,这里把y方向上的看成无关,来求导尺度轴和x方向的关系。

图2

以此类推y和σ方向上的关系:

图3

2.三阶矩阵求逆的公式

该矩阵存在逆矩阵,则它的行列式不等0,即:

所以

    

至此所要用到的一部分数学知识就讲到这里。接下来开始讲选举条例!

1.第0轮推举(阈值检测)

由于我们不能保证图片就是完全没有噪声的,所以在推选之前我们要排除一些对比度比较低的点,这些点很不稳定,容易受到干扰,本着宁缺毋滥的原则,先把不稳定因子排除。这个阈值一般是自己设定的,在opencv中设定它为:0.5*T/S,这里的T lowe 定义它为0.04,s是该点所在的层。拿到这个入场券的同学,进入下一轮选举

2.第一轮选举(极值检测)

在上一篇博客里讲到了,某某某证明了,高斯差分金字塔里的极值点比一般的(角点,Hessian,梯度函数)这些方法得到的点性质稳定。所以很自然的就要用到极值点来做候选人。在sift算法里面极值点的检测方法是(图5):

图5

对图像中的每一个点进行遍历,判断每一个点是否是极值,判断的标准是,把这个点与相邻的层,上下层9+9=18个点和同一层中8个点,共18+8=26个点进行比较,看这个点是否是最大值,还是最小值,若是,则保留下来,当做候选人。

3.第二轮选举(极值点精确定位)

在sift算法中,把尺度看成连续的,而在前面的极值检测中,只是把它当成离散点来计算,于是极值点的检测就会出现图6的情况,这怎么能符合Lowe同学严谨的风格呢?

图6

所以在这一轮的选举中,我们的目标就是找到精确的极值点(成仙之前当然要经过考验)其实这里的精确点的位置,是一个亚像素级别的概念,比如一个数的个位十位百位都确定了,要更加精细的去找这个数的小数点后的那个数据,就用插值来计算。

这里又是一系列的数学公式(打公式好麻烦呀!哭!)数学是根本呀!大一高数学不好,本科兵败如山倒!

言归正传!这里我们需要高数和线性代数的一些知识。高数中提过,函数f(x)在x0处可以进行泰勒展开。于是我们也在这个检测到的极值点处处,对它进行泰勒级数展开(这里只展开到二阶项,高次项砍掉),以此来拟合这个三维二次函数。于是得到

把上面的式子写成矢量的形式:

这真是个伟大的公式!,好了我们拟合出来了该点附近的函数了,表示拟合之后连续空间下面的插值点坐标,设表示:相对于插值中心的偏移量,这下公式(13)可以用偏移量表示:

(14)

该咋求极值呢?当然是求导啦!导数为0的那个点(排除驻点的情况,非要考虑驻点的话,不好意思,我也不会,微笑脸)于是得到下面的求导式子:

(15)

让导数等于0,就可以得到极值点下的相对于插值中心的偏移量:

(16)

把式(16)代入式(14)可以得到该极值点下的极值为:

(17)

Ok,其实到这里,已经把精确的极值点找到了,但是真的是这样的吗?答案当然不是。上述的知识只是告诉我们找到偏移量的一个大的方向,真正的细节并没有说明白!

这里该注意几个问题:

  1. 当求出来的偏移量很大的时候,这时就表明精确的极值点已经完全偏离了离散比较得到的极值点,这时候就得删除它
  2. 当求出来的偏移量大于0.5,(只要x,y,和σ任意一个量大于0.5)就表示这个插值点偏离了插值中心,这时候就应该改变插值中心,继续使用上
  • 29
    点赞
  • 88
    收藏
    觉得还不错? 一键收藏
  • 29
    评论
SIFT(尺度不变特征变换)是一种常用的图像特征点检测和匹配算法。它的实质是在不同尺度空间上查找特征点,主要包括以下几个步骤\[1\]: 1. 提取关键点:通过在不同尺度下对图像进行下采样,构建图像金字塔,并在每个采样图像上进行特征点检测。 2. 描述关键点:对每个特征点附加详细的信息,也就是所谓的描述子。描述子可以理解为一个用来描述特征点的向量,后面的特征点匹配就是对每个特征点之间描述子是否相似的判断。 3. 特征点匹配:通过对两方特征点的两两比较,找出相互匹配的若干对特征点,建立景物间的对应关系。 其中,SIFT算法是一种常用的特征点检测算法。它采用FAST特征点检测算法来检测特征点,FAST算法定义了特征点的条件,即某个像素点和它周围领域足够多的像素点处于不同区域。对于灰度图,特征点处的灰度值与周围足够多像素的灰度值不同。然后,采用BRIEF描述子来描述每个特征点,BRIEF描述子是用来描述特征点的向量。最后,通过对描述子的相似性进行判断,实现特征点的匹配\[2\]。 总结起来,SIFT特征点检测和匹配是通过在不同尺度空间上查找特征点,并对特征点进行描述和匹配,从而实现图像间的对应关系。这种算法具有尺度不变性和旋转不变性等优点,因此在图像处理和计算机视觉领域得到广泛应用\[3\]。 #### 引用[.reference_title] - *1* *3* [sift特征检测与匹配](https://blog.csdn.net/zencci/article/details/104702649)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^insertT0,239^v3^insert_chatgpt"}} ] [.reference_item] - *2* [特征点的检测与匹配(ORB,SIFT,SURFT比较)[opencv-python]](https://blog.csdn.net/weixin_43151193/article/details/125222481)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^insertT0,239^v3^insert_chatgpt"}} ] [.reference_item] [ .reference_list ]

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值