Sfocatura gaussiana - Deviazione standard, raggio e dimensione del kernel


19

Ho implementato uno shader di frammenti di sfocatura gaussiana in GLSL. Comprendo i concetti principali alla base di tutto ciò: convoluzione, separazione di xey mediante linearità, passaggi multipli per aumentare il raggio ...

Ho ancora alcune domande:

  • Qual è la relazione tra sigma e raggio?

    Ho letto che sigma equivale al raggio, non vedo come sigma sia espresso in pixel. O "raggio" è solo un nome per sigma, non correlato ai pixel?

  • Come scelgo sigma?

    Considerando che utilizzo più passaggi per aumentare il sigma, come faccio a scegliere un buon sigma per ottenere il sigma che desidero in un determinato passaggio? Se il sigma risultante è uguale alla radice quadrata della somma dei quadrati dei sigmi e il sigma è equivalente al raggio, qual è un modo semplice per ottenere qualsiasi raggio desiderato?

  • Qual è la dimensione giusta per un kernel e come si collega a sigma?

    Ho visto la maggior parte delle implementazioni usare un kernel 5x5. Questa è probabilmente una buona scelta per un'implementazione veloce con qualità decente, ma c'è un altro motivo per scegliere un'altra dimensione del kernel? In che modo sigma si collega alla dimensione del kernel? Dovrei trovare il sigma migliore in modo che i coefficienti esterni al mio kernel siano trascurabili e si normalizzino?

Risposte:


21

Qual è la relazione tra sigma e raggio? Ho letto che sigma equivale al raggio, non vedo come sigma sia espresso in pixel. O "raggio" è solo un nome per sigma, non correlato ai pixel?

Ci sono tre cose in gioco qui. La varianza, ( ), il raggio e il numero di pixel. Poiché si tratta di una funzione gaussiana bidimensionale, ha senso parlare invece della matrice di covarianza Σ . Comunque sia, quei tre concetti sono debolmente correlati.σ2Σ

Prima di tutto, il gaussiano 2-D è dato dall'equazione:

g(z)=1(2π)2|Σ|e-12(z-μ)TΣ-1 (z-μ)

Dove è un vettore colonna contenente le x ed y coordinata nell'immagine. Quindi, z = [ x y ] , e μ è un vettore colonna codificante la media della funzione gaussiana, nella x ed y indicazioni u = [ μ x μ y ] .zXyz=[Xy]μXyμ=[μXμy]

Esempio:

Ora, diciamo che abbiamo impostato la matrice di covarianza e μ = [ 0 0 ] . Imposterò anche il numero di pixel su 100 x 100 . Inoltre, la mia "griglia", in cui valuto questo PDF, andrà da - 10 a 10 , sia in x che in y . Questo significa che ho una risoluzione della griglia di 10 - ( - 10 )Σ=[1001]μ=[00]100100-1010Xy. Ma questo è completamente arbitrario. Con queste impostazioni, avrò l'immagine della funzione di densità di probabilità sulla sinistra. Ora, se cambio la "varianza", (davvero, la covarianza), in modo tale cheΣ=[ 9 0 0 9 ]e mantengo tutto uguale, ottengo l'immagine sulla destra.10-(-10)100=0.2Σ=[9009]

inserisci qui la descrizione dell'immagine

Il numero di pixel è sempre lo stesso per entrambi, x 100 , ma abbiamo modificato la varianza. Supponiamo invece di fare lo stesso esperimento, ma utilizziamo invece 20 x 20 pixel, ma ho comunque eseguito da - 10 a 10 . Quindi, la mia griglia ha una risoluzione di 10 - ( - 10 )1001002020-1010. Se uso le stesse covarianze di prima, ottengo questo:10-(-10)20=1

inserisci qui la descrizione dell'immagine

Ecco come devi capire l'interazione tra quelle variabili. Se desideri il codice, posso pubblicarlo anche qui.

Come scelgo sigma?

La scelta della matrice varianza / covarianza del filtro gaussiano dipende estremamente dall'applicazione. Non c'è una risposta corretta. È come chiedere quale larghezza di banda si dovrebbe scegliere per un filtro. Ancora una volta, dipende dalla tua applicazione. In genere, si desidera scegliere un filtro gaussiano in modo tale da annullare una notevole quantità di componenti ad alta frequenza nell'immagine. Una cosa che puoi fare per ottenere una buona misura, è calcolare il DFT 2D della tua immagine e sovrapporne i co-efficienti con la tua immagine gaussiana 2D. Questo ti dirà quali coefficienti vengono pesantemente penalizzati.

