尺度不变特征变换匹配算法详解
Scale Invarian Feature Transform
本文大量引用了文章 : https://blog.csdn.net/zddblog/article/details/7521424 ,十分感谢
数学常识链接库 :
拉格朗日乘子法 : https://www.matongxue.com/tags/47/
泰勒公式 : https://www.zhihu.com/question/21149770/answer/219143281
以及 https://blog.csdn.net/xm961217/article/details/101021153
泰勒近似 : https://www.zhihu.com/question/52124268
子像素插值 : https://www.cnblogs.com/ronny/p/4028776.html
差分 : https://zhuanlan.zhihu.com/p/46699931
1. 介绍
SIFT 算法主要是对局部特征进行提取的算法 ,不受亮度 ,旋转 ,缩放的影响 ,对放射变换,透视变换 ,视角变换也有一定的稳定性 。
只需要检测到三个 SIFT 特征点 ,就可以检测物体 。
2. 实现步骤
① 尺度空间极值检测
② 关键点定位
③ 方向确定
④ 关键点描述
注意 :尺度空间为 观察物体的窗口大小
而 SIFT 对图片所做的高斯模糊处理 ,是采取了对高斯模糊分离的办法 ,将矩阵分为一行与一列 ,将会使高斯模糊的 时间复杂度从 O(n * m * M * N) 降低到 O( n * M *N ) + O(m * M * N) ,在边缘上的一维矩阵会忽略图片外的因素 。
并消除黑边问题 。
由 来决定尺度空间的大小 。值越小表示被平滑的空间越小 ,越注重细节 ,值越大表示平滑的空间越大 ,越注重大轮廓 。
尺度空间实现时用高斯金字塔来表示 ,
3. 高斯金字塔的构建
1. 对图片做不同尺度的高斯模糊处理
2. 对图片进行降采样 (隔点采样)
图像的金字塔模型是指,将原始图像不断缩小 ,从大到小 ,从下到上 ,构成金字塔 。
一般上一层比下一层长和宽各缩小一倍 。
而在特征提取函数上 ,尺度归一化的高斯拉普拉斯函数 与 高斯差分函数(DOG) 十分的近似 ,但 DOG 函数更加的高效 ,简洁 。
因此引用 DOG 来进行极值的检测
在高斯金字塔中通过上下相邻的图像相减 ,得到高斯差分图像 ,(注意:这里是对每一层中大小相同的图片 ,但使用了不同的参数做了高斯模糊)
4. 极值点检测(关键点的初步检测)
关键点的检测是在相同尺寸之间的图像之间比较得到 ,每个像素点要和他相邻的点比较 ,( 8 邻域 + 9 * 2 =26 个像素) ,看是不是比他的邻域与尺度域的点大或者小 ,确保在 尺度空间和二维空间上都能检测到极值点 。
这样就能找到大部分极值点 ,包括响应弱的极值点 。
(注意 : 由于要在相邻尺度进行比较,如每组含4层的高斯差分金子塔,只能在中间两层中进行两个尺度的极值点检测,其它尺度则只能在不同组中进行。为了在每组中检测S个尺度的极值点,则DOG金字塔每组需S+2层图像,而DOG金字塔由高斯金字塔相邻两层相减得到,则高斯金字塔每组需S+3层图像,实际计算时S在3到5之间。)
5. 构建尺度空间所需要的参数
在最开始建立高斯金字塔时,要预先模糊输入图像来作为第0个组的第0层的图像,这时相当于丢弃了最高的空域的采样率。因此通常的做法是先将图像的尺度扩大一倍来生成第-1组。我们假定初始的输入图像为了抗击混淆现象,已经对其进行的高斯模糊,如果输入图像的尺寸用双线性插值扩大一倍,那么相当于。
—尺度空间坐标
O—组(octave)数
S— 组内层数
在上述尺度空间中,O和S,的关系如下:
(3-5)
其中是基准层尺度,o为组octave的索引,s为组内层的索引。关键点的尺度坐标就是按关键点所在的组和组内的层,利用公式(3-5)计算而来。
取式(3-4)中的k为组内总层数的倒数,即
(3-6)
在构建高斯金字塔时,组内每层的尺度坐标按如下公式计算:
(3-7)
其中初始尺度,lowe取,s为组内的层索引,不同组相同层的组内尺度坐标相同。组内下一层图像是由前一层图像按进行高斯模糊所得。式(3-7)用于一次生成组内不同尺度的高斯图像,而在计算组内某一层图像的尺度时,直接使用如下公式进行计算:
(3-8)
该组内尺度在方向分配和特征描述时确定采样窗口的大小。
由上,式(3-4)可记为
(3-9)
图3.5为构建DOG金字塔的示意图,原图采用128*128的jobs图像,扩大一倍后构建金字塔。
6. 关键点精确定位
以上方法检测到的极值点是离散空间的极值点,以下通过拟合三维二次函数来精确确定关键点的位置和尺度,同时去除低对比度的关键点和不稳定的边缘响应点(因为DoG算子会产生较强的边缘响应),以增强匹配稳定性、提高抗噪声能力。
而离散空间的极值点与连续空间的极值点是不一样的 ,获取连续空间的极值点的方法叫做 子像素插值(Sub-pixel Interpolation)