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

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/

10-08 23:08