2

画像からデータを収集する必要があります。ループはマスクを使用して実行する必要があります。

たとえば、私は単純なクロスマスクを持っています:

  1  
1 1 1
  1

そして、画像のすべてのポイントのグレー値の合計を知る必要があります。

次のような単純なループを使用できます。

// looping except first and last
int nr = image.rows-1;
int nc = image.cols-1;

    for (int j=1; j<nr; j++) { // for all rows

    const uchar* previous = image.ptr<const uchar>(j-1); // previous row
    const uchar* current = image.ptr<const uchar>(j); // current row
    const uchar* next = image.ptr<const uchar>(j+1); // next row

    for (int i=1; i<nc; i++) {
        sum = previos[i] + current[i] + current[i-1] 
                          + current[i+1] + next[i];

    }
}

しかし、私はこれを間違っていると思います。たぶん私は次のようなものを使うべきcv::Mat kernel()ですか?

パラメータとしてマスクが必要なので、どんな種類のマスクでも使用できます。

マスクを使って画像をループさせる準備ができている機能はありますか?(filter2D関数がありますが、画像を変更する必要はありません。ピクセルを使用して計算するだけです)。

4

1 に答える 1

2

各ピクセルの合計が必要な場合、それは正確には何をしているのではfilter2d()ありませんか?各ピクセルの合計を計算し、これらの合計を使用してSUSANを続行します:(テストされていないコード)

cv::Mat img;
// TODO: load img
cv::Mat kernel = cv::Mat::ones(3,3,CV_8U);
// TODO: set some elements to zero you don't like
cv::Mat sums = img.clone();
cv::filter2d(img, sums, -1, kernel);
// TODO: use sums for further computation 

画像の端で何が起こるかは、指定した境界線の外挿タイプによって異なりますfilter2dドキュメントから

このセクションで説明する関数とクラスのもう1つの一般的な機能は、単純な算術関数とは異なり、存在しないピクセルの値を推定する必要があることです。たとえば、Gaussian 3 \ times 3フィルタを使用して画像を平滑化する場合、各行の左端のピクセルを処理するときは、それらの左側、つまり画像の外側にピクセルが必要です。これらのピクセルを左端の画像ピクセルと同じにする(「複製された境界」外挿法)か、存在しないすべてのピクセルをゼロと見なす(「一定の境界」外挿法)などができます。OpenCVを使用すると、外挿法を指定できます。詳細については、関数borderInterpolate()と、以下のセクションおよび以下のさまざまな関数のborderTypeパラメーターの説明を参照してください。

/*
 Various border types, image boundaries are denoted with '|'

 * BORDER_REPLICATE:     aaaaaa|abcdefgh|hhhhhhh
 * BORDER_REFLECT:       fedcba|abcdefgh|hgfedcb
 * BORDER_REFLECT_101:   gfedcb|abcdefgh|gfedcba
 * BORDER_WRAP:          cdefgh|abcdefgh|abcdefg
 * BORDER_CONSTANT:      iiiiii|abcdefgh|iiiiiii  with some specified 'i'
 */
于 2012-04-05T21:09:06.860 に答える