特征匹配时计算机视觉领域里的基础问题,通过匹配特征可以用来进行物体识别、视频跟踪等等。SIFT目前来说是效果最好的手工设计的特种,他由加拿大教授David Lowe发明,已申请专利。正如其名字一样,SIFT特征具有尺度不变性,其实除了尺度不变形,还具有旋转不变性,在局部几何畸变和视点变换的情况下也有很好的效果。即:
- Scale
- Rotation
- Illumination
- Viewpoint
SIFT是一个相当复杂的算法,总共包括下面几步:
- 构建尺度空间(尺度不变)
- LoG近似
- 找关键点
- 处理坏的关键点
- 为每个关键点赋一个方向(旋转不变)
- 生成SIFT特征
当拿到了一幅图像的SIFT特征以后,就可以用该特征处理相关的应用了。
一、构建尺度空间
通俗的说就是,对一幅原始图像,接连的对其尺度进行缩减,产生N个SIZE的图像,分别记为,SIZE1,SIZE2,...,SIZEn. 然后对每个SIZEi(i属于1,2,... ,n)进行不同等级的高斯模糊,即接连的怎增加高斯模糊的程度,每个SIZE产生M个SCALE等级的模糊。若把SIZE看做横向,SCALE看做纵向,即有:
其中颜色越淡表示模糊的越厉害,SIFT的尺度空间如上图所示。
几点注意:
- David Lowe本人的论文中推荐,SIZE为4个等级,按缩小一半的方式进行缩小(长宽各一半),SCALE为5个等级,每次把sigma乘以一个常数k
- 可以把原始图扩大一倍,作为新的原始图,这样可以多出4倍的特征点。
二、LoG近似
LoG是Laplacian of Guassian的缩写,他是一种边缘提取算子,先对图像做高斯模糊,再使用Laplacian算子。Laplacian算子是对图像求二阶导数,通过过零点检测来提取边缘,但其受噪音影响很大,所以使用前先做高斯模糊,即LoG. 【关于LoG的详细知识在参考别的资料】因为上面的尺度空间构建过程中已经做了高斯模糊,所以对上面的图像直接做Laplacian计算就好了。但由于涉及卷积,计算量大。所以采用一种和其作用差不多的DoG(Difference of Gaussian)来替代,即在同一个SIZE中,相邻SCALE之间做差即可得到。
使用DoG除了简化计算外,还有其他优点,见参考文献。
三、找关键点
找关键点总共分两步:
- 找最大/最小值点(在DoG图像空间中找)
- 找亚像素最大/最小点
1、找最大/最小点
这是在DoG中找,即按照David Lowe,每个SIZE 有5个SCALE,则每个SIZE下有4章DoG图像,方式如下:
即在这样26个点中比较,若中间那个点是最大或是最小的记为近似最大/最小点。注意:第一张和最后一张无法搜索。
2、找最大/最小的亚像素点位置
上面找到的都是整数,即在某个像素点上,但最大/最小值可能在像素点之间,所以需要进一步求解。求解方式如下:
【这里不是很懂】
四、移除低对比度的关键点
对于上面找到的关键点,有些可能是噪音生成的,有些可能在边缘上,所以要进一步讲这些点去除。
1、移除低对比度特征
就是设立一个阈值,把上面求得的最大或最小值和阈值比较,小于或大于直接丢弃。
2、移除边缘
我们希望找到的是角点,对边缘也要移除。即对上一步求得的最大或最小点,求其两个相互垂直方向上的梯度:
- 两个梯度都很小:表示这是平滑处,移除
- 一个大一个小: 表示边缘处,移除
- 两个都大: 角点,即所寻找的特征
这里有数学上的解释,即Hessian Matix. 其实类似于Harris Coner Dectector.
五、为特征点添加方向
通过上面四步,已经产生了尺度不变的特征点。下面就为每个特征点赋予一个方向,使其具有方向不变性。在确定特征点的方向的时候,要先确定一个窗口,然后计算该窗口中每个像素点的梯度大小和方向。计算公式如下:
上面是计算梯度大小的,下面是计算梯度方向的。
注意:在一个二维图像上,一圈360°,这里每10°一个单位,等分成36份,构建一个统计直方图,然后按照上面的公式计算关键点周围的每个像素点的梯度大小和方向,落入某个范围就将相应的位置加上一定的数量,这个量个该点的梯度大小成正比,最后选取数量最多的那个方向作为关键点的方向。若还有其他方向其数量超过最多的那个的80%,则分裂该关键点,即新建一个位置不变,但方向不同的关键点【这个应该很好理解,为了不同视点都能观测出来】。
实现时注意:
- 窗口大小 The window size, or the "orientation collection region", is equal to the size of the kernel for Gaussian Blur of amount 1.5*sigma.
- Magnitudes Saw the gradient magnitude image above? In SIFT, you need to blur it by an amount of 1.5*sigma.
六、生成SIFT特征向量
生成SIFT特征向量,即为每个特征点生成一个描述子,以便能够辨识该特征点。SIFT是用一个128个数字的特征向量来描述的,具体这128个数字中的值怎么生成,如下:
先以特征点为中心,选择一个16*16的窗口,然后将窗口划分成4*4个区域,每个区域4*4 = 16个像素。对每个区域用直方图统计梯度方向信息,直方图共8个bins,即将360°等分8分,对16个像素计算梯度和方向,落在相关区域就将对应的bin加上一个数值,这个数值和上一步的数值一样根据梯度大小来确定,但不同的是还要考虑距离特征点的距离,距离越远影响就越小,所以就乘以一个小的权重,距离越近,影响越大,就乘以一个大的权重,很自然就想到了高斯,所以这里采用高斯来加权平均。
最后每个区域会生成一个8位数字,即8个bins上的数字,总共4*4*8 = 128个数字的向量,然后做归一化处理即的最终的特征向量。
注意:因为一旦旋转,这个方向就完全变了,所以为了达到旋转不变性,这个步骤中窗口里的每个像素点的方向的计算都要以特征点的方向为基础,这样不管怎么旋转,这些像素点的方向相对特征点的方向不变,也就达到了旋转不变的效果。
七、最后
更进一步的发展,有许多人基于SIFT做了改进,但大多都是用效果换速度,即速度上有些提升,但效果还是赶不上SIFT,最有名的的是SURF,它的速度要比SIFT快4倍,声称和SIFT效果差不多,但还是有差距。
参考文献:
[2] David Lowe . "Object Recognition from Local Scale-Invariant Features"