【发布时间】:2013-09-01 10:23:00
【问题描述】:
我的问题是,当我们对直方图进行归一化时,是否有任何内置函数,如果不是很明显我们可以使用函数 calcHist() 计算图像的直方图,但归一化直方图的公式是 @987654322 @那么calcHist返回给我们这个公式是N,或者我们必须自己计算N,它在熵公式中的作用是什么
【问题讨论】:
标签: image opencv computer-vision histogram entropy
我的问题是,当我们对直方图进行归一化时,是否有任何内置函数,如果不是很明显我们可以使用函数 calcHist() 计算图像的直方图,但归一化直方图的公式是 @987654322 @那么calcHist返回给我们这个公式是N,或者我们必须自己计算N,它在熵公式中的作用是什么
【问题讨论】:
标签: image opencv computer-vision histogram entropy
我不确定我是否明白你的问题。但这里有一个简单的例子,说明如何使用 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