Trasformata di Fourier per serie temporali Informazioni sulla convoluzione delle immagini e SciPy

Trasf. Fourier per serie temp. Convoluzione immagini e SciPy

La convoluzione di Fourier si applica anche alle immagini

Questo post è il secondo della serie sulla convoluzione di Fourier per le serie temporali, controlla il primo qui:

Trasformata di Fourier per le serie temporali: spiegazione della convoluzione rapida con numpy

Convoluzione 10000 volte più veloce utilizzando la trasformata di Fourier

towardsdatascience.com

Riepilogo veloce del post precedente

Nel primo post, ho spiegato come la trasformata di Fourier possa essere utilizzata per convolvere segnali in modo molto efficiente. Ho mostrato che la convoluzione utilizzando la trasformata di Fourier in numpy è molto più veloce rispetto all’approccio algebrico standard e che corrisponde a un certo tipo di convoluzione chiamata convoluzione circolare.

In questo post, voglio sottolineare cosa significa la convoluzione circolare e come tutto ciò si applica alle immagini. Le immagini sono anche un buon modo per estendere l’intuizione a una dimensione in due dimensioni.

Tutte le immagini sono state create dall’autore.

Convoluzione dell’immagine con scipy

Se hai mai lavorato con immagini per l’elaborazione delle immagini, è molto probabile che tu abbia incontrato funzioni per applicare la convoluzione. La convoluzione delle immagini viene utilizzata ovunque: miglioramento delle immagini, riduzione del rumore, segmentazione, estrazione delle caratteristiche, compressione, ed è alla base delle reti neurali convoluzionali, lo standard di riferimento dei modelli di apprendimento profondo per l’elaborazione dei dati visivi.

In Python, la convoluzione delle immagini può essere fatta in modo piuttosto semplice utilizzando scipy e il suo sottopacchetto ndimage. A questo punto, ti consiglio di dare un’occhiata veloce alla documentazione della funzione `convolve` e poi tornare qui.

scipy.ndimage.convolve – Manuale di SciPy v1.11.1

Convoluzione multidimensionale. L’array viene convoluto con il kernel specificato. Parametri: l’array di input. Array di…

docs.scipy.org

L’uso è molto semplice: puoi passare due immagini per convolgerle insieme. Vediamo un esempio:

Nota che scipy propone diversi modi per gestire i confini utilizzando il parametro ‘mode’: come vedremo di seguito, la modalità ‘wrap’ corrisponde alla convoluzione circolare e quindi alla convoluzione utilizzando un approccio basato sulla trasformata di Fourier. Esistono anche altri approcci, come ‘reflect’ che riflette le immagini da dentro verso fuori, o ‘constant’ che ripete il valore più esterno. Nota anche come funziona ‘wrap’: ripete l’intero segnale, come se fosse periodico.

Convoluzione di immagini 2D

Iniziamo a scrivere il codice per vedere le differenze tra diversi modi di convoluzione.

Prima di tutto, creiamo una classe per rappresentare immagini periodiche 2D: ricorda dal post precedente che quando si utilizza lo strumento della trasformata di Fourier, i segnali sono considerati periodici. Questa classe è solo zucchero sintattico per rappresentare tali array periodici 2D.

Mostriamo l’immagine “base” nel rettangolo [0, V, 0, H], così come le sue prime 8 repliche intorno. Come indicato nel post precedente, il segnale viene considerato periodico, quindi con supporto infinito, ma abbiamo bisogno e utilizziamo solo un periodo.

Ora creiamo un’immagine di esempio con cui giocare: conterrà rumore casuale, un motivo sinusoidale, un motivo a pendenza e alcuni punti quadrati. Creiamo anche la versione periodica di questa immagine di esempio: rappresenta l’immagine periodica che la trasformata di Fourier considera quando applica i suoi operatori:

Ora creiamo un kernel da utilizzare per la convoluzione: utilizzeremo un semplice kernel costante, chiamato anche kernel di media dal momento che la convoluzione con questo kernel restituisce la media locale dell’immagine di input.

