【问题标题】:Increasing the number of detected features in SIFT will increase precision?增加 SIFT 中检测到的特征数量会提高精度吗?
【发布时间】:2016-07-20 03:16:09
【问题描述】:

我正在实现一个涉及Bag of Features 模型的content-based image retrieval 应用程序。我使用cv::SIFT 作为特征检测器。

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

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

  • nfeatures – 要保留的最佳特征的数量。特征按其分数排序(在 SIFT 算法中测量为本地 对比)
  • contrastThreshold – 用于过滤半均匀(低对比度)区域中的弱特征的对比度阈值。越大的 阈值,检测器产生的特征越少。
  • edgeThreshold – 用于过滤边缘特征的阈值。请注意,其含义与 contrastThreshold,即edgeThreshold越大,越少 特征被过滤掉(更多特征被保留)。

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

我特别想知道第一个参数,例如,如果我们设置nfeatures=2000,它将准确检测2000 功能,无论它们是否“有趣”。这意味着它会检测到“无趣”(如此糟糕)的关键点吗?

【问题讨论】:

    标签: c++ opencv image-processing computer-vision sift


    【解决方案1】:

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

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

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

    如果您正在寻找数学细节,我发现另一个非常有用的链接是: 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 希望您发现这对您的努力有用。

    【讨论】:

    • 感谢您的有用回答。我知道 VLFeat,它也有一个 C API,不幸的是在 C 端没有很好的文档记录。
    • 无论如何,您的回答刚刚证实了我的怀疑:增加nFeatures 的数量可能会导致误报(以及非常糟糕的结果)。我认为 ASIFT 可能是一个更精确的解决方案。我们拭目以待。
    • 不客气。 :) 我没用过 ASIFT,所以不太确定。
    猜你喜欢
    • 2012-04-05
    • 1970-01-01
    • 2020-04-24
    • 2023-03-21
    • 2012-01-09
    • 2014-07-30
    • 2021-04-13
    • 2014-03-30
    • 1970-01-01
    相关资源
    最近更新 更多