19

x 導関数のソーベルは次のようになります。

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

そのように見える私の画像の2つのサンプルがあるとしましょう(0 =黒、1 =白):

0 0 1            1 0 0
0 0 1      &     1 0 0
0 0 1            1 0 0

畳み込みを実行すると、それぞれ 4 と -4 になります。

したがって、私の自然な反応は、結果を 8 で正規化し、0.5 で変換することです。これは正しいですか? (正規化について言及しているウィキペディアなどが見つからないので、私は疑問に思っています)

編集: ソーベル フィルターを使用して 2D 構造テンソルを作成します (導関数 dX および dY を使用):

                   A B 
Structure Tensor = C D

with  A = dx^2 
      B = dx*dy
      C = dx*dy 
      D = dy^2

最終的には結果を [0,1] に保存したいのですが、現在、ソーベルの結果を正規化する必要があるかどうか (デフォルトでは、保存するためだけでなく) かどうか疑問に思っています。

A = dx*dx 
//OR
A = (dx/8.0)*(dx/8.0)
//OR
A = (dx/8.0+0.5)*(dx/8.0+0.5)
4

3 に答える 3

1

ソーベル フィルターの数学的に正しい正規化は 1/8 です。これは、結果がピクセルあたり 1 グレー レベルの自然な単位になるためです。しかし、実際のプログラミングでは、これは必ずしも正しいことではありません。

于 2014-03-19T12:09:25.613 に答える
-1

ソーベル フィルターは、水平方向または垂直方向に微分を行う一種のヒューリスティックなアプローチです。したがって、正規化は任意である可能性があります。次の正規化は、絶対値の合計の半分を取る他の正規化よりも理にかなっていることがわかりました。

http://www.imagemagick.org/discourse-server/viewtopic.php?t=14434&start=30

実際、scikit-image はこのアプローチを使用しています。例えば、

>>>from skimage import filters
>>>import numpy as np
>>>one[:,0] = 2
>>>one
array([[ 2.,  1.,  1.],
       [ 2.,  1.,  1.],
       [ 2.,  1.,  1.]])
>>>filters.sobel_v(one)
array([[ 0.,  0.,  0.],
       [ 0., -1.,  0.],
       [ 0.,  0.,  0.]])
于 2015-08-25T04:41:46.647 に答える