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

16

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

现在,我想将一个图像中的兴趣点与数据库中的图像列表进行比较,这些图像也有兴趣点列表,以找到最相似的图像。也就是说:[图像(I.P.)] 对比 [图像列表(I.P.)]。=> 最佳匹配。逐个比较图像会得到不令人满意的结果。

在搜索stackoverflow或其他网站时,我找到的最佳解决方案是在同时跟踪兴趣点来自哪里的情况下构建FLANN索引。但在实施之前,我有一些困扰我的问题:

1) 在基于它们的SURF兴趣点匹配图像时,我找到的算法通过彼此比较它们的距离(x1,y1->x2,y2)并找到总距离最短的图像来进行匹配。描述符或方向是否从未用于比较兴趣点?

2) 如果使用了描述符,则如何进行比较?我无法想象如何使用索引树将一个包含64个点的X向量(1个图像)与多个包含64个点的Y向量(多个图像)进行比较。

我真的需要一些帮助。我搜索过的所有地方或找到的API都只支持将一个图片与另一个图片匹配,但不能有效地将一个图片与图片列表匹配。


从文章更新:在关键点匹配步骤中,最近邻被定义为具有不变描述符向量的最小欧几里得距离的关键点。对于单个图像SURF比较,似乎最好的方法是针对具有X个兴趣点的图像1,在图像2中搜索相似的兴趣点并比较描述符。也就是说:for (int i=0; i < 64; i++) { (Descriptor(image1[i])-Descriptor(image2[i]) += DIST },然后选择距离最短的点,并在最后将所有内容加起来。但是,我仍然不明白如何为多个图像创建树形结构。 - MortenGR
1
对于阅读此文的人,我将提出另一个问题,这是我在处理过程中获得的知识。问题仍然是:如何将一个图像的描述符与其他图像的数据库进行匹配。 - MortenGR
2个回答

1

这里有多个要点。

为了确定两个图像是否(几乎)相等,您需要找到它们的同构投影,使得投影结果在投影特征位置之间产生最小误差。暴力破解是可能的,但不高效,因此一个技巧是假设相似的图像往往也具有相同的特征位置(稍微有所不同)。例如,在拼接图像时,通常仅从略微不同的角度和/或位置拍摄要拼接的图像;即使没有,距离也可能会随着方向差异的增加而增长(“成比例”)。

这意味着您可以通过找到所有图像对之间最小空间距离(k个最近邻居)的k个点对来选择候选图像,仅在这些点上执行同构。然后,您只需比较投影点对之间的空间距离并按该距离对图像进行排序;最低距离意味着在给定情况下可能的最佳匹配。

如果我没有弄错的话,描述符是由角度直方图中最强的角度定向的。这意味着您也可以直接采用64或128维特征描述符的欧几里得(L2)距离来获取给定两个特征的实际特征空间相似度,并对最佳k个候选进行单应性变换。(不过,您不会比较描述符发现的“尺度”,因为那样会破坏尺度不变性的目的。)
这两种选择都非常耗时,而且直接取决于图像和特征的数量;换句话说:这是一个愚蠢的想法。
近似最近邻
一个巧妙的技巧是根本不使用实际距离,而是使用近似距离。换句话说,您需要一种近似最近邻算法,FLANN(虽然不适用于.NET)就是其中之一。
这里的一个关键点是投影搜索算法。它的工作方式如下:假设您想比较 64 维特征空间中的描述符。您生成一个随机的 64 维向量并对其进行归一化,从而得到一个任意的特征空间单位向量;我们称之为 A。现在(在索引期间),您将每个描述符与该向量的点积形成。这将每个 64 维向量投影到 A 上,从而得到一个单个的实数 a_n。(该值 a_n 表示描述符沿着 A 相对于 A 的原点的距离。)
我从 this 在 CrossValidated 上的答案中借用了这张图片来直观地展示它;将旋转视为不同随机选择的 A 的结果,其中红色点对应于投影(因此,标量 a_n)。红色线显示了使用该方法所产生的误差,这就是搜索变得近似的原因。

Projection onto a vector

你需要再次使用A进行搜索,因此你要将其存储。你还要跟踪每个投影值a_n及其来源描述符;此外,你按a_n对每个a_n(带有其描述符的链接)进行排序并在列表中对齐。
为了使用here中的另一张图片进行澄清,我们感兴趣的是沿着轴A的投影点的位置。

Projection search

在图像中,4个投影点的值a_0..a_3大约为sqrt(0.5²+2²)=1.58、sqrt(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的矩阵将每个描述符乘起来,得到n个标量。

0

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

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


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接