SIFT算法学习笔记(下)

作者: 开飞机的乔巴 | 来源:发表于2019-08-17 16:24 被阅读4次

    本博客内容来源于网络以及其他书籍,结合自己学习的心得进行重编辑,因为看了很多文章不便一一标注引用,如图片文字等侵权,请告知删除。

    传统2D计算机视觉学习笔记目录------->传送门
    传统3D计算机视觉学习笔记目录------->传送门

    本文将SIFT算法学习笔记(上)中继续的内容。在上篇中我们描述完了怎么确定sift的关键点,以及展示了实验效果,这边主要解释上篇中没有说的内容,分别是SIFT算法步骤中的: SIFT关键点方向确定、SIFT特征点描述,以及SIFT是怎么保证效果的。那么开始。

    SIFT算法具体流程

    3. 方向确定

    为什么要确定方向,确定啥方向?(一脸懵逼)
    为了使描述符具有旋转不变性,需要利用图像的局部特征为给每一个关键点分配一个基准方向。这样就算目标旋转,其他特征都相对与基准方向,并不会因为目标旋转而改变。那么怎么求这个基准方向呢?

    我们通过求极值点周围像素点的梯度来为极值点赋予方向,像素点的梯度表示为 则其梯度幅值为: 梯度的方向为

    我们求出了像素的梯度了,那么到底要求极值点周围哪些点呢?
    我们统计的是以该特征点为圆心,以该特征点所在的高斯图像的尺度 σ 的4.5倍为半径的范围内像素点。

    现在我们确定了并求出了周围的像素点的像素值,那么怎么去算主方向呢?

    我们使用直方图统计邻域内像素的梯度和方向。梯度直方图将0~360度的方向范围分为36个柱(bins),其中每柱10度。直方图的峰值方向代表了关键点的主方向(这里也是离散的,是不是可以拟合成连续的求成更准确的主方向?大家想一想,代码中是这样做的)。如下图:

    有时候一个特征点的角度可能会有好几个角度与峰值相差是比较少的,这样我们就可以用多个角度来辅助说明特征点的角度。我们把这个角度的差值定义为80%,只要大于最大峰值的80%就定为该特征点的辅助方向。对于辅助方向的处理,我们这样就是把该关键点复制成多份关键点,并将方向值分别赋给这些复制后的关键点。所以存在多个关键点在同一个位置,但有多个方向。

    至此,我们计算出的带有位置、尺度和方向的关键点也就是sift特征点。

    4. 关键点描述

    现在我们算出来的特征点,都是在固定在图片坐标系中的特征描述。我们需要脱离图片坐标系的固定限制,提取出特征点的局部描述,这样就可以与其他图片的相似的部分去作对比,我们来看看怎么提取局部描述子。

    生成局部描述符的思路就是:通过对关键点的周围区域分块,计算块内的梯度直方图,生成具有独特性的向量,这个向量应该是该区域图像信息的一种抽象,并且具有唯一性。
    下面我们来看看具体是怎么做的。

    1. 首先根据特征点的尺度选择高斯金字塔中的图像,计算特征点邻域范围内各点的梯度方向和梯度的幅值,并根据上文得到的特征点梯度方向更新这些梯度的方向,以此达到描述子的方向不变性。如下图(具体的公式不解释,比较简单):
    2. 我们将关键点的周围区域分成16块,分别计算每个块的梯度直方图如下:

    统计每个4×4块的方向梯度直方图,为了去除光照对描述子的影响,对梯度直方图进行归一化处理。然后将每个直方图槽数据串联即可得到SIFT描述子。作者实验证明,当梯度直方图4×4维的时候,SIFT描述子具有最好的区分度,因此这就诞生了的128(4×4×8)维SIFT特征向量。当然也可以产生其他维数的特征向量。

    至此,我们描述完了,sift描述子是怎么计算出来的了。下面我们分析一下,为什么它会比较有效,是怎么保证的。

    SIFT是怎么保证效果的(理解sift的关键部分)

    我们一个个的来分析:

    • SIFT是怎么保证旋转不变性的?

    我们在求描述子的时候,利用了sift的主方向,求出的描述子都是相对与主方向的,所以无论怎旋转,主方向朝向哪里,只要局部空间不变,描述子都是不变的,所以保证了旋转的不变性。

    • SIFT是怎么保证尺度缩放不变性的?

    不同大小的物体有着不同的尺度,这个初度的表示,可以用放大缩小表示,可以用高斯blur来模拟。如果不同的尺度下都有着同样的关键点,那么在不同的尺度的输入图像下就都可以检测出来关键点匹配了。而差分高斯金字塔完美的解决了这一点,高斯金字塔的每一层都不一样,每一组都不一样。所以模拟出来不同的尺度情况,这样你有需要检测的图像的尺度就和模拟出来的大体对上了。所以不同尺度的都能检测,所以具有了尺度不变性。

    • SIFT是怎么保证亮度变化保持不变性的?

    sift在提取描述子时,对局部空间的像素值进行了归一化处理,所以当光照发生变化,局部的区域的差值并不会发生太大的变化。从而保证了光照对去影响不大,保证了亮度变化保持不变性。

    • SIFT是怎么应对仿射变换的?

    SIFT只能一定程度的应对仿射变换,主要原因还是要归功于高斯金字塔,它通过高斯模糊忽略了一些细节,而更关注更突出更深层次的特征。

    • SIFT是怎么应对噪声的?

    sift在DOG中去关键点是去除了响应比较小的关键点,以及高响应边缘点,而且通过高斯模糊,在一定程度上遏制了噪声点。所以可以抵抗一部分噪声。


    现在把sift梳理一遍也就一个字的感觉:

    但是,个人感觉能够完全理解sift,要是能再自己实现,对于其他传统的计算机视觉算法的理解,就会感觉很容易了。


    重要的事情说三遍:

    如果我的文章对您有所帮助,那就点赞加个关注呗 ( * ^ __ ^ * )

    如果我的文章对您有所帮助,那就点赞加个关注呗 ( * ^ __ ^ * )

    如果我的文章对您有所帮助,那就点赞加个关注呗 ( * ^ __ ^ * )

    传统2D计算机视觉学习笔记目录------->传送门
    传统3D计算机视觉学习笔记目录------->传送门

    任何人或团体、机构全部转载或者部分转载、摘录,请保留本博客链接或标注来源。博客地址:开飞机的乔巴

    作者简介:开飞机的乔巴(WeChat:zhangzheng-thu),现主要从事机器人抓取视觉系统以及三维重建等3D视觉相关方面,另外对slam以及深度学习技术也颇感兴趣,欢迎加我微信或留言交流相关工作。

    相关文章

      网友评论

        本文标题:SIFT算法学习笔记(下)

        本文链接:https://www.haomeiwen.com/subject/gozhsctx.html