增加 SIFT 中检测到的特征数量会提高精度吗?

Increasing the number of detected features in SIFT will increase precision?

我正在实施 content-based image retrieval application which involves the Bag of Features 模型。我正在使用 cv::SIFT 作为特征检测器。

无论如何,应用程序性能不是很好,我正在尝试从检测特征的第一步算法开始改进它们。

正在阅读 cv::SIFT::create() documentation 我看到了 3 个引起我注意的参数:

  • nfeatures – The number of best features to retain. The features are ranked by their scores (measured in SIFT algorithm as the local contrast)
  • contrastThreshold – The contrast threshold used to filter out weak features in semi-uniform (low-contrast) regions. The larger the threshold, the less features are produced by the detector.
  • edgeThreshold – The threshold used to filter out edge-like features. Note that the its meaning is different from the contrastThreshold, i.e. the larger the edgeThreshold, the less features are filtered out (more features are retained).

这意味着增加第一个和第三个参数,同时减少第二个参数,应该会提高算法精度(时间性能较低)?

我特别想知道第一个参数,例如,如果我们设置 nfeatures=2000,它将准确检测 2000 个特征,无论它们是否 "interesting"或不。这意味着它会检测到 "uninteresting"(太糟糕了)关键点吗?

我在 python 中使用过 SIFT 算法,并且在某个时间点研究过它以提高准确性。据我所知,以下是我可以整理的一些要点:

  1. "interesting" 特征的数量将始终取决于您使用它检测的对象。如果物体有非常随机的边缘,那么检测到的关键点就会更多。如果图像更简单(例如只有 1-2 种不同的颜色和非常独特的边界),那么检测到的关键点将非常少。在这种情况下,如果您增加 "nfeatures" 属性,则很有可能会检测到错误点并给您带来不好的结果。
  2. 假设你有非常好的目标图像并且你得到了你正在寻找的“2000”个关键点,改变其他属性将显着影响特征,因为这些属性主要用于关键点定位。您需要使用参数进行微调,但这些参数可能因对象而异。

根据官方文档,http://docs.opencv.org/3.1.0/da/df5/tutorial_py_sift_intro.html#gsc.tab=0 你可以看到图像中有很多检测到的关键点。所以要找出更多"interesting"个关键点,参数要实验

如果您正在寻找数学细节,我发现另一个 link 非常有用: http://www.inf.fu-berlin.de/lehre/SS09/CV/uebungen/uebung09/SIFT.pdf?bcsi_scan_ee7e30f120188340=0&bcsi_scan_filename=SIFT.pdf

这可以帮助您在 MATLAB 中更改参数及其参数时查看结果: http://www.vlfeat.org/overview/sift.html 希望你发现这对你的努力有用。