0

私は Opencv でプログラミングを始めたばかりで、単純な平均フィルターを実装しようとしています。OpenCv には組み込み関数があることは理解していますが、まだ使用したくありません。空間ドメイン フィルタリング メカニズムと畳み込みとの類似性を理解しようとしています。以下は、入力と出力を受け取る私が書いた関数です

void averageFilter(Mat& Input,Mat& Output)
{
    int row=Input.rows;
    int col=Input.cols;
    //uchar *input_data=Input.data;
    //uchar *output_data=Output.data;
    int size=1;
    uchar count=0;
    uchar sum=0;

    //int nChannels=1;

     for(int j = 1 ; j < Input.rows-1; ++j)
    {
        const uchar* previous = Input.ptr<uchar>(j - 1);
        const uchar* current  = Input.ptr<uchar>(j    );
        const uchar* next     = Input.ptr<uchar>(j + 1);

        uchar* output = Output.ptr<uchar>(j);

        for(int i= 1;i < (Output.cols-1); ++i)
        {
            *output++ = (current[i]
                         +current[i-1] + current[i+1] + previous[i] +next[i]+previous[i-1]+previous[i+1]+next[i-1]+next[i+1])/9;
        }
    }
}

これは平均化を実行しません。何が間違っているのか教えてください。

ありがとうございました

4

1 に答える 1

1

ですべてを行うとunsigned char、おそらくオーバーフローが発生する可能性があるため、次のようなことを試してください

for(int i= 1;i < (Output.cols-1); ++i)
{
    double dResult = (current[i] +current[i-1] + current[i+1] + 
                      previous[i] +next[i]+previous[i-1]+previous[i+1]+
                      next[i-1]+next[i+1])/9.0;
    *output++ = (unsigned char)dResult;
}

また、あなたpreviousnext行のピクセルが間違っていると思います-行番号を幅で乗算する必要があります。と同様output

修正を編集します。OpenCVのドキュメントを確認したところptr、行ポインターであるため、最後のコメントは無視してください!

于 2013-05-05T08:21:25.123 に答える