最好的特征检测是什么?

אבי*_*זרא 1 matlab image-processing feature-extraction feature-detection

我们有两张图像,一张作为参考,另一张我们想要使用 Matlab 来像参考一样对齐。为此,我们需要在两个图像中找到相似点,然后使用最小二乘法计算核矩阵进行变换,如下代码所示:

clear all; close all; clc; imtool close all;
      I1 = rgb2gray(im);
      I2 = rgb2gray(ref);
      points1 = detectSURFFeatures(I1);
      points2 = detectSURFFeatures(I2);
      [features1,valid_points1] = extractFeatures(I1,points1,'SURFSize',64);
      [features2,valid_points2] = extractFeatures(I2,points2,'SURFSize',64);
      indexPairs = matchFeatures(features1,features2);
      matchedPoints1 = valid_points1(indexPairs(:,1),:);
      matchedPoints2 = valid_points2(indexPairs(:,2),:);
      [tform, correct1,correct2] = estimateGeometricTransform(matchedPoints1,matchedPoints2,'projective','MaxNumTrials',100000,'Confidence',99.9999,'MaxDistance',4);
      sourcepoints = correct1.Location;
      targetpoints = correct2.Location;
      sizenum = size(sourcepoints,1);
      x_source = sourcepoints(:,1);
      y_source = sourcepoints(:,2);
      x_target = targetpoints(:,1);
      y_target = targetpoints(:,2);
      zero_vec = zeros([sizenum,1]);
      one_vec = ones([sizenum,1]);
      H = [x_source,y_source,one_vec,zero_vec,zero_vec,zero_vec,-x_source.*x_target,-y_source.*x_target;...
           zero_vec,zero_vec,zero_vec,x_source,y_source,one_vec,-x_source.*y_target,-y_source.*y_target];
      Y = [x_target;y_target];
      variables = (inv(H'*H))*H'*Y;
      variables(9) = 1;
      kernel = reshape(variables,3,3)';
Run Code Online (Sandbox Code Playgroud)

在这段代码中我们不太关心速度,对我们来说最重要的是准确性。

1)在这里,我们使用 Surf 方法,我们尝试了解这是否是此任务的最佳方法,或者也许我们应该使用其他特征检测,如 HOG 或 FAST 等?

2)我们尝试了解每种特征检测器之间有什么区别以及何时使用它们?

提前致谢。

Man*_*jia 5

不存在所谓的“最佳”特征检测器,绝对来说,匹配的质量很大程度上取决于特定图像,此外还取决于您用于配置检测器的参数,尽管存在客观上具有更广泛范围的特征检测器。他们工作良好的条件

  • SURFSIFT通常被认为是最好的特征检测器,有充分的理由,它们在大多数情况下都非常强大且非常快,到目前为止,我发现它们表现出弱点的唯一场景是高度详细的目标(电气例如板),但请记住 SURF 和 SIFT 均受专利保护,因此如果您的目标涉及商业用途,您将不得不支付大量费用

  • AKAZEhttps://github.com/pablofdezalc/akaze)是 SURF/SIFT 的有效免费替代方案:在大多数情况下,其稳健性以及性能与 SIFT/SURF 类似,这里唯一的限制是你需要 64 位架构才能以良好的性能运行 AKAZE,我发现在 32 位架构上性能急剧下降

  • FAST,顾名思义,非常快,而且非常“贪婪”,与其他检测器相比,它提取了很多关键点,但它不是旋转不变的(这意味着如果目标旋转到参考值,它就不起作用)图像)。而且它只是一个检测器,因此您必须使用其他描述符来描述您提取的关键点,并且匹配的鲁棒性将取决于此,我的建议是尝试 FREAK 或 ORB 作为描述符,这两者都给了我很好的结果快速地

  • Brief具有良好的性能,并且确实比FAST提取更少数量的关键点,就像FAST一样,它不是旋转不变的并且没有相应的描述符

  • ORB基本上是前 2 个检测器的演变(ORB 代表 Oriented fast 和 Rotated Brief),它具有旋转不变性,并且还实现了自己的描述符,这可能是通用目的的最佳选择,它是免费使用的,并且其鲁棒性是与 SIFT/SURF/AKAZE 相当,虽然性能稍微克服了它们(使用默认参数),尽管在大多数情况下鲁棒性实际上稍差,但在某些特定场景中它克服了 SURF/SIFT/AKAZE(再次是电学)以板为例)

  • BRISK的行为与 ORB 非常相似,但 CPU 负载稍高一些,因为在大多数情况下,ORB 在鲁棒性和性能方面都表现得更好,人们通常最终会使用 ORB

  • HOG(您提到的)实际上并不意味着与特征匹配一起使用,它更可能适合深度学习分类

这些是最流行的检测器(和描述符),还有许多其他检测器(AGAST、GFTT、MSER、STAR 等)和描述符(LATCH、LUCID、DAISY 等),在大多数情况下,它们的性能不如我列出的那些,但可能更适合特定情况

如果您有兴趣快速测试这些检测器/描述符的稳健性和性能,我建议您下载并安装 Find-Object ( http://introlab.github.io/find-object/ ),它可以让您通过以下方式对这些算法进行基准测试目标图像匹配提供了一个舒适的界面来轻松完成此操作,如果您对此感兴趣,也可以在 github 上找到源代码(https://github.com/introlab/find-object