2013-04-09 12 views
9

X-pochodna Sobel wygląda w ten sposób:Czy filtr Sobela miał być znormalizowany?

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

Powiedzmy, istnieją dwie próbki mojego obrazu, które wyglądają tak (0 = czarny, 1 = biały):

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

Jeśli I wykonam splot, na którym skończę odpowiednio 4 i -4.

Tak więc moją naturalną reakcją byłoby znormalizowanie wyniku o 8 i przetłumaczenie go o 0.5 - czy to prawda? (zastanawiam się jak nie można znaleźć w Wikipedii itp wspomnieć normalizacji)

EDIT: używam filtr Sobel stworzyć tensora Struktura 2D (z pochodnymi dX i dy):

    A B 
Structure Tensor = C D 

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

Ostatecznie chcę zapisać wynik w [0,1], ale teraz zastanawiam się, czy muszę normalizować wynik Sobela (domyślnie, nie tylko po to, aby go zapisać), czy też nie, np .:

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

to tylko zależy od aplikacji. Jeśli celem jest zapisanie go i wizualizacja wyniku jako bitmapy, należy przetłumaczyć i skalować tak, aby mieścił się w zakresie 0..255. Jaki jest twój cel? – WhitAngl

+0

"Więc moją naturalną reakcją byłoby znormalizowanie wyniku o 8 i przetłumaczenie go o 0,5 - czy to prawda?" Twoja odpowiedź na pytanie? –

+0

@WhitAngl: przechowywanie i wizualizacja jest ostatecznym celem (więc zrobię odpowiednią normalizację/tłumaczenie na końcu), ale muszę zrobić trochę więcej kalkulacji pomiędzy. I zastanawiam się, czy filtr ZAWSZE Sobel musi zostać znormalizowany (patrz zaktualizowane pytanie). – Tom

Odpowiedz

0

Matematycznie poprawna normalizacja dla filtra Sobela to 1/8, ponieważ przynosi wynik do naturalnych jednostek jednego szarego poziomu na piksel. Ale w praktycznym programowaniu niekoniecznie jest to właściwe.

0

Filtr Sobela to rodzaj heurystycznego podejścia do różnicowania wzdłuż w poziomie lub w pionie. Dlatego normalizacja może być dowolna. Odkryłem, że po normalizacji ma więcej sensu niż inne, które biorą połowę sumy wartości bezwzględnych.

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

W rzeczywistości scikit-image używa tego podejścia. np.

>>>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.]])