如何将 SURF 兴趣点与图像数据库匹配

Posted

技术标签:

【中文标题】如何将 SURF 兴趣点与图像数据库匹配【英文标题】:How to match SURF interest points to a database of images 【发布时间】:2011-11-24 09:49:53 【问题描述】:

我正在使用 C# (OpenSurf) 中的 SURF 算法从图像中获取兴趣点列表。每个兴趣点都包含一个描述符向量、一个 x 坐标 (int)、一个 y 坐标 (int)、比例 (float) 和方向 (float)。

现在,我想将一张图像的兴趣点与数据库中的图像列表进行比较,该数据库也有兴趣点列表,以找到最相似的图像。即:[Image(I.P.)] COMPARETO [List of Images(I.P.)]。 => 最佳匹配。逐个比较图像会产生不令人满意的结果。

在搜索 *** 或其他网站时,我发现的最佳解决方案是建立一个 FLANN 索引,同时跟踪兴趣点的来源。但在实施之前,我有一些令我困惑的问题:

1) 当基于图像的 SURF 兴趣点匹配图像时,我发现一种算法通过比较它们的距离 (x1,y1->x2,y2) 并找到总数最低的图像来进行匹配距离。比较兴趣点时从不使用描述符或方向吗?

2) 如果使用了描述符,我该如何比较它们?我不知道如何使用索引树比较 64 点(1 张图像)的 X 向量和 64 点(多张图像)的 Y 向量。

非常感谢您的帮助。我搜索过的所有地方或找到的API,只支持一张图片与另一张图片匹配,不支持一张图片与图片列表有效匹配。

【问题讨论】:

从文章更新:“在关键点匹配步骤中,最近邻被定义为不变描述符向量的具有最小欧几里得距离的关键点”。似乎单图像 SURF 比较的最佳方法是使用具有 X 个兴趣点的图像 1 在图像 2 比较描述符中搜索相似的兴趣点。即: for (int i=0; i 对于阅读本文的人,我将提出另一个问题,这是我在此过程中获得的知识。问题仍然是:如何将一个图像的描述符匹配到其他图像的数据库。 【参考方案1】:

这里有很多东西。

为了知道两个图像(几乎)相等,您必须找到两个图像的单应投影,以使投影在投影特征位置之间产生最小误差。暴力破解是可能的,但效率不高,所以一个技巧是假设相似的图像也倾向于在同一位置具有特征位置(给予或接受一点)。例如,在拼接图像时,要拼接的图像通常仅从稍微不同的角度和/或位置拍摄;即使没有,距离也可能会随着方向的不同而增长(“成比例地”)。

这意味着您可以 - 作为一个广泛的阶段 - 通过在所有图像对之间找到具有最小空间距离(k 最近邻居)的点对 k 来选择候选图像,并仅对这些点执行单应性。只有这样您才能比较 投影 点对空间距离,并按所述距离对图像进行排序;最短距离意味着最好的匹配(考虑到情况)。

如果我没记错的话,描述符的方向是角度直方图中最强的角度。 Theat 意味着您也可以决定直接采用 64 或 128 维特征描述符的欧几里德 (L2) 距离,以获得两个给定特征的实际特征空间相似性,并对最佳k 候选者执行单应性。 (不过,您不会比较在其中找到描述符的 scale,因为这会破坏规模不变性的目的。)

这两个选项都非常耗时,并且直接取决于图像和特征的数量;换句话说:愚蠢的想法。

近似最近邻

一个巧妙的技巧是根本不使用实际距离,而是使用 近似 距离。换句话说,您需要一个近似的最近邻算法,FLANN(尽管不适用于 .NET)就是其中之一。

这里的一个关键点是投影搜索算法。它是这样工作的: 假设您要比较 64 维特征空间中的描述符。您生成一个随机的 64 维向量并对其进行归一化,从而在特征空间中生成一个任意单位向量;我们称之为A。现在(在索引期间)您针对该向量形成每个描述符的点积。这会将每个 64 维向量投影到 A 上,从而得到一个实数 a_n。 (这个值a_n 表示描述符沿A 相对于A 的原点的距离。)

我从this 上借用的关于 PCA 的 CrossValidated 答案中的这张图片直观地展示了它;将旋转视为A 的不同随机选择的结果,其中红点对应于投影(因此,标量a_n)。红线显示了您使用该方法所犯的错误,这就是使搜索近似的原因。

您将再次需要A 进行搜索,因此您可以存储它。您还可以跟踪每个预测值 a_n 及其来自的描述符;此外,您将每个a_n(带有指向其描述符的链接)排列在一个列表中,按a_n 排序。

为了澄清使用来自here 的另一张图片,我们对投影点的位置感兴趣沿A

图像中4个投影点的a_0 .. a_3值大约为sqrt(0.5²+2²)=1.58sqrt(0.4²+1.1²)=1.17-0.84-0.95,对应于它们到A原点的距离。

如果您现在想找到相似的图像,您也可以这样做:将每个描述符投影到A,从而得到一个标量q(查询)。现在您转到列表中q 的位置并获取k 周围的条目。这些是您的近似最近邻居。 现在获取这些 k 值的特征空间距离并按最小距离排序 - 顶部的距离是您的最佳候选者。

回到最后一张图片,假设最上面的点是我们的查询。它的投影是1.58,它的近似最近邻(四个投影点)是1.17。它们在特征空间中并不是真正接近,但鉴于我们只是使用两个值比较了两个 64 维向量,它也没有那么糟糕。

您会看到那里的限制,并且类似的预测根本不要求原始值接近,这当然会导致相当有创意的匹配。为了适应这一点,您只需生成 更多 个基本向量 BC 等 - 比如说它们中的 n - 并跟踪每个单独的列表。取所有k 最佳匹配,根据k*n 64 维向量到查询向量的欧几里德距离对列表进行排序,对最好的向量执行单应性并选择投影误差最小的向量。

这方面的巧妙之处在于,如果您有 n(随机、标准化)投影轴并希望在 64 维空间中搜索,您只需将每个描述符与 n x 64 矩阵相乘,得到 @987654364 @标量。

【讨论】:

【参考方案2】:

我很确定描述符之间的距离是计算的,而不是它们的坐标 (x,y)。您只能直接将一个描述符与另一个进行比较。我提出以下可能的解决方案(肯定不是最优的)

您可以为查询图像中的每个描述符找到数据集中的前 k 个最近邻居,然后获取所有前 k 个列表并在那里找到最常见的图像。

【讨论】:

以上是关于如何将 SURF 兴趣点与图像数据库匹配的主要内容,如果未能解决你的问题,请参考以下文章

使用 SURF 匹配图像并确定最佳匹配

EMGU CV SURF 图像匹配

SIFT/SURF

SURF+GTM基于SURF特征提取,GTM去除错误配准点的图像匹配算法的MATLAB仿真

怎么提取SURF匹配后的图像特征点坐标

Matlab中多幅图像的SURF描述符与匹配