我正在检测BRISK和SURF特征点。我有以下代码进行检测。
im = imread('hammer.png');
pointsBRISK = detectBRISKFeatures(im, 'NumOctaves', 3);
pointsSURF = detectSURFFeatures(im, 'NumOctaves', 3);
这是我的原始图片:
这是危险点:
这是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?
[编辑]
谢谢!
在BRISK和SURF之间,量表的表示方式有所不同。报告的BRISK比例基于BRISK采样模式的半径。 SURF标度由用于关键点检测的盒式滤波器的检测标度" s"表示。
可以在原始参考资料中找到有关此内容的详细信息:
(风险)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是基于斑点的检测器/描述符,因此您无法真正获得始终有意义的"正确"映射。