如何使用SIFT进行角点匹配?

【摘要】:智能交通系统(ITS)是现代交通管理的发展方向之一,而运动车辆的检测与跟踪是智能交通系统中的基础问题。本文在分析和总结现有的车辆检测与跟踪技术的基础上,重点研究了固定场景下基于角点SIFT特征匹配的车辆检测定位与跟踪方法,本文的主要研究工作包括以下几个方面: (1)车辆角点的检测与定位。在现有的车辆检测的基础上,采用Harris角点检测算法提取了图像中的角点这一重要局部特征,角点具有旋转不变性和较强的抗光照干扰性;采用128维向量对各角点进行SIFT特征描述,该特征对旋转、尺度缩放和亮度具有较好的不变性,因此本文算法能较好地适应不同光照环境。 (2)车辆角点运动轨迹的形成。对连续两帧图像分别进行角点提取,以其128维SIFT特征向量之间的欧式距离计算特征点之间的相似度,采用双向匹配法获得连续两帧图像中角点的匹配关系,形成轨迹;为满足实时性要求,在角点匹配时使用卡尔曼滤波器对角点的运动轨迹进行估计,缩小匹配范围。当本帧中没有找到一条轨迹的匹配点时用估计点坐标作为轨迹在本帧中的位置,提高跟踪的稳定性。为了获取轨迹速度以及计算车辆大小,使用基于单应矩阵的摄像机标定方法对角点像素进行从图像坐标系到世界坐标系的转换。 (3)角点运动轨迹分组研究,获取车辆数据。根据轨迹间的位置、速度、方向和移动距离的加权差值衡量轨迹间的相似度;采用聚类的思想,对相似度较大的轨迹进行归类,实现轨迹的分组。由于充分利用了车辆的运动信息,因此在车辆间发生遮挡时也能对车辆进行检测区分。 本方法有较好的环境光照适应性,对部分遮挡车辆能有条件地实现区分和跟踪。小样本实验数据表明,在不同车密度的情况下,本文提出的车辆跟踪方法检测率为98.09%,漏检率2.0%,误检率1.85%。


}

Keypoints”(尺度不变关键点中的独特图像特征)中提出了一种新的尺度不变特征变换(SIFT)算法,该算法提取关键点并计算其描述符。
SIFT特征对旋转、尺度缩放、亮度变化等保持不变性,是一种非常稳定的局部特征。

以往的角点检测算法,例如Harris角点检测器可以做到旋转不变(rotation-invariant),即无论图像发生旋转,算法依然可以找到相同的角。但是当图像发生缩放之后,原先的角可能就发生了变化,算法就无法检测出角点。例如下图,在同一检测窗口中放大小窗口中小图像中的角时,该角是平坦的。为了解决这个问题,我们需要一种尺度不变(或者叫缩放不变)算法。

1.2.1 尺度空间极值检测
如上图,对于一个图像我们不能使用同样大小的检测窗口来检测不同放缩比例的关键点。对一个“小”角点来说是没问题啦,但要检测更“大”的角点,我们需要更大的窗口。为此,使用尺度空间过滤。

在其中,不同的σ值的图像对应的高斯-拉普拉斯算子被算出来。LoG(Laplacian of Gaussian,详见就是前文的高斯-拉普拉斯算子)作为一个斑点检测器,能检测出由于σ变化引起的不同大小下的斑点。

简单的说,σ 就是一个放缩比例的参数。例如,在上图中,有较小 σ 值的高斯内核对一个“小”角点返回一个较大的值,然而较大的 σ值的高斯内核适合较“大”的角点。所以,我们可以在放缩空间中求出局部最大值,它给我们返回一个(x,y,σ)值的列表,它告诉我们,在(x,y)点 σ 放缩比的情况下,有一个潜在的关键点。

高斯差分算子可以通过具有两个不同的图像的高斯模糊的差来获得σ。令他们为 σ 和 kσ,这个过程为不同图像的高斯金字塔的阶进行了处理。

