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;
}


Hi,
ReplyDeleteGreat work..
Thanks..