Ad esempio, se la tua immagine gaussiana ha una covarianza così ampia da includere molti coefficienti di alta frequenza della tua immagine, allora devi ridurne gli elementi di covarianza.


1
Quelle immagini sarebbero migliori se usassero una mappa colori sequenziale. il jet è il peggiore.
endolito il

@endolith "Better" dipende dall'applicazione. Non uso il jet quando è necessaria una discriminazione del contrasto visivo. (Hot è meglio). Qui però, il messaggio è nelle dimensioni del gaussiano, quindi nessun danno fatto con il jet. Grazie comunque per il link.
Tarin Ziyaee,

2
Questa è una risposta ben pensata e davvero ben visualizzata! Prendi quell'immagine in alto a sinistra, per esempio. È chiaro che quella combinazione di varianza e dimensione del kernel sarebbe dispendiosa, poiché si tratta di un kernel 100x100 in cui solo il centro 30x30 (~ 9%) è diverso da zero.
Adam Smith,

5

Il parametro sigma è sufficiente per definire la sfocatura gaussiana da un punto di vista continuo. In pratica, tuttavia, le immagini e i kernel di convoluzione sono discreti. Come scegliere un'approssimazione discreta ottimale del kernel gaussiano continuo?

L'approssimazione discreta sarà più vicina al kernel gaussiano continuo quando si usa un raggio più ampio. Ma ciò può comportare un costo aggiuntivo per la durata del calcolo.

Idealmente, si selezionerebbe un valore per sigma, quindi si calcolerebbe un raggio che consente di rappresentare fedelmente il corrispondente kernel gaussiano continuo. Per un dato errore di approssimazione, maggiore è il sigma, maggiore deve essere il raggio.

È interessante notare che questo può diventare molto complicato per farlo bene. Quando si costruisce la matrice gaussiana, è la soluzione migliore per campionare il kernel continuo o ci sono approssimazioni migliori? Come normalizzare il kernel discreto calcolato per tenere conto del troncamento? eccetera.

Come riferimento, in Mathematica la funzione GaussianMatrix offre diversi modi per calcolare una matrice discreta gaussiana, ad esempio utilizzando l'approssimazione discreta di Bessel. Per impostazione predefinita, raggio = 2 * sigma, il che significa che con sigma = 1, la matrice sarà 5x5.


Questa è una domanda piuttosto vecchia. Ma un raggio di 2 * sigma non comporterebbe una matrice di 9x9?
Delusional Logic,

@DelusionalLogic con sigma = 1, raggio = 2, quindi la matrice avrà dimensione 4 ma necessita di dimensioni dispari quindi dimensione 5x5. Almeno è così che lo capisco ..
Micka,

Se il raggio è 2, il vicinato estende il pixel centrale di 2 pixel a sinistra, 2 a destra, ecc. È solo la convenzione utilizzata da Mathematica.
Matthias Odisio,

2

Si scopre che le file del triangolo di Pascal si avvicinano abbastanza bene a un gaussiano e hanno il vantaggio pratico di avere valori interi la cui somma è una potenza di 2 (possiamo memorizzare questi valori esattamente come numeri interi, valori a virgola fissa o float). Ad esempio, supponiamo di voler costruire un kernel gaussiano 7x7 che possiamo fare usando la settima riga del triangolo di Pascal come segue:

inserisci qui la descrizione dell'immagine

Si noti che questo filtro ha l'influenza minima agli angoli pur rimanendo valutato come intero. È possibile utilizzare il valore medio 20/64 per determinare il corrispondente sigma di deviazione standard che è 64 / (20 * sqrt (2 * pi)) = 1.276 per il gaussiano approssimato in questo caso. Puoi rappresentare graficamente il gaussiano per vedere che si adatta perfettamente.

Quindi un buon punto di partenza per determinare una deviazione standard ragionevole per un kernel gaussiano proviene dal triangolo di Pascal (aka coefficienti binomiali ) - per un filtro (N + 1) x (N + 1) corrispondente all'uso di costruzione sopra

inserisci qui la descrizione dell'immagine

La GaussianMatrix di Wolfram Alpha [3] usa solo r / 2 = 1.5. Stranamente, GaussianMatrix [{3,1.276}] non produce lo stesso filtro 2D del mio e non è il seguente per x, y tra -3 e 3:

inserisci qui la descrizione dell'immagine

Non sono sicuro perché no? Il mio filtro 2D si adatta perfettamente.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.