简化版:第一张图片的每个关键点都与第二张图片的多个关键点匹配。我们为每个关键点保留2个最佳匹配项(最佳匹配项=具有最小距离测量值的匹配项)。Lowe的测试检查这两个距离是否足够不同。如果它们不够不同,那么该关键点将被排除,并且不会用于进一步计算。
详细版:
David Lowe提出了一种通过消除次优匹配来过滤关键点匹配的简单方法。需要注意的是,尽管在计算机视觉领域广泛使用,但该方法并不限于CV。这里我描述了该方法以及如何在计算机视觉的上下文中实现/应用。
假设L1是图像1的关键点集合,其中每个关键点都有一个描述,该描述列出关于关键点的信息,这些信息的性质实际上取决于使用的描述符算法。而L2是图像2的关键点集合。典型的匹配算法将通过找到L1中每个关键点在L2中的最接近匹配项来工作。如果使用欧几里得距离,就像在Lowe的论文中一样,这意味着来自L2集合的关键点与来自L1集合的关键点之间的欧几里得距离最小。
在这里我们可能会被诱导只是设定一个阈值,并消除距离高于该阈值的所有匹配项。但实际上并不那么简单,因为描述符中的不是所有变量都是“有差别”的:两个关键点之间的距离可能很小,因为它们描述符中的大多数变量具有相似的值,但是这些变量可能与实际匹配无关。可以始终向描述符的变量添加加权因子,使更具区分能力的特征“计数”更多。Lowe提出了一个更简单的解决方案,如下所述。
首先,我们将L1中的关键点与L2中的两个关键点匹配。从假设图像1中的关键点不能有超过一个等价物在图像2中推断出,这两个匹配项不能同时正确:它们中至少有一个是错误的。根据Lowe的推理,距离最近的匹配项是“好”匹配项,而第二小距离的匹配项相当于随机噪声,一种基本速率。如果“好”匹配项无法与噪声区别开来,则应拒绝“好”匹配项,因为它在信息上没有带来任何有趣的内容。因此,总体原则是最佳匹配项和次佳匹配项之间需要有足够大的差异。
如何操作化“足够的差异”的概念很重要:Lowe使用两个距离的比率,通常表示为:
if distance1 < distance2 * a_constant then ....
其中distance1是关键点与其最佳匹配之间的距离,distance2是关键点与其次佳匹配之间的距离。使用“小于”符号可能会有些令人困惑,但当考虑到较小的距离意味着该点更接近时,这一点就变得明显了。在OpenCV世界中,knnMatch函数将从最好到最差返回匹配项,因此第一个匹配项将具有较小的距离。问题实际上是“多小?”为了弄清楚这一点,我们将distance2乘以介于0和1之间的常数,从而减小distance2的值。然后我们再次查看distance1:它是否仍然小于distance2?如果是,则它通过了测试,并将添加到良好点列表中。如果不是,则必须将其消除。
这解释了“小于”部分,但乘法是怎么回事呢?由于我们正在查看距离之间的差异,为什么不只是使用distance1和distance2之间的实际数学差异?尽管技术上我们可以,但所得出的差异将是绝对的,过于依赖描述符内部的变量、我们使用的距离测量类型等。如果用于提取描述符的代码发生更改,影响所有距离测量,那该怎么办?简而言之,进行distance1-distance2会使方法更加脆弱,需要经常进行调整,并使方法学比较更加复杂。这都与比率有关。
带走的信息:Lowe的解决方案不仅因其简洁性而引人注目,还因为它在很多方面都是算法无关的。
bf.knnMatch(des1, des2, k=3)
或者一般情况下的k>2
呢?这种情况下,它会返回一个列表的列表,每个子列表的大小为k
。那么Lowe的比率测试应该如何执行? - nbro距离比率 = d(fi, fc)/d(fi, fs)
定义为图像一中特征fi与在图像二中与其最接近的匹配fc之间的距离除以与次接近匹配fs之间的距离。
通常情况下我们将距离比率阈值(ρ)设置为0.5左右,这意味着我们要求最佳匹配距离次佳匹配至少要接近两倍于原始特征描述符。因此丢弃不明确的匹配项并保留好的匹配项。