我们还可以通过图像的模糊程度来模拟人在距离物体由远到近时物体在视网膜上成像过程,距离物体越近其尺寸越大图像也越模糊,这就是高斯尺度空间,使用不同的参数模糊图像(分辨率不变),是尺度空间的另一种表现形式。
我们知道图像和高斯函数进行卷积运算能够对图像进行模糊,使用不同的“高斯核”可得到不同模糊程度的图像。一副图像其高斯尺度空间可由其和不同的高斯卷积得到:
其中,G(x,y,σ)是高斯核函数。G(x,y,σ)是高斯核函数。

σσ称为尺度空间因子,它是高斯正态分布的标准差,反映了图像被模糊的程度,其值越大图像越模糊,对应的尺度也就越大。L(x,y,σ)L(x,y,σ)代表着图像的高斯尺度空间。
构建尺度空间的目的是为了检测出在不同的尺度下都存在的特征点,而检测特征点较好的算子是Δ2GΔ2G(高斯拉普拉斯,LoG)

1.2.3 高斯金字塔构建示例
以一个512×2的图像I为例,构建高斯金字塔步骤:(从0开始计数,倒立的金字塔)

算出了 DoG 之后,图像就开始在放缩空间中搜索局部极值。比方说,图像中的某像素点用来和它周围的8个邻居比较。
例如,将一幅图像中的一个像素与它的8个相邻像素以及下一个比例中的9个像素和前一个比例中的9个像素进行比较,如果它是局部的极大值,它就是一个潜在的关键点。基本上意思就是说那个关键点,在此比例下是最有代表性的。

对于不同的参数,论文给出了一些经验数据,可以概括为,阶数=4,放缩等级数=5,初始σ=1.6,k=\sqrt{2}等作为最优值。

一旦潜在关键点的位置被算出来了,为了得到更精确的结果,它们必须被再精选一次。他们使用放缩空间中的泰勒级数展开式,得到了更精确的极值点位置。并且如果该极值处的强度小于阈值(该论文为0.03),则不判定为关键点。

DoG 算法对于边缘也有很高的响应,所以我们得把边缘除去。对此,使用了一个与哈里斯角点检测相似的概念。他们使用一个 2x2 的黑塞矩阵(H)(译者附:黑塞矩阵)来计算主曲率。由Harris角检测器可知,对于边,一个特征值远大于另一个特征值。

这里用了一个简单的函数,如果该比例大于在OpenCV里被称为edgeThreshold的阈值,该关键点会被抛弃。在论文中该阈值被设为10。

因此,它消除了任何低对比度的关键点和边缘关键点,剩下的是强烈的兴趣点。

现在为每个关键点指定一个方向,以实现图像旋转的不变性。邻域取围绕关键点位置的区域,大小取决于放缩比例。在那个区域计算出梯度大小和梯度方向。
一个有着36个抽屉、覆盖360度的方向直方图被创建了出来(它通过梯度幅值和高斯加权圆形窗口来加上了权重,其中σ取关键点的1.5倍放缩比)。取该直方图中最高的峰值,以及任何在最高峰值80%之上的峰值点,都用于计算方向。它创建的关键点具有相同的位置和放缩比,但方向不同。有利于匹配的稳定性。

现在关键点的描述符已经创建好了。取围绕关键点的一个 16x16 邻域,它被分成16个4x4大小的子块。对于每个子块,创建8抽屉的方向直方图,这样总共就有了128个可以用的有值得抽屉。它用一个向量来表示,形成了关键点描述符。除此之外,还采取了一些措施来提升对抗光照变化、旋转等的健壮性。

两张图像之间的关键点,通过识别它们之间的最近的邻居来匹配。但在某些情况之下,第二相近的匹配度有可能和最相近的匹配度非常接近。这有可能是因为噪音或者其他某些原因引起的。如果是那样的话,取次接近的和最接近的比值。如果比值大于0.8,它们就被丢弃掉。在该论文中使用的这种方案,丢弃掉了大约 90% 的错误匹配,但只丢掉了5%的正确匹配。

这就是SIFT算法的一个简单的摘要。想要理解更多的细节,强烈推荐你阅读原论文。

