配列の集合のヒストグラムを求めます.
パラメタ: |
|
---|
関数 calcHist は,1つあるいは複数の配列に対するヒストグラムを求めます. ヒストグラムのビンの値を増加させるタプル要素は,対応する(複数の)入力配列の同じ位置から取り出されます. 次のサンプルは,カラー画像の色相-彩度の2次元ヒストグラムを求める例です.
#include <cv.h>
#include <highgui.h>
using namespace cv;
int main( int argc, char** argv )
{
Mat src, hsv;
if( argc != 2 || !(src=imread(argv[1], 1)).data )
return -1;
cvtColor(src, hsv, CV_BGR2HSV);
// 色相を 30 分割レベルで,
// 彩度を 32 分割レベルで量子化します
int hbins = 30, sbins = 32;
int histSize[] = {hbins, sbins};
// cvtColor にあるように,色相の範囲は 0 から 179 です.
float hranges[] = { 0, 180 };
// 彩度の範囲は 0 (黒-灰色-白)から
// 255 (純粋なスペクトルカラー)までです.
float sranges[] = { 0, 256 };
const float* ranges[] = { hranges, sranges };
MatND hist;
// 0 番目と 1 番目のチャンネルからヒストグラムを求めます.
int channels[] = {0, 1};
calcHist( &hsv, 1, channels, Mat(), // マスクは利用しません
hist, 2, histSize, ranges,
true, // ヒストグラムは一様です
false );
double maxVal=0;
minMaxLoc(hist, 0, &maxVal, 0, 0);
int scale = 10;
Mat histImg = Mat::zeros(sbins*scale, hbins*10, CV_8UC3);
for( int h = 0; h < hbins; h++ )
for( int s = 0; s < sbins; s++ )
{
float binVal = hist.at<float>(h, s);
int intensity = cvRound(binVal*255/maxVal);
rectangle( histImg, Point(h*scale, s*scale),
Point( (h+1)*scale - 1, (s+1)*scale - 1),
Scalar::all(intensity),
CV_FILLED );
}
namedWindow( "Source", 1 );
imshow( "Source", src );
namedWindow( "H-S Histogram", 1 );
imshow( "H-S Histogram", histImg );
waitKey();
}
ヒストグラムのバックプロジェクションを求めます.
パラメタ: |
|
---|
関数 calcBackProject は,ヒストグラムのバックプロジェクションを求めます.つまり calcHist と同様に,入力画像の指定チャンネルの座標 (x, y) における値を取得し,それに対応するヒストグラムのビンを求めます.この関数では,そのビンの値を増加させるのではなく値を読み出し,それを scale でスケーリングして, backProject(x, y) に格納します.統計学の用語で言えば,これは,ヒストグラムで表現された経験的確率分布における,各要素値の確率を求める関数です.ここでは例として,シーン中の明るい色の物体を検出し追跡する方法を示します:
つまり,これは CAMShift カラー物体追跡器の近似アルゴリズムです.
参考: calcHist()
2つのヒストグラムを比較します.
パラメタ: |
|
---|
関数 compareHist は,指定の手法を用いて,2つの密または疎なヒストグラム同士を比較します.
相関 (method=CV_COMP_CORREL)
ここで
です.また は,ヒストグラムのビンの総数を表します.
カイ2乗 (method=CV_COMP_CHISQR)
交差 (method=CV_COMP_INTERSECT)
Bhattacharyya 距離 (method=CV_COMP_BHATTACHARYYA)
この関数は, を返します.
この関数は,1-, 2-, 3-次元の密なヒストグラムに対しては上手く動作しますが,高次元の疎なヒストグラムに対しては適切なものではありません.なぜなら,エイリアシングやサンプリングの問題により,0ではないヒストグラムビンの座標が僅かにずれるからです.このようなヒストグラムや,より一般的な疎構造である重み付き点群同士を比較する場合には,関数 calcEMD の利用を検討してください.
グレースケール画像のヒストグラムを均一化します.
パラメタ: |
|
---|
関数 equalizeHist は,以下のアルゴリズムを用いて入力画像のヒストグラムを均一化します.
src のヒストグラム を求めます.
ヒストグラムビンの合計値が 255 になるように,ヒストグラムを正規化します.
ヒストグラムの積分値を次のように求めます:
をルックアップテーブルとして利用して,画像を変換します:
このアルゴリズムは,画像の明るさを正規化し,コントラストを上げます.