SIFT(Scale-invariant feature transform,尺度不变特征变换)
1、输入图像,建议做double(width*=2, height*=2, size*=4),可以得到更多的特征点,并高斯过滤进行平滑。
2、构建高斯金字塔,高斯金字塔里有两个概念:组(Octave)和层(Level或Interval),每组里有若干层。由图片大小决定建几个塔,每塔几层图像(一般3-5层)。0塔的第0层是原始图像(或double后的图像),往上每一层是对其下一层进行Laplacian变换(高斯卷积,其中sigma值渐大,例如可以是sigma, k*sigma, k*k*sigma…),直观上看来,越往上图片越模糊。塔间的图片是降采样关系,例如1塔的第0层可以由0塔的第3层降采样得到,然后进行与0塔类似的高斯卷积操作。
3、构建DoG(Difference of Gaussian)金字塔。DoG金字塔由上一步生成的高斯金字塔计算得到,塔数相同,每塔层数少1,因为DoG的每一层由高斯金字塔的相邻两层相减得到。
4、在DoG塔里进行极值点检测,并根据用户预设的对比度阈值、主曲率阈值去除不合法特征点。极值点检测用的非极大值抑制,即在3*3*3个点中进行灰度值比较,最小或最大才过关。
5、计算每个特征点的尺度。注意塔间尺度关系,sigma*2.0^(octvs+intvl/intvls)
6、计算每个特征点的梯度模值和方向。用特征点周围一个矩阵区域(patch)内的点来描述该特征点,用的直方图进行模值统计并寻找主方向,主方向可以不止一个。
7、生成64D或128D的特征描述符。对齐主方向,计算方向直方图2D数组,假如每个直方图有8bin,那么64D(2*2*8bin)或128D(4*4*8bin)。
SIFT/SURF为了实现不同图像中相同场景的匹配,主要步骤:
1、尺度空间的建立;
2、特征点的提取;
3、利用特征点周围邻域的信息生成特征描述子;(以特征点为中心,在周围邻域内统计特征,将特征附加到稳定点上,生成特征描述子)
4、特征点匹配。
如果两幅图像中的物体只是旋转和缩放的关系,加上图像的亮度及对比度的不同,要在这些条件下实现物体之间的匹配,只要找到多于三对物体间的匹配点就可以通过射影几何的理论建立它们的一一对应。
如何找到这样的匹配点呢?SIFT/SURF作者的想法是首先找到图像中的一些“稳定点”,这些点是一些特殊的点,不会因为视角的改变、光照的变化、噪音的干扰而消失,比如角点、边缘点、暗区域的亮点以及亮区域的暗点。这样如果两幅图像中有相同的景物,那么这些稳定点就会在两幅图像的相同景物上同时出现,这样就能实现匹配。因此,SIFT/SURF算法的基础是稳定点。
SIFT/SURF提取的稳定点,首先都要求是局部极值。但是,当两个物体的大小比例不一样时,大图像的局部极值点在小图像的对应位置上有可能不是极值点。于是SIFT/SURF采用图像金字塔的方法,每一个截面与原图像相似,这样两个金字塔中就有可能包含大小最近似的两个截面了。
这样找到的特征点会比较多,经过一些处理后滤掉一些相对不稳定的点。
比较:
SIFT在尺度和旋转变换的情况下效果最好;
SURF在亮度变化下匹配效果最好,在模糊方面优于SIFT,速度是SIFT的3倍。
|
SIFT |
SURF |
尺度空间 |
DOG与不同尺度的图片卷积 |
不同尺度的box filters与原图片卷积 |
特征点检测 |
先进行非极大抑制,再去除低对比度的点。再通过Hessian矩阵去除边缘的点 |
先利用Hessian矩阵确定候选点,然后进行非极大抑制 |
方向 |
在正方形区域内统计梯度的幅值的直方图,找max对应的方向。可以有多个方向。 |
在圆形区域内,计算各个扇形范围内x、y方向的haar小波响应,找模最大的扇形方向 |
特征描述子 |
16*16的采样点划分为4*4的区域,计算每个区域的采样点的梯度方向和幅值,统计成8bin直方图,一共4*4*8=128维 |
20*20s的区域划分为4*4的子区域,每个子区域找5*5个采样点,计算采样点的haar小波响应,记录∑dx, ∑dy,∑|dx|,∑|dy|,一共4*4*4=64维 |