这是我在程序中使用的代码:

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

       Mat histNorm = hist / (pre_img.rows * pre_img.cols);
       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 * log(binEntry);
          }
       }
       cout<<entropy<<endl;

第一件事是,当我像entropy -= binEntry * log2(binEntry);一样输入它时,它给了log2一个错误,我在VS 2010中添加了数学和数值库,但是仍然出现错误,第二点是只要我在同一代码上运行它视频,它在每次执行时为我提供不同的值,例如,如果它给我10.0 , 2.0 , 0.05而不是下次运行该程序时在同一帧上给我显示8.0 , 1.5 , 0.01 these are sample values not exact

最佳答案

log2仅在C99标准中定义。不使用log2的一种解决方法可能是将其替换为其他基数,因为对数logb(x)可以使用以下公式根据xb的对数相对于任意基本k进行计算:

https://math.stackexchange.com/a/131719/29621

所以你可以更换

if (binEntry != 0.0)
          {
            entropy -= binEntry * log2(binEntry);
          }


if (binEntry != 0.0)
          {
            entropy -= binEntry * log(binEntry)/log(2.0);
                                                     ^
                                                also you should use `log(2.0)`
                                                because the argument should be
                                                double or float
          }

关于c++ - 熵在每次执行时更改值,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/18942514/

10-13 07:05