#include <highgui.h>
#include <cv.h>
#include <iostream>

int main( int argc, const char* argv[] )
{
  if (argc < 2) 
  {
    std::cerr << "Usage : " << argv[0] << " image_file" << std::endl;
    return EXIT_FAILURE;
  }
  cv::Mat img = cv::imread (argv[1]);
  if (img.empty())
  {
    std::cerr << "Could not load image file " << argv[1] << std::endl;
    return EXIT_FAILURE;
  }
  cv::Mat eq = img.clone ();

  std::vector<cv::Mat> in_chans;
  cv::split (img, in_chans);
  
  std::vector<cv::Mat> out_chans (in_chans.size());

  for (int i=0; i < img.channels (); ++i)
  {
    cv::equalizeHist (in_chans[i], out_chans[i]);
  }

  cv::merge (out_chans, eq);
  cv::namedWindow ("in",  CV_WINDOW_AUTOSIZE);
  cv::namedWindow ("out", CV_WINDOW_AUTOSIZE);
  cv::imshow ("in",  img);
  cv::imshow ("out", eq);
  cv::waitKey ();

  if (argc > 2)
    cv::imwrite (argv[2], eq);
  
  return EXIT_SUCCESS;
}
