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.
- Distribuire un modello TFLite su GCP Serverless
- Interrogare un corpus di documenti in modalità GPT con Prompt Flow di Azure
- Una guida all’utilizzo delle funzioni di finestra
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.

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:


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

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

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:

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.