1

以下のコードで正規化関数を使用しています。私の理解では、ヒストグラムを正規化すると、ビンの合計が1になるということでしたか?しかし、それらをすべて合計すると、1よりも高い結果が得られ続けます。何か間違ったことをしているのか、関数が何をしているのか誤解しているのかわかりませんか?

//read in image
Mat img = imread("image.jpg",1);
vector<Mat> planes;
split(img, planes);

//calculate hist
MatND hist;
int nbins = 256; // hold 256 levels
int hsize[] = { nbins }; // one dimension
float range[] = { 0, 255 };
const float *ranges[] = { range };
int chnls[] = {0};
calcHist(&planes[0], 1, chnls, Mat(), hist,1,hsize,ranges);

//normalise
normalize(hist,hist,1);

float tot = 0;
for( int n = 0;n < nbins; n++ )
    {
        float binVal = hist.at<float>(n);
        tot+=binVal;
    }
cout<<tot;
4

1 に答える 1

5

正規化された配列の合計は1になりませんが、コンポーネントの2乗の合計の平方根は1に等しく、ベクトルのFeは次のようになります。

sqrt(x ^ 2 + y ^ 2 + z ^ 2)= 1の場合、正規化されます。

*これはベクトルに適用されます

OpenCVで-ヒストグラム-正規化はここで説明されていますOpenCVヒストグラムの正規化、それは1に合計する必要がないことを(仕様を読んだ後)明確にする必要があります

于 2012-02-12T15:07:39.530 に答える