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..