2016-07-20 30 views
-1

我正在實施一個content-based image retrieval應用程序,其中涉及Bag of Features模型。我使用cv::SIFT作爲特徵檢測器。增加SIFT中檢測到的特徵數量會提高精度?

無論如何,應用程序的性能不是很好,我試圖從第一步算法,它是檢測功能,以提高他們。

閱讀cv::SIFT::create() documentation我看到3個參數,引起了我的注意:

  • n功能 - 的最佳功能保留的數量。對比度閾值 - 用於濾除半均勻(低對比度)區域中弱微特徵的對比度閾值。(對比度閾值用於濾除半均勻(低對比度)區域中的微弱特徵。閾值越大,檢測器產生的特徵越少。
  • edgeThreshold - 用於濾除邊緣狀特徵的閾值。請注意,其含義與對比度閾值不同,即邊緣閾值越大,濾除特徵的功能越少(保留更多功能)。

這意味着,增加第一和第三參數,而減小第二,應該提高算法的精度(以較低的時間表演)?

我想知道這個特別是對於第一個參數,例如,如果我們設置了nfeatures=2000,那麼無論它們是否「有趣」,它都會準確檢測到2000的特徵。這意味着它是否會檢測到「無趣」(非常糟糕)的關鍵點?

回答

2

我已經在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 您可以看到圖像中有很多檢測到的關鍵點。所以findout更「有趣」的關鍵點,參數被實驗

而且,我覺得非常有用的,如果你正在尋找數學細節另一個鏈接是: 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 希望你發現這對你的作品有用。

+0

感謝您的有用答案。我知道VLFeat,它也有一個C API,不幸的是在C方面沒有很好的記錄。 – justHelloWorld

+0

無論如何,你的答案只是證實了我的嫌疑犯:增加'nFeatures'的數量可能會導致誤報(以及糟糕的結果)。我認爲ASIFT可能是更精確的解決方案。我們拭目以待。 – justHelloWorld

+0

不客氣。 :)我沒有使用ASIFT,所以不太確定。 – Saurav