現在地 >> メニュー >> サンプルコード::OpenCV >> ヒストグラムの計算

問題


以下の画像をグレースケールとして読み込んで、ヒストグラムを計算せよ。

画像

その他条件:
  • ヒストグラムのサイズは256。(256階調)
  • 「CvHistogram型のbin」の中にデータは格納されている →「cvGetReal1D()」で順に取り出して、int型に変換し出力する。
  • ヒストグラムのビンの「最小値とその配列の位置」、「最大値とその配列の位置」を出力する。

答え


#include <iostream>
#include <cstdio>

#include <cv.h>
#include <highgui.h>


using namespace std;


int main( int argc, char **argv)
{

IplImage *imgA = cvLoadImage( "test2.jpg", CV_LOAD_IMAGE_GRAYSCALE);
if(imgA ==NULL)
{
cout<<"Can't Load Image ." << endl;
exit(0);
}


/*ヒストグラム作成と計算*/
int hist_size = 256;
float range_data[] = { 0, 256 };
float *range[] = { range_data };

CvHistogram *hist;
hist = cvCreateHist (1, &hist_size, CV_HIST_ARRAY, range, 1);
cvCalcHist (&imgA, hist, 0, NULL);

for(int i = 0; i < 256; i++)
{
cout <<"bin["<<i << "] : "<< cvRound (cvGetReal1D (hist->bins, i)) <<endl;
}



/*最大値、最小値の計算*/
float max_value, min_value;
int min_index, max_index;

cvGetMinMaxHistValue (hist, &min_value, &max_value, &min_index, &max_index);

cout << endl;
cout <<"MIN :"<< min_value << endl;
cout <<"MAX :"<< max_value << endl;
cout <<"MIN_INDEX :"<< min_index << endl;
cout <<"MAX_INDEX :"<< max_index << endl;



cvReleaseHist(&hist);


cvNamedWindow("window",CV_WINDOW_AUTOSIZE);
cvShowImage("window",imgA);

cvWaitKey(0); // 0秒待つ => ずっと入力待ち



cvReleaseImage( &imgA );


cvDestroyWindow("window");

return 0;
}

メモ


同じ値の「最大値」や「最小値」が複数ある時は、
先頭のインデックスが返ってくる。

目次

― その他 ―

Wiki内検索

計測中...(07.10.8〜)

Save The World






▲よろしければ広告のクリックもお願いします


▲ランキングに参加しました

管理人/副管理人のみ編集できます