2017-04-24 4 views
1

In scikit-image's documentation heißt es, dass der Kern für die vertikalen Linien zu erfassen, ist:Skimage filters.sobel_v Ergebnis nicht sinnvoll. Warum?

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

Wenn ich tun:

img = np.array([[1.0, 2.0, 3.0], [4, 5, 6], [7, 8, 9]]) 
Lx = filters.sobel_v(img) 

und dann Lx drucken, erhalte ich:

Lx 
0.0000 0.0000 0.0000 
0.0000 2.0000 0.0000 
0.0000 0.0000 0.0000 

Was macht keinen Sinn, da das Ergebnis sein sollte:

1*(-1) + 3*1 + 4*(-2) + 6*2 + 7*(-1) + 9*1 = -16 + 24 = 8 

und nicht 2, in der zentralen Position.

Was ist los?

+0

Danke für Ihre Antwort. Sehr hilfreich. –

+0

Und danke für die Befestigung meiner Faltung :) –

Antwort

1

Der Unterschied ist auf einen Skalierungsfaktor1/4 zurückzuführen.

Der Sobel-Kernel für den vertikalen Kantenerkennung ist in der Regel definiert als:

outer product

:

Gv

Dieser Kern als das Produkt eines Glättungskern und einem Derivat kernel wie diese zerlegt werden kann,

Damit der Glättungskern ein echter Mittelwertfilter ist, sollte er um den Faktor 1/(1+2+1) = 1/4 skaliert werden. Dadurch wird der Sobel-Kernel:

Gv scaled

Obwohl der Skalierungsfaktor in der Dokumentation nicht erwähnt wird, ist es tatsächlich bei der Umsetzung verwendet wird (überprüfen Sie die source code aus sich zu überzeugen).