我正在检测BRISK和SURF特征点。我有以下代码用于检测。
im = imread('hammer.png');
pointsBRISK = detectBRISKFeatures(im, 'NumOctaves', 3);
pointsSURF = detectSURFFeatures(im, 'NumOctaves', 3);
这是我的原始图片:
这是BRISK要点:
这是SURF要点:
我使用以下代码绘制这些点:
figure; imshow(im); hold on; plot(pointsBRISK); title('pointsBRISK');
figure; imshow(im); hold on; plot(pointsSURF); title('pointsSURF');
这些观点没有错。然而,当我看到点的比例时,我得到了BRISK和SURF完全不同的比例但是从图像中我可以说比例应该是相似的。
以下是BRISK点和SURF点的比例:
BRISK SURF
11.9173 2.9333
11.9381 2.9333
12.3887 2.9333
12.4036 2.9333
12.5329 2.9333
26.8478 2.9333
31.8943 2.9333
36.0000 2.9333
48.0000 3.0667
72.0000 3.0667
72.0000 4.1333
72.0000 4.2667
72.0000 4.2667
72.0000 4.2667
72.0000 4.2667
4.2667
4.4000
4.4000
4.4000
6.1333
8.6667
8.8000
8.9333
11.6000
12.1333
12.2667
12.2667
较大的值代表图像中较大的圆圈。
似乎他们处于完全不同的领域。我如何将他们带到同一个域?或者,如果问题再次出现,我该如何解决?
[编辑]
好吧,我已查看了extractFeatures
功能。它使用BRISKPoints或SURFPoints来提取特征。函数内部有转换函数,pointsToBRISKPoints
或parseSURFInputs
。在那些功能中,比例被转换。但仍然存在问题。
当BRISK点转换为SURF点时,BRISK标度除以6 。另一方面,当SURF点转换为BRISK点时,SURF标度乘以10 !我认为它也应该是6!为什么不是6?
[编辑]
谢谢!
答案 0 :(得分:3)
BRISK和SURF之间的比例表示不同。报告的BRISK标度基于BRISK采样模式的半径。 SURF标度由检测标度表示" s"用于关键点检测的盒式过滤器。
有关此内容的详细信息,请参阅原始参考文献:
(BRISK)http://www.robots.ox.ac.uk/~vgg/rg/papers/brisk.pdf
(SURF)http://www.vision.ee.ethz.ch/~surf/eccv06.pdf
SURF估计半径为6s的区域的方向。因此,当将BRISK比例信息转换为SURF时,将BRISK比例除以6以确保在类似大小的区域上估计方向。当SURF转换为BRISK时,10来自SURF描述符在20s窗口上提取的事实,因此乘以10可确保BRISK采样模式覆盖20s窗口的大部分,因此描述符捕获大部分相同信息。
这些转换也可以通过其他方式完成。只需从BRISKPoints对象中的信息创建SURFPoints对象即可。
话虽如此,BRISK是一个基于角落的探测器/描述符,而SURF是基于blob的探测器/描述符,因此你无法真正得到一个正确的"总是有意义的映射。