OpenCV 4.12.0
開源計算機視覺
載入中...
搜尋中...
無匹配項
直方圖比較

上一個教程: 直方圖計算
下一個教程: 反向投影

原始作者Ana Huamán
相容性OpenCV >= 3.0

目標

在本教程中,您將學習如何

  • 使用函式 cv::compareHist 獲取一個數值引數,該引數表示兩個直方圖的匹配程度。
  • 使用不同的度量標準來比較直方圖

理論

  • 為了比較兩個直方圖( \(H_{1}\) 和 \(H_{2}\) ),首先我們必須選擇一個度量標準( \(d(H_{1}, H_{2})\))來表示兩個直方圖的匹配程度。
  • OpenCV 實現了 cv::compareHist 函式來執行比較。它還提供了 4 種不同的度量標準來計算匹配度。
    1. 相關性 ( cv::HISTCMP_CORREL )

      \[d(H_1,H_2) = \frac{\sum_I (H_1(I) - \bar{H_1}) (H_2(I) - \bar{H_2})}{\sqrt{\sum_I(H_1(I) - \bar{H_1})^2 \sum_I(H_2(I) - \bar{H_2})^2}}\]

      其中

      \[\bar{H_k} = \frac{1}{N} \sum _J H_k(J)\]

      其中 \(N\) 是直方圖 bin 的總數。
    2. 卡方 ( cv::HISTCMP_CHISQR )

      \[d(H_1,H_2) = \sum _I \frac{\left(H_1(I)-H_2(I)\right)^2}{H_1(I)}\]

    3. 交叉 ( method=cv::HISTCMP_INTERSECT )

      \[d(H_1,H_2) = \sum _I \min (H_1(I), H_2(I))\]

    4. 巴氏距離 ( cv::HISTCMP_BHATTACHARYYA )

      \[d(H_1,H_2) = \sqrt{1 - \frac{1}{\sqrt{\bar{H_1} \bar{H_2} N^2}} \sum_I \sqrt{H_1(I) \cdot H_2(I)}}\]

程式碼

  • 此程式的作用是什麼?
    • 載入一張基礎影像和兩張測試影像,用於與基礎影像進行比較。
    • 生成一張影像,它是基礎影像的下半部分。
    • 將影像轉換為 HSV 格式
    • 計算所有影像的 H-S 直方圖,並對其進行歸一化以便比較。
    • 比較基礎影像的直方圖與兩張測試影像的直方圖、基礎影像下半部分的直方圖以及基礎影像自身的直方圖。
    • 顯示獲得的數值匹配引數。

解釋

  • 載入基礎影像 (src_base) 和另外兩張測試影像

  • 將它們轉換為 HSV 格式

  • 此外,建立一個基礎影像的下半部分影像(HSV 格式)

  • 初始化計算直方圖的引數(bin 數量、範圍以及 H 和 S 通道)。

  • 計算基礎影像、兩張測試影像和基礎影像下半部分的直方圖

  • 依次應用 4 種比較方法,比較基礎影像 (hist_base) 的直方圖與其他直方圖

結果

  1. 我們使用以下影像作為輸入:

其中第一張是基礎影像(用於與其他影像比較),另外兩張是測試影像。我們還將第一張影像與自身以及與基礎影像的下半部分進行比較。

  1. 當我們將基礎影像直方圖與自身比較時,應該會得到完美匹配。此外,與基礎影像下半部分的直方圖相比,它應該呈現出高匹配度,因為它們都來自同一來源。對於另外兩張測試影像,我們可以觀察到它們具有非常不同的光照條件,因此匹配度應該不會很好。
  2. 以下是我們使用 OpenCV 3.4.1 獲得的數值結果
    方法 基礎 - 基礎基礎 - 下半部分基礎 - 測試 1基礎 - 測試 2
    相關性 1.000000 0.880438 0.20457 0.0664547
    卡方 0.000000 4.6834 2697.98 4763.8
    交叉 18.8947 13.022 5.44085 2.58173
    巴氏距離 0.000000 0.237887 0.679826 0.874173
    對於相關性交叉方法,度量值越高,匹配越準確。正如我們所見,基礎-基礎匹配度最高,符合預期。我們還可以觀察到,基礎-下半部分匹配度位居第二(正如我們預測的)。對於另外兩種度量標準,結果越小,匹配度越好。我們可以觀察到,測試 1 和測試 2 與基礎影像的匹配度較差,這也符合預期。