OpenGL de プログラミング - ヒストグラムの計算
現在地
>>
メニュー
>>
サンプルコード::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;
}
メモ
同じ値の「最大値」や「最小値」が複数ある時は、
先頭のインデックスが返ってくる。