Pages - Menu

Friday, April 2, 2010

Histograms and Histogram Equalization using OpenCV

Here is a simple example to view histograms and equalize them.


Download:
Download the Project folder and the source code [2.02 Mb].





Note:
The project is linked to OpenCV 2.0 libraries. Please change it before compiling , if you are using OpenCV 1.0










Images:






Source Code:


//______________________________________________________________________________________
// OpenCV Histograms of Images
// Author: Bharath Prabhuswamy
//______________________________________________________________________________________
//______________________________________________________________________________________

#include "cv.h"
#include "highgui.h"

int main()
{
    IplImage* img  = cvLoadImage("plastics.jpg");

    /* Always check if the program can find a file */
    if( !img )
 return -1;

 IplImage* gray = cvCreateImage( cvGetSize(img), 8, 1 );
 IplImage* eq_gray = cvCreateImage( cvGetSize(img), 8, 1 );
        IplImage *hist_img = cvCreateImage(cvSize(300,240), 8, 1);
 cvSet( hist_img, cvScalarAll(255), 0 );
 IplImage *eq_hist_img = cvCreateImage(cvSize(300,240), 8, 1);
 cvSet( eq_hist_img, cvScalarAll(255), 0 );

 CvHistogram *hist;
        int hist_size = 256;      
        float range[]={0,256};
        float* ranges[] = { range };
    
        float max_value = 0.0;
        float w_scale = 0.0;

 /* Convert the image to gray */
 cvCvtColor(img,gray,CV_RGB2GRAY);
 
 /* Create a 1-D Array to hold the histogram */
 hist = cvCreateHist(1, &hist_size, CV_HIST_ARRAY, ranges, 1);

 /* Calculate histogram of the Image and store it in the array */
 cvCalcHist( &gray, hist, 0, NULL );

        /* Find the minimum and maximum values of the histogram */
        cvGetMinMaxHistValue( hist, 0, &max_value, 0, 0 );

 /* Using the maximum value, Scale/Squeeze the histogram (to fit the image) */
        cvScale( hist->bins, hist->bins, ((float)hist_img->height)/max_value, 0 );
 printf("Scale: %4.2f pixels per 100 units\n", max_value*100/((float)hist_img->height));           
                                                  //A scale to estimate the number of pixels


 /* Scale/Squeeze the histogram range to image width */
        w_scale = ((float)hist_img->width)/hist_size;

 /* Plot the Histogram */
        for( int i = 0; i < hist_size; i++ )
          cvRectangle( hist_img, cvPoint((int)i*w_scale , hist_img->height),
             cvPoint((int)(i+1)*w_scale, hist_img->height - cvRound(cvGetReal1D(hist->bins,i))),
             cvScalar(0), -1, 8, 0 );

 /* Equalize the histogram */
 cvEqualizeHist(gray,eq_gray);

 /* Calculate and Plot the equalized histogram in the same way */
 cvCalcHist( &eq_gray, hist, 0, NULL );

 cvGetMinMaxHistValue( hist, 0, &max_value, 0, 0 );
 cvScale( hist->bins, hist->bins, ((float)eq_hist_img->height)/max_value, 0 );
 printf("Scale: %4.2f pixels per 100 units\n", 
                                    max_value*100/((float)eq_hist_img->height));
  
        w_scale = ((float)eq_hist_img->width)/hist_size;

 for( int i = 0; i < hist_size; i++ )
  cvRectangle( eq_hist_img, cvPoint((int)i*w_scale , eq_hist_img->height),
          cvPoint((int)(i+1)*w_scale, eq_hist_img->height - cvRound(cvGetReal1D(hist->bins,i))),
          cvScalar(0), -1, 8, 0 );

    cvNamedWindow( "Image", 1 );
    cvShowImage( "Image",gray);

    cvNamedWindow( "Equalized Image", 1 );
    cvShowImage( "Equalized Image",eq_gray);

    /* create a window to show the histogram of the image */
    cvNamedWindow("Histogram", 1);
    cvShowImage( "Histogram", hist_img);

    /* create a window to show the Equalized histogram of the image */
    cvNamedWindow("Equilized Histogram", 1);
    cvShowImage( "Equilized Histogram", eq_hist_img );

    cvWaitKey(0);

    cvDestroyWindow( "Image" );
    cvDestroyWindow( "Histogram" );
    cvDestroyWindow( "Equilized Histogram" );
    cvReleaseImage( &img );
    return 0;
}

1 comment: