approcci
Esistono molti metodi per la deconvoluzione (vale a dire l'operatore di degrado è lineare e invariante tempo / spazio).
Tutti cercano di affrontare il fatto che il problema è malato in molti casi.
I metodi migliori sono quelli che aggiungono una certa regolarizzazione al modello dei dati da ripristinare.
Può essere modelli statistici (Priori) o qualsiasi conoscenza.
Per le immagini, un buon modello è il saggio liscio o la scarsità dei gradienti.
Ma per motivi di risposta sarà necessario un semplice approccio parametrico: -Minimizzare l'errore dei minimi quadrati tra i dati ripristinati nel modello e le misurazioni.
Modello
Il modello dei minimi quadrati è semplice.
La funzione obiettivo in funzione dei dati è data da:
f(x)=12∥h∗x−y∥22
Il problema di ottimizzazione è dato da:
argminxf(x)=argminx12∥h∗x−y∥22
Dove sono i dati da ripristinare, è il kernel di sfocatura (gaussiano in questo caso) e è l'insieme di misurazioni date.
Il modello presuppone che le misurazioni vengano fornite solo per la parte valida della convoluzione. Vale a dire se e allora dove .xhy
x∈Rnh∈Rky∈Rmm=n−k+1
Questa è un'operazione lineare nello spazio finito, quindi può essere scritta usando un Matrix Form:
argminxf(x)=argminx12∥Hx−y∥22
Dove è la matrice di convoluzione.H∈Rm×n
Soluzione
La soluzione dei minimi quadrati è data da:
x^=(HTH)−1HTy
Come si può vedere, richiede un'inversione di matrice.
La capacità di risolverlo adeguatamente dipende dal numero di condizione dell'operatore che obbedisce a . cond ( H ) = √HTHcond(H)=cond(HTH)−−−−−−−−−−√
Analisi del numero di condizione
Cosa c'è dietro questo numero di condizione?
Si potrebbe rispondere usando l'algebra lineare.
Ma un approccio più intuitivo, secondo me, lo starebbe pensando nel dominio della frequenza.
Fondamentalmente l'operatore di degradazione attenua l'energia, generalmente, ad alta frequenza.
Ora, poiché in frequenza si tratta sostanzialmente di una moltiplicazione saggia di elementi, si direbbe che il modo più semplice per invertirla è la divisione saggia di elementi per il filtro inverso.
Bene, è quello che è stato fatto sopra.
Il problema sorge con i casi in cui il filtro attenua praticamente l'energia a zero. Quindi abbiamo problemi reali ...
Questo è fondamentalmente ciò che ci dice il numero di condizione, quanto duramente alcune frequenze sono state attenuate rispetto ad altre.
Sopra si vedeva il numero di condizione (utilizzando le unità [dB]) in funzione del parametro STD del filtro gaussiano.
Come previsto, maggiore è l'STD, peggiore è il numero della condizione poiché un STD più elevato significa LPF più forte (i valori che scendono alla fine sono numeri).
Soluzione numerica
Nasce l'Ensemble of Gaussian Blur Kernel.
I parametri sono , e .
I dati sono casuali e non è stato aggiunto alcun rumore.k = 31 m = 270n=300k=31m=270
In MATLAB è stato risolto il sistema lineare pinv()
che utilizza lo pseudo inverso basato su SVD e l' \
operatore.
Come si può vedere, utilizzando SVD la soluzione è molto meno sensibile del previsto.
Perché c'è un errore?
Guardando una soluzione (per il più alto STD):
Come si può vedere, il segnale viene ripristinato molto bene, tranne l'inizio e la fine.
Ciò è dovuto all'uso della Convoluzione valida che ci dice poco su quei campioni.
Rumore
Se aggiungessimo rumore, le cose sembrerebbero diversamente!
Il motivo per cui i risultati erano buoni prima è dovuto al fatto che MATLAB poteva gestire il DR dei dati e risolvere le equazioni anche se avevano un numero di condizione elevato.
Ma un numero di condizione elevato indica che il filtro inverso amplifica fortemente (per invertire l'attenuazione forte) alcune frequenze.
Quando quelli contengono rumore significa che il rumore sarà amplificato e il restauro sarà cattivo.
Come si può vedere sopra, ora la ricostruzione non funzionerà.
Sommario
Se si conosce esattamente l'operatore di degradazione e l'SNR è molto buono, funzioneranno semplici metodi di deconvoluzione.
Il problema principale della deconvoluzione è la forza con cui l'operatore di degradazione attenua le frequenze.
Più attenua, più SNR è necessario per ripristinare (questa è fondamentalmente l'idea alla base di Wiener Filter ).
Le frequenze impostate su zero non possono essere ripristinate!
In pratica, al fine di avere risultati stabili su dovrebbe aggiungere alcuni priori.
Il codice è disponibile nel mio repository GitHub di elaborazione del segnale StackExchange Q2969 .