私の質問は、ヒストグラムを正規化するときです。そのための組み込み関数はありますか?関数を使用して画像のヒストグラムを計算できることは明らかですが、ヒストグラムcalcHist()
を正規化する式は、この式で返さNk/N
れるものです、または自分で計算する必要があり、エントロピー式でのその役割は何ですかcalcHist
N
N
8918 次
1 に答える
2
あなたの質問がよくわかりません。ただし、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 のドキュメントから変更しました。
このヒストグラムでエントロピーを計算したい場合は、次のようにすることができます:
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);
}
于 2013-09-01T11:43:03.660 に答える