【问题标题】:What the function calcHist() give us函数 calcHist() 给了我们什么
【发布时间】:2013-09-01 10:23:00
【问题描述】:

我的问题是,当我们对直方图进行归一化时,是否有任何内置函数,如果不是很明显我们可以使用函数 calcHist() 计算图像的直方图,但归一化直方图的公式是 @987654322 @那么calcHist返回给我们这个公式是N,或者我们必须自己计算N,它在熵公式中的作用是什么

【问题讨论】:

    标签: image opencv computer-vision histogram entropy


    【解决方案1】:

    我不确定我是否明白你的问题。但这里有一个简单的例子,说明如何使用 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);
    }
    

    【讨论】:

    • 我想用足够的时间间隔减去两帧,让熵清楚地代表发生变化的区域,if (binEntry == 0.0) 比它导致无穷大,可以做什么
    • 就像我在示例中所做的那样处理它们:忽略空垃圾箱。
    • 如何添加时间间隔?有什么相关信息吗?
    • 您只需在帧上保存,等待一定时间,然后再保存另一帧。就如此容易。如果您对此有疑问,也许您可​​以打开另一个问题,您在哪里展示,到目前为止您已经获得了什么以及您在什么时候遇到了问题。
    • 这意味着你的编译器不支持它。但是您可以通过计算 log(value)/log(2.0) 来简单地模拟它。另见this question
    猜你喜欢
    • 2018-07-21
    • 2012-08-25
    • 2015-05-05
    • 1970-01-01
    • 1970-01-01
    • 2013-06-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多