calcHist()给我们的函数是什么

时间:2013-09-01 10:23:01

标签: image opencv computer-vision histogram entropy

我的问题是当我们对直方图进行标准化时,是否有任何内置函数,如果不是很明显我们可以使用函数calcHist()来计算图像的直方图,但是标准化直方图的公式是Nk/N所以calcHist在此公式中N返回N,或者我们必须自己计算{{1}},并将其在熵公式中的作用

1 个答案:

答案 0 :(得分:2)

我不确定我是否接受了您的问题。但这是一个简单的例子,说明如何使用OpenCV获得灰度图像的l1标准化直方图。

如果图像N是可以简单地通过乘以图像的宽度和高度来计算的像素数。然后,只需将直方图除以N

#include <opencv2/opencv.hpp>
#include <iostream>

using namespace cv;

int main(int argc, char** argv)
{
    Mat img = imread(argv[1],CV_LOAD_IMAGE_GRAYSCALE);
    Mat hist;

    int channels[] = {0};
    int histSize[] = {32};
    float range[] = { 0, 256 };
    const float* ranges[] = { range };

    calcHist( &img, 1, channels, Mat(), // do not use mask
         hist, 1, histSize, ranges,
         true, // the histogram is uniform
         false );

   Mat histNorm = hist / (img.rows * img.cols);

   return 0;
}

为了得到示例,我修改了OpenCV documentation中的那个。

如果要使用此直方图计算熵,可以执行以下操作:

double entropy = 0.0;
for (int i=0; i<histNorm.rows; i++)
{
    float binEntry = histNorm.at<float>(i,0);
    if (binEntry != 0.0)
        entropy -= binEntry * log2(binEntry);
}