1

画像のオブジェクトのエッジを検出するために、 PrewittSobelのどちらの画像フィルターを選択するかをユーザーに求めるプログラムを作成しています。関数ではなく、フィルター テンプレートを使用する必要がありedgeます。ユーザーは、「水平」、「垂直」、または「対角」のエッジを検出するかどうかも指定します。私の問題はプログラミングではなく理論的なものです。

私のメモでは、各ピクセルの勾配の大きさを計算するために、垂直方向の微分と水平方向の微分がsqrt(Gx^2 + Gy^2)どこにあるかとして近似されることがよくあります。しかし、水平方向のエッジのみを計算した場合の値は何ですか? そして、垂直方向のエッジのみを探している場合の値は?GxGyGxGy

私はそれを自分で推測することはできません。

4

1 に答える 1

3

それは非常に簡単です。あなたが懸念しているのは、各マスクが微分フィルターであるマスクを使用して画像フィルタリングを実行することです。この方法では、指定された方向に関する偏導関数のみが検出されるという点で、knedlsepp は正しいです。1 つのマスクを指定して水平エッジを検出し、別のマスクを垂直エッジに指定します。

Gxは、垂直微分フィルタを使用した垂直Gyエッジ応答を表し、水平微分フィルタを使用した水平エッジ応答を表します。応答を取得するには、画像を取得し、任意のマスクを使用して 2D 畳み込みでフィルター処理します。

次に、両方の応答を組み合わせて、全体的な振幅応答を取得します。ただし、edgeボンネットの下で多くのノイズ クリーンアップを実行し、最終的な応答を得るためにしきい値処理も実行します。マグニチュードを計算するだけでは、何が起こるかの完全な話ではありedgeません。

いずれにせよ、水平方向のエッジを検出する場合、Prewitt マスクは次のようになります。

Gy_prewitt = 

-1    -1   -1
 0     0    0
 1     1    1

上記のマスクを使用してフィルタリングを実行すると、水平エッジ応答、または が見つかりGyます。

垂直エッジ応答 またはを見つけるにはGx、単純に上記のマスクを転置してフィルター応答を見つけます。

Gx_prewitt =

     -1     0    1
     -1     0    1
     -1     0    1

ソーベル マスクは、プレウィット マスクとは少し異なります。マスクの中央の行 (垂直の場合) または列 (水平の場合) により誇張され、2 倍の重みが付けられます。水平マスクは次のとおりです。

Gy_sobel =

-1   -2   -1
 0    0    0
 1    2    1

同様に、ソーベルの垂直マスクは次のように定義されます。

Gx_sobel =

 -1     0    1
 -2     0    2
 -1     0    1

注意すべき重要なことは、マスク内のすべての係数の合計がゼロに等しく、実際に実際に見られるエッジ検出マスクのプロパティであるということです。

Gyここで、全体的なエッジ応答を決定するために、水平、 、および垂直のそれぞれのフィルタリング応答を取得し、Gx対応するピクセルごとに振幅演算を適用します。

out = sqrt(Gx.^2 + Gy.^2);

ソーベル マスクがプレウィットとわずかに異なる理由について、より直感的な説明が必要な場合は、この投稿をご覧になることをお勧めします。組み込みの畳み込みメソッドを使用できない場合に、フィルタリング操作を自分で実装する方法について、非常に良い説明と良い図を提供します。

http://blog.saush.com/2011/04/20/edge-detection-with-the-sobel-operator-in-ruby/

ダイアグラムは次のとおりです。

基本的に、画像でフィルター処理する各ピクセルについて、3 x 3 近傍を抽出し、近傍内のそれらのピクセルと必要なフィルターの間で加重合計を実行します。この場合、これはソーベル垂直エッジ検出器になります。

幸運を!

于 2015-04-19T19:43:15.723 に答える