2013-04-09 19 views
9

I x-derivato Sobel appare in questo modo:Il filtro Sobel deve essere normalizzato?

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

Diciamo che ci sono due campioni della mia immagine, che assomigliano a quello (0 = nero, 1 = bianco):

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

Se io Esegui la convoluzione. Finirò con 4 e -4 rispettivamente.

Quindi la mia risposta naturale sarebbe normalizzare il risultato per 8 e tradurlo per 0,5 - è corretto? (mi chiedo come non riesce a trovare Wikipedia ecc menzionare alcuna normalizzazione)

EDIT: Io uso il filtro Sobel per creare un tensore struttura 2D (con i derivati ​​dx e dy):

    A B 
Structure Tensor = C D 

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

In definitiva voglio memorizzare il risultato in [0,1], ma al momento mi chiedo se devo normalizzare il risultato Sobel (di default, non solo per memorizzarlo) o no, cioè:

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

dipende solo dalla tua applicazione. Se l'obiettivo è archiviarlo e visualizzare il risultato come bitmap, allora dovresti tradurre e ridimensionarlo in modo che rientri in 0..255. Qual è il tuo obiettivo ? – WhitAngl

+0

"Quindi la mia risposta naturale sarebbe normalizzare il risultato per 8 e tradurlo per 0.5 - è corretto?" La tua risposta a cosa? –

+0

@WhitAngl: la memorizzazione e la visualizzazione sono l'obiettivo finale (quindi eseguirò la normalizzazione/traduzione appropriata alla fine), ma nel frattempo devo fare un po 'più di calcolo. E mi chiedo se il filtro Sobel debba essere SEMPRE normalizzato (vedi domanda aggiornata). – Tom

risposta

0

Una normalizzazione matematicamente corretta per il filtro Sobel è 1/8, perché porta il risultato alle unità naturali di un livello di grigio per pixel. Ma nella programmazione pratica, questa non è necessariamente la cosa giusta da fare.

0

Il filtro Sobel è una sorta di approccio euristico per fare differenziale lungo orizzontalmente o verticalmente. Pertanto, la normalizzazione potrebbe essere arbitraria. Ho trovato che la seguente normalizzazione ha più senso di altri, che prendono la metà della somma dei valori assoluti.

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

Infatti, scikit-immagine utilizza questo approccio. ad esempio,

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