项目要求
- 实现兴趣点检测
- 实现类SIFT局部特征描述
- 实现简单匹配算法
项目原理
局部特征
全局特征(global features)指的是图像的方差、颜色直方图等等,描绘了图像的整体信息,但是无法分辨出图像中的前景和背景。
局部特征(loacl features)指的是一些局部才会出现的特征,而且该部分需要满足两个条件:1. 能够稳定出现; 2. 具有良好的可区分性。
当我们所关注的对象在图像中受到部分遮挡,全局特征可能会被破坏,但局部特征依然能够稳定存在,以代表这个物体。
图像中的特征点
一幅图像中总存在着其独特的像素点,这些点我们可以认为就是这幅图像的特征,成为特征点。计算机视觉领域中的很重要的图像特征匹配就是一特征点为基础而进行的,所以,如何定义和找出一幅图像中的特征点就非常重要。
在计算机视觉领域,兴趣点(也称关键点或特征点)的概念已经得到了广泛的应用, 包括目标识别、 图像配准、 视觉跟踪、 三维重建等。 这个概念的原理是, 从图像中选取某些特征点并对图像进行局部分析,而非观察整幅图像。 只要图像中有足够多可检测的兴趣点,并且这些兴趣点各不相同且特征稳定, 能被精确地定位,上述方法就十分有效。
好的特征应该有以下几个特点:
- 重复性:不同图像的相同区域应该能被重复检测到,而且不受旋转、模糊、光照等因素的影响。
- 可区分性:不同的检测子应可通过检测对应的描述子进行区分。
- 数量适宜:检测子的数量过多或者过少都会降低识别精度。
- 高定位:检测子的大小和位置均应固定。
- 有效性:具有较快的检测速度。
Harris角点(Harris Corner Detector)
角点的基本原理:人眼对角点的识别通常是在一个局部的小区域或小窗口完成的。如果在各个方向上移动这个特征的小窗口,窗口内区域的灰度发生了较大的变化,那么就认为在窗口内遇到了角点。如果这个特定的窗口在图像各个方向上移动时,窗口内图像的灰度没有发生变化,那么窗口内就不存在角点;如果窗口在某一个方向移动时,窗口内图像的灰度发生了较大的变化,而在另一些方向上没有发生变化,那么,窗口内的图像可能就是一条直线的线段。
角点具有一些良好的特征:视角变化时也仍然可以很好的辨识;和周围点在任何方向上变化都很大。角点经常被检测在边缘的交界处、被遮挡的边缘、纹理性很强的部分。满足这些条件一般都是稳定的、重复性比较高的点,所以实际上他们是不是角点并不重要(因为我们的目标就是找一些稳定、重复性高的点以作为特征点)。
Harris Corner是最典型的角点检测子,具有的优点是平移不变、旋转不变,能克服一定光照变化。
NMS(非最大值抑制)
NMS(Non-Maximum Supression)非最大抑制,就是抑制除最大值(局部最优)外的其他元素。比如在下图中要确认人行道上的车辆,需要找到区域内识别概率最大的框,所以将右边0.9的框和左边0.8的框高亮,之后遍历其他边框,如果和高亮的框交并比大于0.5,则将框进行淡化(抑制)。
SIFT(尺度不变特征变换)
SIFT(Scale-Invariant Feature Transform)尺度不变特征变换,是计算机视觉领域对图像局部特征进行描述的常用方法,有以下四个关键步骤
1. 尺度空间极值检测(Scale-space extrema detection)
建立高斯差分金字塔,采用不同 σ \sigma σ(尺度)的高斯核对原图像进行卷积操作,得到一组不同层的图片,而不同组之间的图片通过降采样(隔点取点)得到。通过不断的变化高斯核和进行降采样,便可以得到高斯金字塔。再通过同一组不同两层之间的图片相减,就得到高斯差分金字塔(又叫尺度空间),如下图所示。
其中,
组数 O = [ l o g 2 ( m i n ( M , N ) ) ] − 3 O=[log_2(min(M,N))]-3 O=[log2(min(M,N))]−3,其中M和N是图片的长和宽。
层数 S = n + 3 S=n+3 S=n+3,其中n是希望提取从中特征的图片数目,因为做差分的过程中有一张图片无法使用,同时尺度空间上最上面一张和最下面一张图片无法求导,所以S-3=n。
σ \sigma σ取法请见参考资料中原论文,不在此赘述。
理解:因为SIFT要解决尺度不变性问题,它的理念是不仅在任何尺度下拍摄的物体都能检测到一致的关键点,而且每个被检测的特征点都对应一个尺度因子。 在高斯金字塔中,其实降采样就是模拟了近大远小的尺寸变化,高斯核进行卷积模拟的是近处清晰,远处模糊。(PS:值得注意的是,高斯核是唯一一个可以模拟近处清晰,远处模糊的线性核)
2. 关键点定位(Keypoint Localization)
关键点需要满足:包含很多信息,稳定不易变化。关键点通常是极值位置。
-> 1. 阈值化
a b s ( v a l ) > 0.5 ∗ T / n abs(val)>0.5*T/n abs(val)>0.5∗T/n,其中T=0.04,因为如果太小了可能是噪声,不进行保留。
-> 2. 在高斯差分金字塔中找极值
在考虑了尺度空间后,如果一个像素点的值比周围26个像素点都大(小),那么就认为这个点是一个极值。
-> 3. 调整极值点的位置
因为像素空间和尺度空间均是离散的,所有需要找到亚像素位置的精确极值点,具体操作是在检测到的极值点处做三元二阶泰勒展开,再对函数进行求导并令导数为零。
-> 4. 舍去低对比度的点
若 ∣ f ( X ) < T / n ∣ |f(X)<T/n| ∣f(X)<T/n∣则认为该像素点事噪声,舍去点X
-> 5. 边缘效应的去除