sarmad m
sarmad m

Reputation: 899

calculating cumulative histogram

I want to calculate the cumulative histogram , I have done the histogram calculation and below is the code for it.

I have converted the iamge to ycbcr channel and applied histogram for Y channel

Thanks for help

#include "opencv2/core/core.hpp"
#include "opencv2/highgui/highgui.hpp"
#include "opencv2/imgproc/imgproc.hpp"
#include "iostream"

#include "opencv2/highgui/highgui.hpp"
#include "opencv2/imgproc/imgproc.hpp"
#include <iostream>
#include <stdio.h>

using namespace cv;
using namespace std;

 void histogramcalculation(const Mat &Image, Mat &histoImage)
{  
  int histSize = 255;
// Set the ranges ( for B,G,R) )

float range[] = { 0, 256 } ;
const float* histRange = { range };
bool uniform = true; bool accumulate = false;
Mat b_hist, g_hist, r_hist;
vector<Mat> bgr_planes;
split(Image, bgr_planes );

 // Compute the histograms:

 calcHist( &bgr_planes[0], 1, 0, Mat(), b_hist, 1, &histSize,  &histRange, uniform, accumulate );


// Draw the histogram

int hist_w = 512; int hist_h = 400;
int bin_w = cvRound( (double) hist_w/histSize );
Mat histImage( hist_h, hist_w, CV_8UC3, Scalar( 0,0,0) );

  // Normalize the result to [ 0, histImage.rows ]

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


  // Draw 

  for( int i = 1; i < histSize; i++ )

{
line( histImage, Point( bin_w*(i-1), hist_h - cvRound(b_hist.at<float>   (i-1)) ) , Point( bin_w*(i), hist_h - cvRound(b_hist.at<float>(i)) ),   Scalar( 255, 0, 0), 2, 8, 0 );



}
histoImage= histImage;

}

  int main( )
  {

 Mat src, imageq,ycbcr;
 Mat histImage;

 // Read original image

   src = imread( "3.jpg");
    if(! src.data )
  { printf("Error imagen\n"); exit(1); }

    cvtColor(src, ycbcr, CV_RGB2YCrCb);
     vector <Mat> planes;
     split(ycbcr,planes);

   // Separate the image in 3 places ( B, G and R )



    // Display results

   imshow( "Source image", src );

   // Calculate the histogram to each channel of the source image

   histogramcalculation(planes[0], histImage);

   // Display the histogram for each colour channel

   imshow("Colour Image Histogram", histImage );

   // Wait until user exits the program

  waitKey();
  return 0;
  }

Upvotes: 1

Views: 5780

Answers (1)

tommybazar
tommybazar

Reputation: 73

OpenCV cv::calcHist has the accumulate flag, but that doesn't do a cummulative histogram, it just doesn't set the histogram to zero at the beginning, so you can accumulate histograms over multiple images.

What you want to do, is after getting the histogram, just accumulate it yourself by adding the sum of all previous histogram bins to every bin.

cv::Mat hist;

cv::calcHist(&eyeROI, 1, 0, Mat(), hist, 1, &histSize, &histRange);
cv::Mat accumulatedHist = hist.clone();
for (int i = 1; i < histSize; i++) {
    accumulatedHist.at<float>(i) += accumulatedHist.at<float>(i - 1);
    std::cout << "Accumulated : " << accumulatedHist.at<float>(i) << ", original = " << hist.at<float>(i) << std::endl;
}

std::cout added so you can look at the result.

Upvotes: 7

Related Questions