什么是最佳功能检测



我们有两个图像,一个作为参考和另一个图像,我们希望使用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)';

在此代码中,我们不太在乎速度,对我们来说最重要的是准确性。

1(在这里,我们使用的是冲浪方法,我们尝试了解这是该任务的最佳方法,或者也许我们应该使用其他功能检测,例如猪或快速?

2(我们试图了解每个特征检测器与何时使用它们之间有什么区别?

预先感谢。

没有"最佳"功能检测器之类的东西,绝对说,匹配的质量很大程度上取决于特定图像以及您用于配置检测器的参数的特定图像,Alrough有一个特征检测器,它们具有客观地具有较宽的条件范围,它们的工作正常

  • Surf sift 通常被认为是那里最好的功能探测器,出于充分的原因,它们在大多数情况下非常强大,非常快,很快到目前为止,我发现他们弱点的唯一情况是具有高度详细的目标(例如电气板(,但请记住,冲浪和筛选都受到专利的保护,因此,如果您的目标涉及,则必须支付很多钱商业用途

  • akaze (https://github.com/pablofdezalc/akaze(是有效的免费使用 SURF/SIFT的替代方案:它的鲁棒性相似在大多数情况下,要筛选/冲浪以及表现,这里唯一的约束是您需要一个64位体系结构来运行Akaze,以表演良好,我发现在32位体系结构上,perferasace perferasace drogast drop drop

  • fast 的名称非常快,非常"贪婪",与其他检测器相比,它提取了很多关键点,但它不是> 转不变(如果目标旋转尊重参考图像,则意味着它将无法工作(。这也是一个只是一个探测器,因此您必须描述与其他描述符提取的关键点,并且匹配的鲁棒性将取决于这一点,我的建议是尝试怪胎或球作为描述符,这两者都为我提供了很好的结果快速

  • 简短具有良好的性能,并且提取的关键点数量比快速点要低,就像快速一样,它是不是不是旋转不变性,并且没有相应的描述符

  • ORB 基本上是前两个检测器的演变(ORB代表定向快速和旋转的简短简介(,旋转不变的,并且也实现其自己的遗留者,这可能是最佳选择用于一般目的,它可以免费使用,并且其稳健性与Sift/Surf/akaze相当,而表演略微克服了这些功能(使用默认参数(,Altrough ultrough ultrough the Rubustnes是实际上,在大多数情况下,有些特定的情况,它克服了冲浪/筛分/akaze(例如,再次电气板(

  • Brisk 具有与CPU负载更大的ORB非常相似的行为,因为在大多数情况下,Orb在鲁棒性和表现方面效果更好,而人们通常会使用Orb而不是

  • HOG (您提到的(实际上并不是要与功能匹配一起使用,更可能适合深度学习分类

这些是最受欢迎的探测器(和描述符(,在大多数情况下,还有很多其他探测器(AGAST,GFTT,MSER,Star等(和描述符(闩锁,Lucid,Lucid,Daisy等(,在大多数情况下是,不如我列出的那些,但可能会更好地拟合特定情况

如果您以快速的方式测试这些检测器/描述符的鲁棒性和表演,我建议您下载并安装Find-object(http://introlab.github.github.io/find-object/(,可以让您进行基准测试这些通过目标图像匹配的算法可以轻松地提供可互补的接口,如果您在github上也可以在github上使用源代码(https://github.com/introlab/find-object(

您观点的简短摘要:

1(SIFT和SURF基于梯度(HOG(的直方图,该梯度(HOG(是计算像素斑块中每个梯度的直方图,并且这些计算耗费时间。SIFT和SURF受到专利的保护。尽管时间,功耗和计算成本在设备体系结构上对您无关紧要时,但它会为您带来最佳结果。

2(这取决于您要在哪里使用该应用程序。它是基于系统的应用程序或用于手持设备(手机(或智能眼镜的应用程序?

筛分和冲浪在手机和智能眼镜上的效果较差。快速不是旋转不变的。快速需要高计算GPU。如果没有您要使用此的情况,那么很难建议这是最好的。

您可以从下面的文章中找到更多详细的答案

堆栈溢出

最新更新