ヒストグラムの平坦化処理

フォーラム(掲示板)ルール
フォーラム(掲示板)ルールはこちら  ※コードを貼り付ける場合は [code][/code] で囲って下さい。詳しくはこちら
ルイズ

ヒストグラムの平坦化処理

#1

投稿記事 by ルイズ » 6年前

ヒストグラムの平坦化とゆう課題で
ヒストグラムの表示と平坦化のプログラムはできたんですが
これを組み合わせることができません
int
main (int argc, char **argv)
{

int i, j, bin_w;
int hist_size = 256;
int sch = 0, ch_width = 260;
float max_value = 0;
float range_0[] = { 0, 256 };
float *ranges[] = { range_0 };
IplImage *src_img = 0, *dst_img[4] = { 0, 0, 0, 0 }, *hist_img;
CvHistogram *hist;

// 画像の読み込みと表示
if( (src_img = cvLoadImage( "aaa.jpg", CV_LOAD_IMAGE_GRAYSCALE )) == 0 ){
fprintf( stderr, "ファイルが見付かりません\n" );
return( -1 );
}


// (2)入力画像のチャンネル数分の画像領域を確保
sch = src_img->nChannels;
for (i = 0; i < sch; i++) {
dst_img = cvCreateImage (cvSize (src_img->width, src_img->height), src_img->depth, 1);
}

// (3)ヒストグラム構造体,ヒストグラム画像領域を確保
hist = cvCreateHist (1, &hist_size, CV_HIST_ARRAY, ranges, 1);
hist_img = cvCreateImage (cvSize (ch_width * sch, 200), 8, 1);

// (4)入力画像がマルチチャンネルの場合,画像をチャンネル毎に分割
if (sch == 1)
cvCopy (src_img, dst_img[0], NULL);
else
cvSplit (src_img, dst_img[0], dst_img[1], dst_img[2], dst_img[3]);

// (5)ヒストグラム画像をクリア
cvSet (hist_img, cvScalarAll (255), 0);
for (i = 0; i < sch; i++) {
// (6)ヒストグラムを計算して,スケーリング
cvCalcHist (&dst_img, hist, 0, NULL);
cvGetMinMaxHistValue (hist, 0, &max_value, 0, 0);
cvScale (hist->bins, hist->bins, ((double) hist_img->height) / max_value, 0);
// (7)ヒストグラムの描画
bin_w = cvRound ((double) ch_width / hist_size);
for (j = 0; j < hist_size; j++)
cvRectangle (hist_img,
cvPoint (j * bin_w + (i * ch_width), hist_img->height),
cvPoint ((j + 1) * bin_w + (i * ch_width),
hist_img->height - cvRound (cvGetReal1D (hist->bins, j))), cvScalarAll (0), -1, 8, 0);
}

// (8)ヒストグラム画像を表示,キーが押されたときに終了
cvNamedWindow ("Image", CV_WINDOW_AUTOSIZE);
cvShowImage ("Image", src_img);
cvNamedWindow ("Histogram", CV_WINDOW_AUTOSIZE);
cvShowImage ("Histogram", hist_img);
cvWaitKey (0);

cvDestroyWindow ("Histogram");
cvReleaseImage (&src_img);
cvReleaseImage (&hist_img);
for (i = 0; i < sch; i++) {
cvReleaseImage (&dst_img);
}
cvReleaseHist (&hist);

return 0;
}



int
main (int argc, char **argv)
{
int i, j, bin_w, ch_width = 260;
int hist_size = 256;
float max_value = 0;
float range_0[] = { 0, 256 };
float *ranges[] = { range_0 };
IplImage *src_img[2], *hist_img[2];
CvHistogram *hist;
if (argc != 2 || (src_img[0] = cvLoadImage (argv[1], CV_LOAD_IMAGE_GRAYSCALE)) == 0)
return -1;
hist = cvCreateHist (1, &hist_size, CV_HIST_ARRAY, ranges, 1);
hist_img[0] = cvCreateImage (cvSize (ch_width, 200), 8, 1);
hist_img[1] = cvCreateImage (cvSize (ch_width, 200), 8, 1);
src_img[1] = cvCreateImage (cvGetSize (src_img[0]), 8, 1);
// (1)ヒストグラムを均一化する
cvEqualizeHist (src_img[0], src_img[1]);
for (i = 0; i < 2; i++) {
cvSet (hist_img, cvScalarAll (255), 0);
// (2)ヒストグラムを計算し,スケーリング
cvCalcHist (&src_img, hist, 0, NULL);
cvGetMinMaxHistValue (hist, 0, &max_value, 0, 0);
cvScale (hist->bins, hist->bins, ((double) hist_img->height) / max_value, 0);
bin_w = cvRound ((double) ch_width / hist_size);
// (3)ヒストグラムを描画
for (j = 0; j < hist_size; j++)
cvRectangle (hist_img,
cvPoint (j * bin_w, hist_img->height),
cvPoint ((j + 1) * bin_w,
hist_img->height - cvRound (cvGetReal1D (hist->bins, j))), cvScalarAll (0), -1, 8, 0); }
// (4)均一化前後の画像と,それに対するヒストグラムを表示
cvNamedWindow ("Image1", CV_WINDOW_AUTOSIZE);
cvShowImage ("Image1", src_img[0]);
cvNamedWindow ("Histogram1", CV_WINDOW_AUTOSIZE);
cvShowImage ("Histogram1", hist_img[0]);
cvNamedWindow ("Image2", CV_WINDOW_AUTOSIZE);
cvShowImage ("Image2", src_img[1]);
cvNamedWindow ("Histogram2", CV_WINDOW_AUTOSIZE);
cvShowImage ("Histogram2", hist_img[1]);
cvWaitKey (0); cvDestroyWindow ("Image1");
cvDestroyWindow ("Image2");
cvDestroyWindow ("Histogram1");
cvDestroyWindow ("Histogram2");
cvReleaseImage (&src_img[0]);
cvReleaseImage (&src_img[1]);
cvReleaseImage (&hist_img[0]);
cvReleaseImage (&hist_img[1]);
cvReleaseHist (&hist);
return 0;
}

です

アバター
usao
記事: 1564
登録日時: 6年前

Re: ヒストグラムの平坦化処理

#2

投稿記事 by usao » 6年前

意味がわかりません.何に困っているのでしょうか?
あと,Histogram Equalizationの処理をOpenCVの関数cvEqualizeHist()に丸投げOKなのだとしたら
この課題であなたがやるべきこととは一体何なのでしょうか?

とりあえず,質問内容が不明なのと,コードが見難いです.
(一度フォーラムルールというところを見てください)

閉鎖

“C言語何でも質問掲示板” へ戻る