Uso del filtro inverso per correggere un'immagine contorta spazialmente (deconvoluzione)


8

Come parte di un compito a casa, stiamo implementando il filtro inverso. Degrada un'immagine, quindi ripristina con un filtro inverso.

Convolgo l'immagine nel dominio spaziale con un filtro box 5x5. FFT il filtro, FFT l'immagine degradata, quindi divido l'immagine degradata per il filtro. Inverso FFT il risultato in un'immagine e ottengo immondizia.

Se FFT l'immagine, FFT il filtro, moltiplico i due, divido quel risultato per il filtro FFT, ovviamente mi avvicino molto all'immagine originale. ((X * Y) / Y ~ == X)

Ho una vaga idea della matematica non è semplice come "moltiplicazione spazialmente == moltiplicazione FFT".

Qual è il modo corretto di utilizzare il filtro inverso? Ho il kernel esatto usato degradare l'immagine. Non sto aggiungendo alcun rumore.

Il libro di testo di Bovik, The Essential Guide to Image Processing, è quasi del tutto sprezzante nei confronti del filtro inverso. Gonzalez & Woods è un po 'più fiducioso, ma salta quasi immediatamente al filtro Wiener.

Ho una domanda simile su stackoverflow.com /programming/7930803/inverse-filter-of-spatially-convolved-versus-frequency-convolved-image

(Anche questa domanda dovrebbe essere taggata [compiti a casa] ma il tag non esiste ancora e non ho il rappresentante per crearlo.)

MODIFICARE. Per alcuni dei fantastici suggerimenti di seguito. @ dipan-mehta Prima di FFT, sto riempiendo il kernel di convoluzione delle stesse dimensioni dell'immagine. Sto mettendo il kernel in alto a sinistra. Ho ifft (ifftshift ()), quindi salvo un'immagine e ottengo un buon risultato. Ho fatto l'ifft (ifftshift ()) sia sul kernel che sull'immagine. Buoni risultati (ish). (Le immagini sono nella mia /programming/7930803/inverse-filter-of-spatially-convolved-versus-frequency-convolved-image domanda.)

@ jason-r è probabilmente corretto. Non capisco la matematica della convoluzione sottostante + trasformazione. "Deconvoluzione" è stata una nuova parola per me. Ho ancora molto da imparare. Grazie per l'aiuto!

La mia soluzione per i compiti a casa è fare tutto nel dominio della frequenza. Ho parlato con il professore. Stavo rendendo l'incarico più difficile del necessario. Voleva che aggiungessimo rumore, quindi prova il filtro inverso, il filtro Wiener e il filtro dei minimi quadrati vincolati. Il punto dell'esercizio era vedere come i filtri gestivano il rumore.


1
Riempi il filtro di zeri per renderlo della stessa dimensione dell'immagine prima di prendere la sua FFT? Stai facendo correttamente la divisione complessa?
Dima,

Sì, imbottito il filtro con zeri, kernel in alto a sinistra. Tutto il mio codice Python / numpy si trova al suddetto link stackoverflow.com. La divisione complessa è probabilmente il mio problema.
David Poole,

Risposte:


8

