それは非常に簡単です。あなたが懸念しているのは、各マスクが微分フィルターであるマスクを使用して画像フィルタリングを実行することです。この方法では、指定された方向に関する偏導関数のみが検出されるという点で、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 近傍を抽出し、近傍内のそれらのピクセルと必要なフィルターの間で加重合計を実行します。この場合、これはソーベル垂直エッジ検出器になります。
幸運を!