X 方向と Y 方向の画像にソーベル演算子を適用しatan2
、結果の X/Y ベクトルから角度 ( ) を計算すると、45 度のステップで勾配方向が得られるようです。ソーベルは 45 度刻みで 8 方向のみを生成しますか?それとも正確な角度を取得する必要がありますか?それとも丸め誤差である可能性がありますか?
私はソーベル畳み込みを使用し、ここGx
でGy
言及しています https://en.wikipedia.org/wiki/Sobel_operator
X 方向と Y 方向の画像にソーベル演算子を適用しatan2
、結果の X/Y ベクトルから角度 ( ) を計算すると、45 度のステップで勾配方向が得られるようです。ソーベルは 45 度刻みで 8 方向のみを生成しますか?それとも正確な角度を取得する必要がありますか?それとも丸め誤差である可能性がありますか?
私はソーベル畳み込みを使用し、ここGx
でGy
言及しています https://en.wikipedia.org/wiki/Sobel_operator
はい、分類ソーベル演算子を使用します。ここで何をしているのか理解してみましょう:
垂直線を検出するソーベル演算子は次のようになります。
[-1 0 1
-2 0 2
-1 0 1]
これをピクセルに適用すると(これをピクセルの上に置き、隣接するピクセルの値を使用してからすべてを合計します)、右のピクセルが右のピクセルと異なる値を持つ場合にのみゼロ以外の値になります。左。その場合は、垂直エッジがあることを意味します。
次に、45 度のソーベル演算子:
[-2 -1 0
-1 0 1
0 1 2]
垂直方向の仕組みを理解していれば、これは簡単に理解できるはずです。最大値は、この行列の対角線が異なる値、つまり 45 度のエッジを持つ場合に発生します。
続行する前に、コメントで @ImanolLuengo によって言及されていることに注意してください。それはそれをあまり強化しません。必要に応じて、これを自分でテストできます。
ここで、3x3 マトリックスを使用すると、30 度のエッジを取得するのが非常に難しいことがわかります。これは、基本的に、使用するカーネルが目立たず小さい (3x3) ため、そのようなケンレルを作成できないためです。他の角度を強化します。
ただし、ソーベル演算子と同じロジックを使用すると、任意の角度を強化できるより大きなサイズのカーネルを考えることができます。
たとえば、次のカーネルは主に 30 度を強化します。
[1 1 1 1 0
1 1 0 0 0
0 0 0 -1 -1
0 -1 -1 -1 -1]
Sobel で指摘されているように、一部のカーネル要素は他の要素よりも大きな数値を持っているため、これは「kenrel の手による近似値です。この数値のルールは次のとおりです。検出するエッジの方向の値が高くなり、値が高くなります。実際にカーネルの中心を通過するもので。
これは Sobel オペレーターではありませんが、必要なジョブを実行する任意のカーネルを構成できます。