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

問題


以下の画像をカラー画像で読み込んで、各チャネル毎に、ヒストグラムを作成せよ。

画像

その他条件:
 わかりやすいように、チャネル毎にヒストグラムの色を変えること。

答え


#include <iostream>
#include <cstdio>

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


IplImage *MAKE_HIST(IplImage *imgA,char *str);


using namespace std;


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

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


IplImage* B_Img ,*G_Img ,*R_Img;
R_Img = cvCreateImage(cvGetSize(imgA),IPL_DEPTH_8U,1);
G_Img = cvCreateImage(cvGetSize(imgA),IPL_DEPTH_8U,1);
B_Img = cvCreateImage(cvGetSize(imgA),IPL_DEPTH_8U,1);


cvSplit (imgA, B_Img ,G_Img ,R_Img, 0);//チャネル分解


IplImage *hist_imageB, *hist_imageG, *hist_imageR;
hist_imageB = MAKE_HIST(B_Img,"b");
hist_imageG = MAKE_HIST(G_Img,"g");
hist_imageR = MAKE_HIST(R_Img,"r");


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


cvNamedWindow ("BLUE", CV_WINDOW_AUTOSIZE);
cvShowImage ("BLUE", hist_imageB);

cvNamedWindow ("GREEN", CV_WINDOW_AUTOSIZE);
cvShowImage ("GREEN", hist_imageG);


cvNamedWindow ("RED", CV_WINDOW_AUTOSIZE);
cvShowImage ("RED", hist_imageR);

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


cvReleaseImage( &hist_imageB );
cvReleaseImage( &hist_imageG );
cvReleaseImage( &hist_imageR );
cvReleaseImage( &imgA );

cvDestroyWindow("BLUE");
cvDestroyWindow("GREEN");
cvDestroyWindow("RED");
cvDestroyWindow("window");

return 0;
}



IplImage *MAKE_HIST(IplImage *imgA,char*str)
{

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;
if*1
{
color.val[0] = 255;
}else if*2
{
color.val[1] = 255;
}else
{
color.val[2] = 255;
}


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






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


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

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