我有一组超过1000张图片的图像。对于每个Image我提取SURF描述符。现在,我将添加一个查询图像,并希望尝试在图像集中找到最相似的图像。出于性能和内存的原因,我只使用描述符为每个图像提取200个关键点。这或多或少是我的问题。目前我通过这样做来过滤匹配:
Symmetrie Matching: 简单的BruteForce在两个方向上匹配。所以从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();
我知道有更多的过滤方法。你怎么看我尝试用最终比赛的数量来衡量距离。但我没有感觉我这样做是正确的。当我查看其他方法时,它们看起来都会计算出图像中存在的所有extractet兴趣点。有没有人有这个好方法?或者加权距离的好主意?
我知道没有黄金解决方案,但是一些经验,想法和其他方法会非常有用。
答案 0 :(得分:0)
所以&#34;匹配1&#34;表示一个数据库图像和&#34; match2&#34;的定向匹配。查询图像,&#34; finalMatch&#34;是这些图像和&#34; finalMatch.get(i).distance&#34;之间的所有匹配。是两个有向距离之间的某种平均值。
所以你要做的是,你计算距离总和的平均值,然后用你拥有的兴趣点数量来衡量它们。我假设的目标是对整体图像的匹配程度有一个很好的预测。
我很确定你计算的距离并不能很好地反映这种相似性。将距离之和除以匹配数量是有意义的,这可能会让您在与其他查询图像进行比较时了解相似性,但是使用兴趣点数量来缩放此值并不能做任何有意义的事情。
首先,我建议您摆脱这种缩放。我不确定你的蛮力匹配究竟是什么,但除了你的对称性测试之外,你应该放弃第一个和第二个候选者的比例高的匹配(如果我没记错的话,Lowe建议一个阈值0.8)。然后,如果它是一个刚性场景,我建议您应用某种基本矩阵估计(8点算法+ RANSAC)并使用极线几何过滤结果。我非常确定&#34;真实&#34;的平均值。匹配将让你对&#34;相似性&#34;数据库图像和查询。