OpenCV 4.13.0
Open Source Computer Vision
読み込み中...
検索中...
見つかりません
🤖 AIによる機械翻訳(非公式) — これは OpenCV 4.13.0 公式リファレンス(英語)を AI (Claude) で自動翻訳したものです。訳に誤りを含む場合があります。正確な情報は 公式英語版(原文) を参照してください。
ヒストグラムの比較

前のチュートリアル: ヒストグラムの計算
次のチュートリアル: バックプロジェクション

原著者Ana Huamán
互換性OpenCV >= 3.0

目的

このチュートリアルでは、以下の方法を学ぶ:

  • 関数 cv::compareHist を使い、2つのヒストグラムが互いにどれだけ一致するかを表す数値的な指標を得る。
  • さまざまな尺度 (metric) を使ってヒストグラムを比較する

理論

  • 2つのヒストグラム( \(H_{1}\) と \(H_{2}\) )を比較するには、まず両ヒストグラムがどれだけ一致するかを表す尺度( \(d(H_{1}, H_{2})\))を選ぶ必要がある。
  • OpenCV implements the function cv::compareHist to perform a comparison. It also offers 6 different metrics to compute the matching:
    1. Correlation ( 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}}\]

      where

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

      and \(N\) is the total number of histogram bins.
    2. Chi-Square ( cv::HISTCMP_CHISQR )

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

    3. Intersection ( cv::HISTCMP_INTERSECT )

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

    4. Bhattacharyya distance ( 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)}}\]

    5. Alternative Chi-Square ( cv::HISTCMP_CHISQR_ALT )

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

    6. Kullback-Leibler divergence ( cv::HISTCMP_KL_DIV )

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

コード

  • What does this program do?
    • ベース画像と、それと比較する2枚のテスト画像を読み込む。
    • ベース画像の下半分にあたる画像を1枚生成する
    • 画像をHSV形式に変換する
    • すべての画像についてH-Sヒストグラムを計算し、比較できるように正規化する。
    • ベース画像のヒストグラムを、2つのテストヒストグラム、ベース画像の下半分のヒストグラム、および同じベース画像のヒストグラムと比較する。
    • 得られた数値的な一致の指標を表示する。

説明

  • ベース画像 (src_base) と他の2枚のテスト画像を読み込む:

  • それらをHSV形式に変換する:

  • さらに、ベース画像の半分のサイズの画像を作成する (HSV形式):

  • ヒストグラムを計算するための引数 (bins、ranges、チャンネルHおよびS) を初期化する。

  • ベース画像、2枚のテスト画像、および下半分のベース画像についてヒストグラムを計算する:

  • ベース画像のヒストグラム (hist_base) と他のヒストグラムとの間で、6種類の比較手法を順に適用する:

結果

  1. 入力として以下の画像を使用する:

最初の画像がベース (他と比較される対象) で、残りの2枚がテスト画像である。さらに、最初の画像をそれ自身と比較し、またベース画像の半分と比較する。

  1. ベース画像のヒストグラムをそれ自身と比較した場合は、完全に一致することが期待される。また、ベース画像の半分のヒストグラムと比較した場合も、両者は同じソース由来であるため高い一致度を示すはずである。他の2枚のテスト画像については、照明条件が大きく異なるため、一致度はあまり良くならないはずである:
  2. OpenCV 4.12.0 で得られた数値結果を以下に示す:

    手法Base - BaseBase - HalfBase - Test 1Base - Test 2
    Correlation1.000000 0.880438 0.20457 0.065752
    Chi-square0.000000 0.328307 181.674 80.1494
    Intersection1.000000 0.75005 0.315061 0.0908022
    Bhattacharyya0.000000 0.237866 0.679825 0.873709
    Chi-Square alt.0.000000 0.395046 2.31572 3.41024
    KL divergence0.000000 0.321064 2.6616 9.55412

    Correlation および Intersection の手法では、指標が大きいほど一致が正確である。見ての通り、base-base の一致が予想通り最も高い。また、base-half の一致が (予測した通り) 2番目に良い一致であることがわかる。残りの4つの指標では、結果が小さいほど一致が良い。