目录
局部图像描述子
本节旨在寻找图像间的对应点和对应区域。介绍用于图像匹配的两种局部描述子算法。图像的局部特征是许多计算机视觉算法的基础,使用特征点来代表图像的内容包括运动目标跟踪,物体识别,图像配准,全景图像拼接,三维重建等。
(一)Harris 角点检测器
角点特征:
- 轮廓之间的交点。
- 对于同一场景,即使视角发生变化,通常具备稳定性质的特征。
- 该点附近区域的像素点无论在梯度方向上还是其梯度幅值上有着较大变化。
- 角点处的一阶导数最大,二阶导数为0。
- 角点指示了物体边缘变化不连续的方向。
Harris 角点检测算子:
Harris 算子是一种简单的点特征提取算子,这种算子受信号处理中自相关函数的启发,给出与自相关函数相联系的矩阵M。M阵的特征值是自相关函数的一阶曲率,如果两个曲率值都高,那么就认为该点是特征点。为了消除噪声对于角点检测的影响,可以使用一个高斯滤波器来平滑图像。
Harris 角点检测算法原理:
利用矩形窗在图像上移动,若窗内包含有角点,则窗口向各个方向移动时,窗内的灰度值都会发生变化。从而达到检测图像角点的目的。如果像素周围显示存在多于一个方向的边,我们认为该点为兴趣点。该点就称为角点。
数学公式:
把图像域中点x上的对称半正定矩阵定义为:
其中 ∆I为包含导数和
的图像梯度。由于该定义,
的秩为1,特征值为
和
。现在对于图像的每一个 像素,我们可以计算出该矩阵。
选择权重矩阵 W(通常为高斯滤波器 Gσ),我们可以得到卷积:
该卷积的目的是为了得到在周围像素上的局部平均。计算出的矩阵
称为Harris矩阵。
方法:
注意:
增大α的值,将减小角点响应值R,降低角点检测的灵性,减少被检测角点的数量;减小α值,将增大角点响应值R,增加角点检测的灵敏性,增加被检测角点的数量。
Harris角点检测算法优点:
1.旋转不变性,椭圆转过一定角度但是其形状保持不变(特征值保持不变)。
2.对于图像灰度的仿射变化具有部分的不变性,由于仅仅使用了图像的一介导数,对于图像灰度平移变化不变;对于图像灰度尺度变化不变。
Harris角点检测算法缺点:
1.它对尺度很敏感,不具备几何尺度不变性。
2.提取的角点是像素级的。
代码
实现结果
ksize=3
ksize=25
可以看到,如果将参数设置为3,当检测到大楼方块的边界时,大楼中方块的所有对角线都会被认为是角点。如果参数设置为25,只有大楼方块的角点才能被检测为角点。
图像中寻找对应点:
Harris 角点检测器仅仅能够检测出图像中的兴趣点,但是没有给出通过比较图像间的兴趣点来寻找匹配角点的方法。我们需要在每个点上加入描述子信息,并给出一 个比较这些描述子的方法。兴趣点描述子是分配给兴趣点的一个向量,描述该点附近的图像的表观信息。描述子越好,寻找到的对应点越好。我们用对应点或者点的对应来描述相同物体和场景点在不同图像上形成的像素点。
代码
实现结果
分析:
该算法的结果存在一些不正确匹配。这是因为,与现代的一些方法(下面将会提到)相比,图像像素块的互相关矩阵具有较弱的描述性。实际运用中,我们通常使用更稳健的方法来处理这些对应匹配。这些描述符还有一个问题,它们不具有尺度不变性和旋转不变性,而算法中像素块的大小也会影响对应匹配的结果。
(二)SIFT(尺度不变特征变换)
前面介绍的cornerHarris函数可以很好的检测角点,这与角点本身的特性有关,这些角点在图像旋转的情况下也能被检测到。然而,如果减小(或增加)图像的大小,可能会丢失图像的某些部分,或者有可能增加角点的质量。这种特征损失现象需要用一种与图像比例无关的角点检测方法来解决——尺度不变特征变换(Scale-Invariant Feature Transform , SIFT),该函数会对不同的图像尺度(尺度不变特征变换)输出相同的结果。
注意:上述概念中只是进行 “ 特征变换 ”,此意味 SIFT 会通过一个特征向量来描述关键点周围区域情况,而不检测关键点(关键点可由 Difference of Gaussians DoG检测)。匹配的核心问题是将同一目标在不同时间、不同分辨率、不同光照、不同方向的情况下所成的像对应起来。传统的匹配算法往往是直接提取角点或边缘,对环境的适应能力较差,需要一种鲁棒性强,能够适应不同情况的有效的目标识别的方法。
SIFT 特征包括兴趣点检测器和描述子。SIFT 描述子具有非常强的稳健性,这在很大程度上也是 SIFT 特征能够成功和 流行的主要原因。自从 SIFT 特征的出现,许多其他本质上使用相同描述子的方法 也相继出现。现在,SIFT 描述符经常和许多不同的兴趣点检测器相结合使用(有些情况下是区域检测器),有时甚至在整幅图像上密集地使用。SIFT 特征对于尺度、 旋转和亮度都具有不变性,因此,它可以用于三维视角和噪声的可靠匹配。
SIFT特征检测的步骤:
1.尺度空间的极值检测:搜索所有尺度空间上的图像,通过高斯微分函数来识别潜在的对尺度和旋转不变的兴趣点。
2.特征点定位:在每个候选的位置上,通过一个拟合精细模型来确定位置尺度,关键点的选取依据他们的稳定程度。
3.特征方向赋值: 基于图像局部的梯度方向,分配给每个关键点位置一个或多个方向,后续的所有操作都是对于关键点的方向、尺度和位置进行变换,从而提供这些特征的不变性。
4.特征点描述: 在每个特征点周围的邻域内,在选定的尺度上测量图像的局部梯度,这些梯度被变换成一种表示,这种表示允许比较大的局部形状的变形和光照变换。
SIFT算法的特点
1.图像的局部特征,对旋转、尺度缩放、亮度变化保持不变,对视角变化、仿射变换、噪声也保持一定程度的稳定性。
2.独特性好,信息量丰富,适用于海量特征库进行快速、准确的匹配。
3.多量性,即使是很少几个物体也可以产生大量的SIFT特征
4.高速性,经优化的SIFT匹配算法甚至可以达到实时性
5.扩招性,可以很方便的与其他的特征向量进行联合。
可以解决的问题:
-
目标的旋转、缩放、平移
-
图像的仿射,投影变换
-
光照影响
-
目标遮挡
-
杂物场景
-
噪声
2.1 兴趣点
SIFT 特征使用高斯差分函数来定位兴趣点:
其中,Gσ 是上一章中介绍的二维高斯核,Iσ 是使用Gσ 模糊的灰度图像,κ 是决定相差尺度的常数。兴趣点是在图像位置和尺度变化下 D(x,σ) 的最大值和最小值点。这些候选位置点通过滤波去除不稳定点。基于一些准则,比如认为低对比度和位于边上的点不是兴趣点,我们可以去除一些候选兴趣点。
2.2 描述子
上面讨论的兴趣点(关键点)位置描述子给出了兴趣点的位置和尺度信息。为了实现旋转不变性,基于每个点周围图像梯度的方向和大小,SIFT 描述子又引入了参考方向。SIFT 描述子使用主方向描述参考方向。主方向使用方向直方图(以大小为权重)来度量。
2.3 检测兴趣点
使用开源工具包 VLFeat 提供的二进制文件来计算图像的 SIFT 特征 。VLFeat 工具包可以从 http://www.vlfeat.org/ 下载,二进制文件可以在所有主要的平台上运行。
代码
分析:
1.完成常规方法加载要处理的图像后,为了使脚本具有通用性,使用python的sys模块将图像路径通过命令行参数传递给脚本。
2.SIFT对象会使用DoG检测关键点,并且对每个关键点周围的区域计算特征向量,由方法名称我们就可以知道,它主要包括两个操作:检测和计算,操作的返回值是关键点信息和描述符,最后在图像上绘制关键点,并用imshow函数显示这幅图像。
3.注意,这里将标志值4传给draeKeypoints函数,标志值4其实是下面这个cv2模块的属性值:CV2.DRAM_MATCHES_FLAGS_DRAW_RICH_KEYPOINT
该代码对图像的每个关键点都绘制了圆圈和方向。
pt: 图像中关键点的x,y坐标点
size: 特征的直径
angle: 特征的方向
response: 关键点的强度。某些特征会通过SIFT来分类,因为它得到的特征比其他特征更好,通过查看response属性可以评估特征强度。
octave: 特征所在金字塔的层级,算法在每次迭代时候,作为参数的图像尺寸和相邻像素都会发生变化
kp.class_id: 对象关键点ID
2.4 匹配描述子
对于将一幅图像中的特征匹配到另一幅图像的特征,一种稳健的准则(同样是由 Lowe 提出的)是使用这两个特征距离和两个最匹配特征距离的比率。相比于图像中的其他特征,该准则保证能够找到足够相似的唯一特征。使用该方法可以使错误的匹配数降低。
代码
实现结果
结果分析:从匹配的准确率看来,相较harris算法。sift的算法具有更高的匹配性,显而易见地,sift算法具有较高的准确度及稳健性(对图片亮度不敏感);从时间上来说,sift算法的效率远高与harris算法,所以sift算法具有更高的计算效率。
(三)匹配地理标记图像