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

問題


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

画像

その他条件:
 ヒストグラムは、カラー画像で出力する。(棒グラフに色をつける)

 →ヒストグラム作成2

答え


#include <iostream>
#include <cstdio>

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


IplImage *MAKE_HIST(IplImage *imgA);


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;
std::exit(0);
}

IplImage *hist_image;
hist_image = MAKE_HIST(imgA);


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


cvNamedWindow ("Histogram", CV_WINDOW_AUTOSIZE);
cvShowImage ("Histogram", hist_image);


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


cvReleaseImage( &hist_image );
cvReleaseImage( &imgA );

cvDestroyWindow("Histogram");
cvDestroyWindow("window");

return 0;
}



IplImage *MAKE_HIST(IplImage *imgA)
{

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);


/*ヒストグラム出力用画像作成*/
int hist_width = 260;
IplImage *hist_img;
hist_img=cvCreateImage (cvSize (hist_width, 200), IPL_DEPTH_8U, 3);
cvSet (hist_img, cvScalarAll (255), 0);



/*計算して、描画用にスケール変換*/
float max_value = 0;
cvCalcHist (&imgA, hist, 0, NULL);
cvGetMinMaxHistValue (hist, 0, &max_value, 0, 0);
cvScale (hist->bins, hist->bins, ((double) hist_img->height) / max_value, 0);


/*棒グラフの横幅決定(今回は1)*/
int bin_width;
bin_width = cvRound ((double) hist_width / hist_size);



/*ヒストグラム描画*/
CvScalar color={0,100,0};
for (int j = 0; j < hist_size; j++)
{
cvRectangle(hist_img, cvPoint(j * bin_width , hist_img->height),
cvPoint ((j + 1) * bin_width ,
hist_img->height - cvRound (cvGetReal1D (hist->bins, j))),
color, CV_FILLED, 8, 0);
}

cvReleaseHist(&hist);

return (hist_img);

}

メモ


左上が原点っぽい。

ウィンドウ内に入るようにスケール変換が必要。

目次

― その他 ―

Wiki内検索

計測中...(07.10.8〜)

Save The World






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


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

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