プロが教えるわが家の防犯対策術!

OpenCv ヒストグラム比較について

画像の色を比較するためにヒストグラムを比較する関数cvCompareHistを使って比較しています。
ですが↓の画像の図形でRGB成分を分けてからそれぞれを比較したのですが、必ずどの成分も一致とでます。
ヒストグラムは色の分布を持っていてその分布を比較しているんですよね?
cvCompareHistがいまいちなにを比較しているのかがはっきりとわからない状態です。

「OpenCv ヒストグラム比較について」の質問画像

A 回答 (2件)

http://opencv.jp/opencv2-x-samples/color_histogram
にあるサンプルコードを改造して、2つの画像のRGB別ヒストグラムを取って、cvCompareHistの全methodで確認、ということをやってみましたが、それぞれ、先の例で示した通りの数値が出てきました。
等しいときには
相関=1.0, χ二乗=0.0, 交差=画素数.Bhattacharyya距離 =0.0
少しだけ編集すれば少しだけ、色を反転させるとガラっと値が変りました。

まず、交差は計算式からわかるように、一致していたら全要素の合計値になります。
一致してなくても、重なる区間があればある程度の値が出ます。
これで判定するのは少し面倒です。
完全一致を見るなら、χ二乗がいいと思います。

あとは、ちゃんとヒストグラムができているか
for (j = 0; j < ヒストグラムの大きさ; j++)
printf( "%3d: %g\n", i, cvGetReal1D( H1->bins, j) ) ;
}
などとして表示してみるのもよいでしょう。
    • good
    • 1
この回答へのお礼

返信遅れてすみません。
いろいろと実験までやっていただいてありがとうございます。
↑を参考にまたやってみます。

お礼日時:2010/07/13 11:10

具体的にどんな方法で「一致した」と判定しました?


if ( cvCompareHist(H1,H2) ) {
一致
}
とかやってませんか?

http://opencv.jp/opencv-2.1/c/histograms.html#cv …
それぞれの方法で、2つのヒストグラムの「類似度」を計算して、その値を返します。

大雑把に言うと
相関:-1.0~1.0の値。1.0に近いほど双方が類似している。-1.0だと真反対の関係。0.0で無関係。
カイ二乗: 似ている程小さい値。完全に同一で0.0
交差: 似ている程大きな値。 0.0でまったく重なる部分無し。
Bhattacharyya距離: 似ている程小さい値。同一で0.0

「一致」の判定は、
画素数が同じなら→カイ二乗で計算して値が0.0
画素数が異なるなら→相関を計算して値が1.0
となります。
実際には計算誤差も考慮して、ある範囲内なら一致と見做す、とするべきでしょう。

この回答への補足

result = cvCompareHist( H1, H2 )

printf("類似値:%f \n",result);

で値を見ています。
ヒストグラムの比較方法は交差です。

一致というのは完璧一致のことを言っています。
つまりRGB成分すべての類似値が1とでます。
紛らわしいことを書いてすみません。

補足日時:2010/07/06 15:39
    • good
    • 0

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!