Successivamente iniziamo a giocare con la funzione di convoluzione di scipy e i suoi diversi modi per gestire i confini, e avvolgiamo il risultato come un array periodico per una facile visualizzazione: notare come il centro dell’immagine convoluta sia sempre lo stesso indipendentemente dalla modalità utilizzata, ma i confini variano.

Risultati di 4 diverse modalità per gestire i confini con la funzione di convoluzione di scipy. Ogni immagine di risultato viene visualizzata come un array periodico.

Ora possiamo utilizzare un approccio di trasformata di Fourier per calcolare la convoluzione: come mostrato nel post precedente, dobbiamo solo prendere la trasformata di Fourier inversa del prodotto della trasformata di Fourier di entrambi i segnali, l’immagine e il kernel:

Equazione di base per calcolare la convoluzione di 2 segnali utilizzando un approccio di trasformata di Fourier.
Risultato della convoluzione utilizzando un approccio di trasformata di Fourier, non scipy.

Confrontando il risultato con la modalità “wrap” di scipy, possiamo vedere che i risultati assomigliano molto, solo con uno spostamento leggero:

Confronto tra la convoluzione di scipy con la modalità 'wrap' e l'approccio di trasformata di Fourier. Sono quasi identici. Utilizzando la rappresentazione dell'array periodico, possiamo vedere che è solo una questione di spostamento.

Questo è solo una questione di indicizzazione e possiamo ottenere gli stessi risultati utilizzando un kernel centrato spostato:

Confronto tra la convoluzione con scipy modalità 'wrap' (sinistra) e 2 approcci di trasformata di Fourier: con il kernel allargato sui lati (centro) e kernel centrato (destra). L'immagine di sinistra e di destra sono identiche.

Utilizzando un corretto centratura, abbiamo ottenuto risultati identici tra la convoluzione di scipy con modalità ‘wrap’ e l’approccio di trasformata di Fourier.

Per curiosità, vediamo quale approccio è più veloce:

Confronto temporale tra scipy e la trasformata di Fourier per calcolare la convoluzione tra le nostre 2 immagini: la trasformata di Fourier è circa 15 volte più veloce di scipy.

Anche in questo caso, l’approccio della trasformata di Fourier è stato più veloce e in questo caso più veloce di una funzione scipy, il che è bello.

Conclusione

In questo post abbiamo visto come la convoluzione circolare si traduce nelle immagini e come sia equivalente alla funzione di convoluzione di scipy utilizzando la modalità ‘wrap’.

Nel prossimo post, approfondiremo l’uso delle funzioni di finestra nel contesto della trasformata di Fourier per ridurre la perdita spettrale e migliorare l’analisi spettrale.

Iscriviti per ricevere futuri articoli sulla trasformata di Fourier direttamente nel tuo feed!

Inoltre, dai un’occhiata ai miei altri articoli e se ti piace qualcuno di essi, per favore iscriviti. Mi aiuta molto a raggiungere il mio obiettivo di 100 iscritti:

Trasformata di Fourier per serie temporali: convoluzione veloce spiegata con numpy

Convoluzione 10000 volte più veloce usando la trasformata di Fourier

towardsdatascience.com

PCA/LDA/ICA: confronto degli algoritmi di analisi dei componenti

Rivedi i concetti e le differenze tra questi famosi algoritmi.

towardsdatascience.com

PCA-whitening vs ZCA-whitening: un’immagine numpy 2D

Il processo di sbiancamento dei dati consiste in una trasformazione tale che i dati trasformati abbiano una matrice identità…

towardsdatascience.com

Risoluzione 300 volte più veloce del metodo delle differenze finite usando numpy

Il metodo delle differenze finite è una tecnica potente per risolvere problemi complessi e numpy lo rende veloce!

towardsdatascience.com

Grafici interattivi del noto circuito RC in Jupyter

Un altro passo verso ipywidgets e matplotlib

towardsdatascience.com

Involucro degli array di numpy

L’approccio del contenitore.

towardsdatascience.com

Se questi articoli ti sembrano interessanti, ricorda di seguirmi, i nuovi articoli appariranno nel tuo feed.