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

OpenCV

开发平台:

Visual C++

  1. #include "cv.h"
  2. #include "highgui.h"
  3. #define HDIM    256    // bin of HIST, default = 256
  4. int main( int argc, char** argv ) 
  5. {
  6.     IplImage *src = 0, *dst = 0;
  7.     CvHistogram *hist = 0;
  8.     
  9.     int n = HDIM;     
  10.     double nn[HDIM];
  11.     uchar T[HDIM];
  12.     CvMat *T_mat;
  13.     
  14.     int x;
  15.     int sum = 0; // sum of pixels of the source image 图像中象素点的总和
  16.     double val = 0;
  17.     
  18.     if( argc != 2 || (src=cvLoadImage(argv[1], 0)) == NULL)  // force to gray image
  19.         return -1;
  20.     
  21.     cvNamedWindow( "source", 1 );
  22.     cvNamedWindow( "result", 1 );
  23.     
  24.     // 计算直方图
  25.     hist = cvCreateHist( 1, &n, CV_HIST_ARRAY, 0, 1 );  
  26.     cvCalcHist( &src, hist, 0, 0 ); 
  27.     
  28.     // Create Accumulative Distribute Function of histgram
  29.     val = 0;
  30.     for ( x = 0; x < n; x++)
  31.     {
  32.         val = val + cvGetReal1D (hist->bins, x);
  33.         nn[x] = val;
  34.     }
  35.     // 归一化直方图
  36.     sum = src->height * src->width;
  37.     for( x = 0; x < n; x++ )
  38.     {
  39.         T[x] = (uchar) (255 * nn[x] / sum); // range is [0,255]
  40.     }
  41.     // Using look-up table to perform intensity transform for source image 
  42.     dst = cvCloneImage( src );
  43.     T_mat = cvCreateMatHeader( 1, 256, CV_8UC1 );
  44.     cvSetData( T_mat, T, 0 );    
  45.     // 直接调用内部函数完成 look-up-table 的过程
  46.     cvLUT( src, dst, T_mat ); 
  47.     cvShowImage( "source", src );
  48.     cvShowImage( "result", dst );
  49.     cvWaitKey(0);
  50.     cvDestroyWindow("source");
  51.     cvDestroyWindow("result");
  52.     cvReleaseImage( &src );
  53.     cvReleaseImage( &dst );
  54.     cvReleaseHist ( &hist );
  55.     
  56.     return 0;
  57. }