4

ヒストグラムを滑らかにしたい。

したがって、 の内部行列を平滑化しようとしましたcvHistogram

typedef struct CvHistogram
{
    int     type;
    CvArr*  bins;
    float   thresh[CV_MAX_DIM][2]; /* for uniform histograms */
    float** thresh2; /* for non-uniform histograms */
    CvMatND mat; /* embedded matrix header for array histograms */
}

私はこのように行列を滑らかにしようとしました:

cvCalcHist( planes, hist, 0, 0 ); // Compute histogram
(...)

// smooth histogram with Gaussian Filter
cvSmooth( hist->mat, hist_img, CV_GAUSSIAN, 3, 3, 0, 0 );

残念ながら、の代わりに as 入力cvSmoothが必要なため、これは機能しません。に変身できませんでした(私の場合は 2-dim です)。CvMatCvMatNDCvMatNDCvMatCvMatND

私を助けてくれる人はいますか?ありがとう。

4

2 に答える 2

9

平均を計算するだけで、平均フィルターに使用されるのと同じ基本アルゴリズムを使用できます。

for(int i = 1; i < NBins - 1; ++i)
{
    hist[i] = (hist[i - 1] + hist[i] + hist[i + 1]) / 3;
}

必要に応じて、ウィンドウ サイズを簡単に変更できる、もう少し柔軟なアルゴリズムを使用できます。

int winSize = 5;
int winMidSize = winSize / 2;

for(int i = winMidSize; i < NBins - winMidSize; ++i)
{
    float mean = 0;
    for(int j = i - winMidSize; j <= (i + winMidSize); ++j)
    {
         mean += hist[j];
    }

    hist[i] = mean / winSize;
}

ただし、これは単純な手法の 1 つにすぎないことに注意してください。

本当に OpenCv ツールを使用して実行したい場合は、openCv フォーラムにアクセスすることをお勧めします: http://tech.groups.yahoo.com/group/OpenCV/join

于 2009-11-25T17:25:55.117 に答える
0

使用するビンの数を変えることで、ヒストグラムの「滑らかさ」を劇的に変えることができます。経験則として、n 個のデータ ポイントがある場合は sqrt(n) ビンを使用することをお勧めします。このヒューリスティックをヒストグラムに適用して、より良い結果が得られるかどうかを確認してください。

于 2012-09-15T08:43:52.860 に答える