c++ - opencv中灰度图像的熵

标签 c++ opencv information-theory

我需要代码来查找图像的熵。

for(int i=0;i<grey_image.rows;i++)
{
    for(int j=1;j<grey_image.cols;j++)
    {
        //cout<<i<<" "<<j<<" "<<(int)grey_image.at<uchar>(i,j)<<endl;
        int a=(int)grey_image.at<uchar>(i,j);
        int b=(int)grey_image.at<uchar>(i,j-1);
        int x=a-b;
        if(x<0)
            x=0-x;
        probability_array[x]++;
        //grey_image.at<uchar>(i,j) = 255;
    }
}
//calculating probability
int n=rows*cols;
for(int i=0;i<256;i++)
{
    probability_array[i]/=n;
    //cout<<probability_array[i]<<endl;
}
// galeleo team formula
float entropy=0;
for(int i=0;i<256;i++)
{
    if (probability_array[i]>0)
    {
        float x=probability_array[i]*log(probability_array[i]);
        entropy+=x;
    }
}
return 0-entropy;

实际上,我正在使用它转储到可编程相机中以测量熵。现在我想在windows系统中使用它。我得到的灰色图像的熵为零。请帮帮我。我哪里出错了。

最佳答案

在不知道您使用的是什么图像的情况下,我们无法知道零熵结果是否不是正确答案(如@Xocoatzin 所建议)。 此外,您的代码可以受益于一些最新的 OpenCV 功能😊:这是一个使用 OpenCV 直方图和矩阵表达式的有效实现:

    if (frame.channels()==3) cvtColor(frame,frame,CV_BGR2GRAY);
    /// Establish the number of bins
    int histSize = 256;
    /// Set the ranges ( for B,G,R) )
    float range[] = { 0, 256 } ;
    const float* histRange = { range };
    bool uniform = true; bool accumulate = false;
    /// Compute the histograms:
    calcHist( &frame, 1, 0, Mat(), hist, 1, &histSize, &histRange, uniform, accumulate );
    hist /= frame.total();
    hist += 1e-4; //prevent 0

    Mat logP;
    cv::log(hist,logP);

    float entropy = -1*sum(hist.mul(logP)).val[0];

    cout << entropy << endl;

关于c++ - opencv中灰度图像的熵,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24930134/

相关文章:

c++ - 模板参数简化

python - cv2 outlineArea返回值

c++ - Opencv - 将视频帧与图像匹配

encoding - 决策树中的香农熵度量

java - 在生成一组对象的哈希值时,使用 hashCode() 的输出作为 SHA256 的输入会造成安全强度的任何损失

c++ - 简单的 boost ASIO https 不返回正文

c++ - 在我的程序中第二次使用 CFileDialog 时出现运行时错误 Debug Assertion failed

python - 傅立叶变换 2D 工件 - 我做错了什么?

c++ - 在 visual studio 中构建示例 opencv 应用程序时出错