imhist.c
上传用户:banwdc
上传日期:2016-06-25
资源大小:2871k
文件大小:2k
源码类别:

OpenCV

开发平台:

Visual C++

  1. #include "cv.h"
  2. #include "highgui.h"
  3. #include <stdio.h>
  4. #include <ctype.h>
  5. int main( int argc, char** argv )
  6. {
  7.     IplImage *src = 0;
  8.     IplImage *histimg = 0;
  9.     CvHistogram *hist = 0;
  10.     
  11.     int hdims = 50;     // 划分HIST的个数,越高越精确
  12.     float hranges_arr[] = {0,255};
  13.     float* hranges = hranges_arr;
  14.     int bin_w;  
  15.     float max_val;
  16.     int i;
  17.     
  18.     if( argc != 2 || (src=cvLoadImage(argv[1], 0)) == NULL)  // force to gray image
  19.         return -1;
  20.     
  21.     cvNamedWindow( "Histogram", 0 );
  22.     cvNamedWindow( "src", 0);
  23.     
  24.     hist = cvCreateHist( 1, &hdims, CV_HIST_ARRAY, &hranges, 1 );  // 计算直方图
  25.     histimg = cvCreateImage( cvSize(320,200), 8, 3 );
  26.     cvZero( histimg );
  27.     cvCalcHist( &src, hist, 0, 0 ); // 计算直方图
  28.     cvGetMinMaxHistValue( hist, 0, &max_val, 0, 0 );  // 只找最大值
  29. cvConvertScale( hist->bins, 
  30. hist->bins, max_val ? 255. / max_val : 0., 0 ); // 缩放 bin 到区间 [0,255] 
  31.     cvZero( histimg );
  32.     bin_w = histimg->width / hdims;  // hdims: 条的个数,则 bin_w 为条的宽度
  33.     
  34.     // 画直方图
  35.     for( i = 0; i < hdims; i++ )
  36.     {
  37.         double val = ( cvGetReal1D(hist->bins,i)*histimg->height/255 );
  38.         CvScalar color = CV_RGB(255,255,0); //(hsv2rgb(i*180.f/hdims);
  39.         cvRectangle( histimg, cvPoint(i*bin_w,histimg->height),
  40.             cvPoint((i+1)*bin_w,(int)(histimg->height - val)),
  41.             color, 1, 8, 0 );
  42.     }
  43.     
  44.     cvShowImage( "src", src);
  45.     cvShowImage( "Histogram", histimg );
  46.     cvWaitKey(0);
  47.     cvDestroyWindow("src");
  48.     cvDestroyWindow("Histogram");
  49.     cvReleaseImage( &src );
  50.     cvReleaseImage( &histimg );
  51.     cvReleaseHist ( &hist );
  52.     
  53.     return 0;
  54. }