直接上代码:
void calc_2D_entropy(cv::Mat &input, cv::Mat &output){
int height = input.rows;
int width = input.cols;
cv::Mat out = cv::Mat::zeros(height, width, CV_32FC1);
//template size
int w = 3;
for (int i = w; i < height - w; i++)
{
float *data = out.ptr<float>(i);
for (int j = w; j < width - w; j++)
{
//cv::Mat Hist = cv::Mat::zeros(1, 256, CV_32F);
float Hist[256] = { 0 };
for (int p = i - w; p < i + w + 1; p++)
{
uchar *t = input.ptr<uchar>(p);
for (int q = j - w; q < j + w + 1; q++)
{
int tmp = t[q];
//cout << "tmp:" << tmp << endl;
Hist[tmp] = Hist[tmp] + 1;
}
}
float sumHist = 0;
for (int ii = 0; ii < 256; ii++)
{
sumHist += Hist[ii];
}
//get the probality
for (int ii = 0; ii < 256; ii++)
{
Hist[ii] = Hist[ii] / sumHist;
//if (Hist[ii] != 0)
// cout << ii << ":" << Hist[ii] << endl;
}
//calculate the entropy
for (int k = 0; k < 256; k++)
{
float v = Hist[k];
float z = data[j];
//cout << "z:" << z << endl;
if (v != 0)
{
double H = v * (log(v) / (float)log(2.0));
//H = H * 80.5 - 1;
data[j] = data[j] - H;
//data[j] = data[j] + v * log(1 / v);
//cout << j << ":" << data[j] << endl;
}
}
}
}
normalize(out, output);
output = output * 255;
}