4

ウィキペディアのエントリ-キャニー エッジ検出に実装されているアルゴリズムがどのように機能するかについて、少し説明を求めています。2D ガウス フィルターを使用してノイズ リダクションを実行するのは非常に簡単に思えますが、2 つの 1D フィルターを使用すると聞いたことがあります。これはどのように行われますか? 勾配とエッジ方向の計算も簡単です。ただし、非最大抑制を実行するときに、丸みを帯びた角度を取得するための巧妙なトリックはありますか? 私が現在行っているのは、エッジ方向 (シータ) の値を pi/4 で割って整数にキャストし、switch ステートメントを使用することです。しかし、負のシータ値をどのように処理すればよいのでしょうか?つまり、-pi/4 を 3*pi/4 と同じ方法で処理するか、pi/4 と同じ方法で処理する必要がありますか?

アドバイス/リンクは大歓迎です!

ありがとう、ベン

4

3 に答える 3

7

ガウス分布

[簡単にするために定数は省略されています]

g2d(x、y)= exp(-x x-y y)= exp(-x ^ 2)* exp(-y ^ 2)= g1d(x)* g1d(y)

したがって、は1d分布の乗算に分けることができます。したがって、フィルタリングは最初にx方向(各行で独立)で実行でき、次にy方向(各列で独立)で実行できます。

丸みを帯びた角度

角度が[0..pi)の外側にある場合、この場合、必要な回数だけpiを加算/減算する(または関数fmodを使用する)のが正しいです。[0..pi)の場合はすべて明確です。

また、プラットフォームによっては、アークタンの使用をまったく避けた方がよい場合があります。円を描き、それを4つの領域に分割し、算術演算のみを使用して、どの領域の方向であるかを答えるグラデーションコンポーネントの条件のセットを作成できます。

于 2009-09-08T04:49:33.820 に答える
1

自分で実装する必要がありますか、それともライブラリを使用できますか? OpenCv は、エッジ検出を含むコンピューター ビジョンのアルゴリズムの巨大な C ライブラリです: http://opencv.willowgarage.com/documentation/image_processing.html?highlight=canny#cvCanny

教育目的でこれを行っている場合は、コンピューター ビジョンに関する優れたテキストの購入を検討することをお勧めします。ほぼすべての入門テキストで、ガウス (および十分に文書化された 1d トリック) を使用したフィルタリング、および巧妙なエッジ検出と非最大抑制について説明します。

于 2009-09-08T16:43:36.983 に答える
1

-pi/4 は 3*pi/4 と同じように処理する必要があると思います。どちらも同じ対角線を定義しているためです。

[0, pi) になるようにグラデーションの角度を正規化できる場合は、次のような単純な関数を使用して角度を量子化できます。

enum Angle
{
    HORIZONTAL,
    DIAG_UP,
    VERTICAL,
    DIAG_DOWN
};

Angle quantizeAngle(double theta)
{
    if (0 <= theta && theta < PI/8.0) || (7.0*PI/8.0 <= theta && theta < PI))
        return HORIZONTAL;
    else if (PI/8.0 <= theta && theta < 3.0*PI/8.0)
        return DIAG_UP;
    else if (3.0*PI/8.0 <= theta && theta < 5.0*PI/8.0)
        return VERTICAL;
    else 
        return DIAG_DOWN;
}
于 2012-10-03T03:52:17.707 に答える