Ci sono un paio di domande che affronterò separatamente:

  • La convoluzione nel dominio spaziale (o corrispondentemente nel dominio del tempo per segnali campionati nel tempo) equivale alla moltiplicazione nel dominio della frequenza. Nei sistemi campionati, ci sono alcune sottigliezze ai casi limite (cioè quando si usa il DFT, la moltiplicazione nel dominio della frequenza in realtà ti dà una convoluzione circolare, non una convoluzione lineare), ma in generale è davvero così semplice.

  • Il filtraggio inverso puro non è quasi mai la soluzione giusta in pratica. Nella maggior parte dei casi, non hai accesso al filtro esatto che è stato applicato ai tuoi dati, quindi non puoi semplicemente invertirli comunque. Anche se conosci il filtro, allora è ancora problematico. Considera il fatto che il filtro può avere zeri a determinate frequenze spaziali; in tal caso, dopo aver applicato il filtro all'immagine, tutte le informazioni a tali frequenze vengono perse. Se inverti ingenuamente quel filtro, avrà un guadagno infinito (o almeno molto alto) a quei valori nulli. Se poi applichi l'inverso ingenuo a un'immagine che ha un contenuto additivo a quelle frequenze (es. Rumore, che è probabile che sia il caso), allora quel componente non presidiato verrà notevolmente amplificato. Questo non è generalmente desiderabile.

    Questo problema di filtro inverso è molto simile all'equalizzazione nei sistemi di comunicazione, in cui questo fenomeno viene definito miglioramento del rumore . In tale contesto, l'approccio del filtro inverso viene indicato come un equalizzatore a forzatura zero , che raramente viene effettivamente utilizzato.

  • L'area che stai esplorando è conosciuta più in generale come deconvoluzione . Come regola generale, la deconvoluzione è un'operazione complicata. Anche se conosci il filtro esatto che è stato applicato e vuoi annullarlo, non è sempre così facile. Come hai notato, l'approccio del filtro inverso viene solitamente scartato a favore di un filtro Wiener o di qualche altra struttura che mira a non invertire esattamente il sistema, ma invece a stimare quale sia stato l'input al sistema minimizzando alcuni criteri di errore (minimizzando la media -squared error è un obiettivo comune). Come prevedibile, l'applicazione di un filtro Wiener a questo problema viene definita deconvoluzione di Wiener .


"Deconvoluzione" è stata una nuova parola per me. Ho ancora molto da imparare. Grazie!
David Poole,

@JasonR non dovremmo conoscere una sequenza di 'trainer' nell'immagine per la deconvoluzione di Wiener in modo che il criterio MMSE sia minimizzato rispetto a qualcosa che è noto per essere vero?
Spacey,

1
In generale, è necessario conoscere la densità spettrale di potenza del segnale e la funzione di trasferimento che è stata applicata al segnale per progettare il filtro Wiener. Tuttavia, nel probabile caso in cui non si conoscano tutte queste informazioni, è possibile formulare ipotesi mirate che producono una struttura funzionale più robusta del filtro inverso. Vedi questa sezione sulla pagina di Wikipedia per una discussione.
Jason R,

3

Spero che tu non abbia commesso errori nel modo in cui viene fatto il calcolo -

Convolgo l'immagine nel dominio spaziale con un filtro box 5x5. FFT il filtro, FFT l'immagine degradata, quindi divido l'immagine degradata per il filtro. Inverso FFT il risultato in un'immagine e ottengo immondizia.

Supponiamo che l'immagine abbia dimensioni 256x256 e che il filtro sia 5x5: per applicare il filtro moltiplicando gli FFT, devi prima convertire il filtro in dimensioni equivalenti. Per questo, devi mantenere il filtro box 5x5 nell'angolo "TOP" (non al centro dell'immagine) e riempirlo con gli zeri per riempire 256x256 - dovresti ottenere un FFT di 256x256 per il filtro.

Per aiutare a diagnosticare, nella fase di programmazione n. 1 - prima prendi solo il filtro 256x256 FFT da solo e controlla se la routine IFFT - è in grado di restituirti il ​​filtro. Allo stesso modo test se FFT -> IFFT dell'immagine stessa funziona correttamente all'indietro.

Passaggio 2: se si applica solo il filtro (e nessun filtro inverso) nel dominio FFT moltiplicando, controllare l'immagine risultante dopo che IFFT va bene. Dovrebbe essere sostanzialmente un'immagine sfocata.

Se tutta la tua programmazione è corretta, assicurati che quando esegui 1 / x per la coefficiente FFT non vi siano divisioni per zero errori, e viceversa quando c'è un picco eccessivo le moltiplicazioni si traducono in forti distorsioni.

In generale - per qualsiasi filtro stabile , il filtro inverso per definizione instabile - questo potrebbe essere il motivo principale. Tuttavia, vorrei sempre effettuare un controllo incrociato dell'implementazione prima di esplorare i limiti teorici.

Se fatto bene, ho visto la moltiplicazione in FFT è una convoluzione nello spazio di campionamento sia per le immagini che per i segnali audio.

Dipan.

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.