好了,你现在已经知道了SIFT的基本原理,开始实现SIFT特征匹配吧!(笑)

实现特征匹配我们需要通过SIFT查找得到关键点和特征向量,

1.前期准备一下缩略图
将缩略图的保存和地理标记图像匹配的主体功能分开的原因是:OpenCV的imwrite()函数会在py文件运行结束后,才将图片保存到指定路径,这将导致pydotplus和graphviz画出的无向图找不到缩略图而报错:

SIFT中每个特征点的描述子都有几个属性:坐标、尺度和梯度方向角度和128维的邻域子向量。

m.distance是sift特征点描述中128维邻域子向量的归一化欧几里得距离(欧氏距离),根据SIFT的创造者Lowe在论文中提出来的稳健匹配准则,我们应当使用两个特征距离和两个最匹配特征距离的比率。

当我们得到这个欧式距离的比率之后,应该将它们按升序排列,这意味着图像1中的关键点与图像2中的关键点之间的距离是最近的。
之后我们就应该设置一个阈值T,如果m.distance和n.distance的比率小于这个阈值T,那么它就是一个好的匹配,我们将它记录到good_matches里面。

所以这个阈值T,应该被设置的小一点,一般取0.3~0.7。

}

重磅干货,第一时间送达

图像拼接是计算机视觉中最成功的应用之一。如今,很难找到不包含此功能的手机或图像处理API。在这篇文章中,我们将讨论如何使用Python和OpenCV执行图像拼接

。鉴于一对共享一些共同区域的图像,我们的目标是“缝合”它们并创建全景图像场景。

在整篇文章中,我们将介绍一些最着名的计算机视觉技术。这些包括:

局部不变描述符(SIFT,SURF等)

我们探索了许多特征提取算子,如SIFT,SURF,BRISK和ORB。你可以使用这款Colab笔记本,甚至可以用你的照片试试。[这里我已经调试好源码并上传到github上面]

给定一对像上面那样的图像,我们想要把它们拼接起来创建一个全景场景。值得注意的是,两个图像都需要共享一些共同的区域。此外,即使图片在以下一个或多个方面存在差异,我们的解决方案也必须强大:

朝这个方向迈出的第一步是提取一些感兴趣的关键点和特征。但是,这些功能需要具有一些特殊属性。我们首先考虑一个简单的解决方案。

一开始可能使用简单些的方法,诸如使用Harris Corners之类的算法提取关键点。然后,我们可以尝试根据欧几里德距离之类的相似度量来匹配相应的关键点。我们知道,角点(corner)有一个很好的属性:它们对旋转是不变的。这意味着,一旦我们检测到一个角点,如果我们旋转图像,那个角点仍将存在。但是,如果我们旋转然后缩放图像怎么办?在这种情况下,我们会很难,因为角点不是规模不变的。也就是说,如果我们放大图像,先前检测到的角可能会变成一条线!总之,我们需要对旋转和缩放不变的特征。这就是SIFT,SURF和ORB等更强大的方法的用武之地。

像SIFT和SURF这样的方法试图解决角点检测算法的局限性。

通常,角点检测器算法使用固定大小的内核来检测图像上的感兴趣区域(角点)。很容易看出,当我们缩放图像时,这个内核可能会变得太小或太大。为了解决这个限制,像SIFT这样的方法使用高斯差分(DoD)。我们的想法是在同一图像的不同比例版本上应用DoD。它还使用相邻像素信息来查找和细化关键点和相应的描述子。首先,我们需要加载2个图像,查询图片和训练图片。最初,我们首先从两者中提取关键点和描述符。我们可以通过使用OpenCV detectAndCompute()函数一步完成。请注意,为了使用detectAndCompute(),我们需要一个关键点检测器和描述符对象的实例。它可以是ORB,SIFT或SURF等。另外,在将图像馈送到detectAndCompute()之前,我们将它们转换为灰度。

下载2:Python视觉实战项目52讲

}

我要回帖

更多关于 如何匹配两个表格的信息 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信