1

我有一组超过 1000 张图片的图像。对于每个图像,我都提取 SURF 描述符。现在我将添加一个查询图像,并想尝试在图像集中找到最相似的图像。出于性能和内存的原因,我只为每个图像提取 200 个带有描述符的关键点。这或多或少是我的问题。目前我通过这样做过滤匹配:

对称匹配: 两个方向的简单暴力匹配。所以从 Image1 到 Image2 和从 Image2 到 Image1。我只保留两个方向都存在的匹配项。

    List<Matches> match1 = BruteForceMatching.BFMatch(act.interestPoints, query.interestPoints);
    List<Matches> match2 = BruteForceMatching.BFMatch(query.interestPoints, act.interestPoints);

    List<Matches> finalMatch = FeatureMatchFilter.DoSymmetryTest(match1, match2);

    float distance = 0;
    for(int i = 0; i < finalMatch.size(); i++)
        distance += finalMatch.get(i).distance;

    act.pic.distance = distance * (float) query.interestPoints.size() / (float) finalMatch.size();

我知道还有更多过滤方法。你怎么看我试着用最终比赛的数量来衡量距离。但我不觉得我这样做是正确的。当我寻找其他方法时,它们看起来都使用图像中存在的所有提取兴趣点进行计算。有没有人有一个好的方法?还是权衡距离的好主意?

我知道没有黄金解决方案,但一些经验、想法和其他方法会非常有帮助。

4

1 回答 1

0

因此,“match1”表示其中一个数据库图像的定向匹配,“match2”表示查询图像,“finalMatch”是这些图像之间的所有匹配,“finalMatch.get(i).distance”是它们之间的某种平均值两个有向距离。

所以你要做的是,你计算距离总和的平均值,并根据你拥有的兴趣点的数量来缩放它们。我假设的目标是很好地衡量整体图像的匹配程度。

我很确定您计算的距离并不能很好地反映这种相似性。将距离的总和除以匹配的数量是有道理的,与其他查询图像相比,这可能会让您了解相似性,但是用兴趣点的数量缩放这个值并没有任何意义。

首先,我建议您摆脱这种缩放。我不确定你的蛮力匹配究竟做了什么,但除了你的对称性测试之外,你应该丢弃第一个和第二个候选者的比率很高的匹配(如果我没记错的话,Lowe 建议阈值为 0.8) . 然后,如果是刚性场景,我建议您应用某种基本矩阵估计(8 点算法 + RANSAC)并使用对极几何过滤结果。我很确定“真实”匹配的平均指标距离将使您对数据库图像和查询的“相似性”有一个很好的了解。

于 2014-06-26T10:01:39.800 回答