最終更新: mikk_ni3_92 2007年10月07日(日) 17:48:37履歴
現在地 >> メニュー >> サンプルコード::OpenCV >> ヒストグラム作成
#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);
}
#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);
}