4

私の問題に関するいくつかの詳細:

openCV(組み込みの別のアルゴリズム:Canny、Harrisなど)でコーナー検出器を実現しようとしています。

応答値で満たされたマトリックスがあります。最大の応答値は-コーナーが検出される最大の確率はです。

問題があります。ポイントの近くでは、検出されたコーナーがほとんどありません(ただし、コーナーは1つしか検出されません)。誤検出されたコーナーの数を減らす必要があります。

正確な問題:

カーネルを使用してマトリックスをウォークスルーし、すべてのカーネルの最大値を計算し、最大値を残す必要がありますが、カーネル内の他の値はゼロに等しくなります。

これを行うための組み込みのopenCV関数はありますか?

4

3 に答える 3

17

これは私がそれを行う方法です:

  1. カーネルを作成し、ピクセル近傍を定義します。
  2. このカーネルを使用して画像を膨張させて、新しい画像を作成します。この膨張した画像には、すべてのポイントの最大近傍値が含まれています。
  3. これら 2 つの配列間で等値比較を行います。それらが等しい場所は、有効な近傍最大値であり255、比較配列に設定されます。
  4. 比較配列と元の配列を乗算します (適切にスケーリングします)。
  5. これは、近傍の最大値のみを含む最終的な配列です。

これは、これらの拡大画像で示されています。

9 ピクセル x 9 ピクセルの元の画像:

ここに画像の説明を入力

5 x 5 ピクセル カーネルで処理した後、ローカル近傍の最大値のみが残ります (つまり、最大値は、より大きな値を持つピクセルから 2 ピクセル以上離れています)。

ここに画像の説明を入力

注意点が 1 つあります。近くにある 2 つの最大値が同じ値の場合、それらは両方とも最終的な画像に表示されます。

これを実行する Python コードを次に示します。c++ への変換は非常に簡単です。

import cv

im = cv.LoadImage('fish2.png',cv.CV_LOAD_IMAGE_GRAYSCALE)
maxed = cv.CreateImage((im.width, im.height), cv.IPL_DEPTH_8U, 1)
comp = cv.CreateImage((im.width, im.height), cv.IPL_DEPTH_8U, 1)
#Create a 5*5 kernel anchored at 2,2
kernel = cv.CreateStructuringElementEx(5, 5, 2, 2, cv.CV_SHAPE_RECT)

cv.Dilate(im, maxed, element=kernel, iterations=1)
cv.Cmp(im, maxed, comp, cv.CV_CMP_EQ)
cv.Mul(im, comp, im, 1/255.0)

cv.ShowImage("local max only", im)
cv.WaitKey(0)

今まで気づきませんでしたが、これは @sansuiso が彼/彼女の回答で提案したものです。

これは、前の次の画像でよりよく説明される可能性があります。

ここに画像の説明を入力

5 x 5 カーネルで処理した後:

ここに画像の説明を入力

固体領域は、共有された極大値によるものです。

于 2012-05-25T15:26:36.030 に答える
3

opencvの組み込み関数を使用するオリジナルの2ステップの手順(より効率的なアプローチが存在する可能性があります)をお勧めします:

  1. ステップ1:正方形のカーネルを使用した形態学的拡張(近隣に対応)。この手順では、各ピクセル値をカーネル内の最大値に置き換えた後、別の画像が表示されます。

  2. ステップ2:元の応答画像の各ピクセルのコーナネス値が拡張ステップで指定された最大値と等しいかどうかをテストします。そうでない場合は、明らかに近所にもっと良いコーナーがあります。

于 2012-05-24T21:06:41.693 に答える
2

組み込みの機能をお探しの場合は、FilterEngineを使用してカスタムフィルター(カーネル)を作成できます。

http://docs.opencv.org/modules/imgproc/doc/filtering.html#filterengine

また、すべての処理の前に、ある種のノイズリダクション(通常はブラー)をお勧めします。それはあなたが本当に画像を生にしたいのでなければです。

于 2012-05-30T09:36:47.683 に答える