Ask Your Question

Revision history [back]

You can refer this c++ code which will plot histogram of source image before and after OpenCV histogram equalization

#include <stdio.h>
#include <opencv2/opencv.hpp>

using namespace cv;
using namespace std;

Mat create_histogram_image(Mat);


int main()
{
   Mat src,out;
   Mat hist1(640,480,CV_8UC1,Scalar(255));
   Mat hist2(640,480,CV_8UC1,Scalar(255));

    src = imread("src.jpg",0);

       Mat src_hist=create_histogram_image(src);
       equalizeHist( src, out );// Perform histogram equalization
       Mat out_hist=create_histogram_image(out);

    namedWindow( "Original", 1) ;// Show original
    imshow( "Original", src );


    namedWindow("Result", 1) ; // Show histogram equalized
    imshow("Result", out );

    namedWindow( "Histogram before equalization", 1) ;//Show Histograms
    imshow( "Histogram before equalization", src_hist );
    namedWindow( "Histogram after equalization", 1) ;
    imshow( "Histogram after equalization", out_hist );

    waitKey(0);

    return 0;
}
Mat create_histogram_image(Mat src){

    /// Establish the number of bins
  int histSize = 256;

  /// Set the ranges ( for B,G,R) )
  float range[] = { 0, 256 } ;
  const float* histRange = { range };

  bool uniform = true; bool accumulate = false;

  Mat hist;

  /// Compute the histograms:
  calcHist( &src, 1, 0, Mat(), hist, 1, &histSize, &histRange, uniform, accumulate );

  // Draw the histograms for B, G and R
  int hist_w = src.cols;//512;
  int hist_h = src.rows;//400;
  int bin_w = cvRound( (double) hist_w/histSize );

  Mat histImage( hist_h, hist_w, CV_8UC1, Scalar( 0) );


  normalize(hist, hist, 0, histImage.rows, NORM_MINMAX, -1, Mat() );

  /// Draw for each channel
  for( int i = 1; i < histSize; i++ )
  {
      line( histImage, Point( bin_w*(i-1), hist_h - cvRound(hist.at<float>(i-1)) ) ,
                       Point( bin_w*(i), hist_h - cvRound(hist.at<float>(i)) ),
                       Scalar( 255), 2, 8, 0  );

  }
return histImage;

}