# Creating a Histogram

Is it possible in opencv to create a histogram of three counters?

edit retag close merge delete

What's the meaning of "three counters",DO you mean "R G B"?

Sort by » oldest newest most voted Yes, it is possible. For the instance:

void ImageQualityController::calculateHist(const cv::Mat &input, float *blue, float *green, float *red)
{
/* Calculates histograms of inputImage and copies them into input vectors,          *
* it is caller responsibility to allocate memory for them, each needs float   */

int bins = 256;
int histSize[] = { bins };
float marginalRanges[] = { 0, 256 };
const float* ranges[] = { marginalRanges };

int channels[] = { 0 };
cv::Mat hist;
cv::calcHist(&input, 1, channels, cv::Mat(), // mask not used
hist, 1, histSize, ranges,
true, // the histogram is uniform
false);
auto pointer = hist.ptr<float>(0);
for (auto i = 0; i < 256; i++) {
blue[i] = pointer[i];
}

channels = 1;
cv::calcHist(&input, 1, channels, cv::Mat(), // mask not used
hist, 1, histSize, ranges,
true, // the histogram is uniform
false);
pointer = hist.ptr<float>(0);
for (auto i = 0; i < 256; i++) {
green[i] = pointer[i];
}

channels = 2;
cv::calcHist(&input, 1, channels, cv::Mat(), // mask not used
hist, 1, histSize, ranges,
true, // the histogram is uniform
false);
pointer = hist.ptr<float>(0);
for (auto i = 0; i < 256; i++) {
red[i] = pointer[i];
}
}

more

Official site

GitHub

Wiki

Documentation