计算累积直方图

时间:2015-10-05 15:45:48

标签: c++ opencv

我想计算累积直方图,我已完成直方图计算,下面是它的代码。

我已将iamge转换为ycbcr通道并为Y通道应用直方图

感谢您的帮助

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

1 个答案:

答案 0 :(得分:2)

OpenCV cv::calcHistaccumulate标志,但没有做累积直方图,它只是在开始时没有将直方图设置为零,所以你可以在多个图像上累积直方图

你想要做的是,在获得直方图之后,通过将所有先前的直方图箱的总和添加到每个箱子中来自己积累。

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,以便查看结果。