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

时间:2011-11-24 09:49:54

标签: c# algorithm tree computer-vision surf

我在C#(OpenSurf)中使用SURF算法来获取图像中的兴趣点列表。这些兴趣点中的每一个都包含描述符向量,x坐标(int),y坐标(int),缩放(float)和方向(float)。

现在,我想比较一个图像的兴趣点和数据库中的图像列表,这些图像列表中还有一个兴趣点列表,以找到最相似的图像。即:[Image(I.P。)] COMPARETO [图像列表(I.P。)]。 =>最佳匹配。在个体基础上比较图像会产生不令人满意的结果。

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

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

2)如果使用描述符,我该如何比较它们?我无法弄清楚如何使用索引树比较64点(1图像)的X矢量和64点(几个图像)的Y矢量。

我真的很感激一些帮助。我搜索的所有地方或我发现的API,只支持将一张图片匹配到另一张图片,但不能将一张图片有效地匹配到图片列表。

2 个答案:

答案 0 :(得分:1)

这里有很多东西。

为了知道两个图像(几乎)相等,您必须找到两个图像的均匀投影,这样投影会导致投影特征位置之间的误差最小。蛮力可能但效率不高,因此一个技巧是假设类似的图像往往也具有相同位置的特征位置(给予或略微)。例如,当缝合图像时,通常仅从略微不同的角度和/或位置拍摄要缝合的图像;即使没有,距离也可能会增加("按比例")到方向的差异。

这意味着您可以 - 作为一个广泛的阶段 - 通过在所有图像对之间找到具有最小空间距离(k最近邻居)的k对点来选择候选图像,并仅执行单应性在这些方面。然后,您只需比较投影点 - 成对空间距离,并按所述距离对图像进行排序;最低距离意味着最佳匹配(根据情况而定)。

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

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

近似最近邻居

一个巧妙的技巧是根本不使用实际距离,而是近似距离。换句话说,你想要一个近似的最近邻居算法,而FLANN(虽然不适用于.NET)将是其中之一。

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

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

Projection onto a vector

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

为了澄清使用here中的其他图片,我们对投影点沿轴<{1}} 的位置感兴趣:

Projection search

图片中4个投影点的值A大约为a_0 .. a_3sqrt(0.5²+2²)=1.58sqrt(0.4²+1.1²)=1.17-0.84,对应于它们距{的距离{1}}的来源。

如果您现在想要查找类似的图像,则执行相同的操作:将每个描述符投影到-0.95,从而生成标量A(查询)。现在,您转到列表中A的位置,并获取q周围的条目。这些是你的近似最近邻居。 现在获取这些q值的特征空间距离,并按最低距离排序 - 最佳距离是最佳候选者。

回到最后一张图片,假设最顶点是我们的查询。它的投影是k,它的近似最近邻居(四个投影点)是k的那个。它们在特征空间中并非真正关闭,但鉴于我们只使用两个值来比较两个64维向量,它也不是那么糟糕。

你看到那里的限制,类似的预测根本不要求原始值接近,这当然会导致相当有创意的匹配。为了适应这种情况,您只需生成更多基本向量1.581.17等等 - 比如说B - 并跟踪单独的列表每。对所有这些匹配进行C最佳匹配,根据它们与查询向量的欧氏距离对n 64维向量列表进行排序,对最佳向量进行单应性并选择最低的一个投影错误。

关于这一点的一个简洁的部分是,如果你有k(随机的,标准化的)投影轴并想要在64维空间中搜索,你只需将每个描述符与k*n矩阵相乘,导致n标量。

答案 1 :(得分:0)

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

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