2012-04-05 34 views
1

画像からデータを収集する必要があります。ルーピングはマスクで行う必要があります。例えばopenCVのマスクで画像をループする

、私はシンプルなクロスマスクがあります。

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関数がありますが、画像を変更する必要はありませんが、ピクセルで計算するだけです)。

+0

各ピクセルの 'sum'で何をしたいですか?ここでは – moooeeeep

+0

は簡単な例です。本当に、私はSUSAN検出アルゴリズムを適用するために、すべての合計でいくつかの計算式を計算する必要があります。 –

答えて

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に指定する境界外挿の種類によって異なります。 From the docs:このセクションで説明する関数やクラスの

もう一つの共通の特徴は、単純な算術関数とは異なり、彼らはいくつかの非存在する画素の値を推定する必要がある、ということです。たとえば、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' 
*/ 
+0

'img'が10x10 = 100ピクセルの場合、最初と最後の行とcol(8x8 = 64ピクセルをカーネルの核として)を使わずにループします:64要素の' sums'マトリックスすべてのカーネル)? –

+0

@Innuendo:これは 'filter2d()'に指定した境界外挿法に依存します。私の編集を参照してください。 – moooeeeep

+0

イェップ、ありがとうございました。私はそれを得た;) –

関連する問題