Il modo più produttivo di pensare a un'immagine, per tutto il resto del corso, è vederla come una funzione:
f : R² → R f(x, y) = intensità nel punto (x, y)
Tipicamente l'immagine sarà definita solo in una regione limitata e con valori limitati:
f : [a, b] × [c, d] → [0, 1] (oppure [0, 255])
Un'immagine a colori è semplicemente la composizione di tre funzioni, ciascuna riferita a uno specifico canale:
f(x, y) = [ r(x, y), g(x, y), b(x, y) ]ᵀ
Se un'immagine è una funzione, allora tutto ciò che sappiamo fare con le funzioni si applica alle immagini: sommare una costante (g = f + 20, schiarire), riflettere il dominio (g(x,y) = f(-x, y), specchiare), derivare (estrarre edge), trasformare secondo Fourier (filtrare in frequenza). Il filtraggio digitale è solo un'operazione fra le tante — ma è quella che permette sharpening, blurring ed edge extraction, cioè il grosso del pre-processing.
Un'immagine digitale di dimensioni w × h è un segnale discreto (un insieme finito di valori), ottenuto attraverso due processi distinti:
| Processo | Definizione | Agisce su |
|---|---|---|
| Campionamento (sampling) | Acquisizione di campioni del segnale analogico sorgente a intervalli generalmente uniformi: una griglia con w × h celle. | Il dominio (le coordinate spaziali) |
| Quantizzazione | Approssimazione di ciascun campione con uno dei valori appartenenti a un range predefinito e finito. | Il codominio (i valori di intensità) |
Il risultato è rappresentabile come una matrice con w colonne e h righe; ciascun elemento è un pixel (picture element). L'origine (0,0) è convenzionalmente in alto a sinistra. Gli stessi valori possono essere codificati nel range [0, 255] (interi a 8 bit) oppure normalizzati in [0, 1]: sono due rappresentazioni della stessa matrice.
Il segnale grigio è quello continuo; le barre sono il segnale digitalizzato. Muovi i due cursori separatamente e osserva che degradano l'immagine in modo qualitativamente diverso.
I colori fondamentali per la sintesi additiva sono i tre a cui sono sensibili i coni dell'occhio umano: rosso, verde, blu (Red-Green-Blue, RGB). I colori misti sono visti come somma delle loro componenti RGB. È la sintesi usata dall'occhio umano e da molti dispositivi che lo imitano (fotocamere digitali, telecamere, monitor), che sintetizzano i colori affiancando punti colorati diversamente. Il primo dispositivo per la sintesi additiva è stato il disco di Newton, sul quale sono disegnati settori circolari di colori vari: facendo ruotare velocemente il disco i colori vengono mescolati e si ottiene il bianco.
I tre colori fondamentali in sottrattivo sono i complementari dei tre additivi: il giallo complementare del blu, il magenta complementare del verde, il ciano complementare del rosso (Cyan, Magenta, Yellow). L'esempio più semplice è la sovrapposizione di filtri colorati: il colore che giunge all'occhio è quello che riesce a passare per tutti i filtri, e ogni filtro sottrae una parte della luce che lo attraversa. Altri esempi: la mescolanza di colori in pittura (ogni colore è un filtro colorato) e le pellicole fotografiche e cinematografiche a colori, ricoperte di tre strati sovrapposti (giallo, magenta, ciano).
Uno spazio colore è un modello multidimensionale utilizzato per la rappresentazione dei colori; i diversi spazi differiscono per la scelta degli assi. Gli aspetti fondamentali per descrivere un colore sono tre:
È lo spazio più semplice. È però poco adatto per raggruppare spazialmente colori simili dal punto di vista della percezione umana: due colori percettivamente vicini possono essere lontani nel cubo RGB e viceversa. È il motivo per cui, nel capitolo 3, la segmentazione del volto in RGB funziona peggio che in HSI.
HSV e HSL codificano direttamente le principali caratteristiche del colore: tinta (Hue), saturazione e luminosità. Sono più adatti per l'individuazione di pattern di interesse con specifiche caratteristiche cromatiche.
Lo spazio HSV è un cilindro in cui l'asse verticale rappresenta V (Value). Il modello rappresenta il modo in cui si mescolano i colori: H ∈ [0°, 360°) è la tinta, S ∈ [0,1] le diverse sfumature di uno stesso colore brillante, V ∈ [0,1] la presenza in un colore di bianco/nero. I colori completamente saturi sono quelli rappresentati nel cerchio con S = 1 e V = 1.
Nello spazio HSL la dimensione verticale codifica L (Lightness, intesa normalmente come media dei colori): variando S ci si muove sempre da un tono di grigio a un colore saturo (con L = 1/2 si hanno i colori completamente saturi), variando L ci si sposta dal nero al bianco. Spesso, invece del modello cilindrico, si adotta quello conico, che usa il valore di chroma al posto della saturazione.
Lo spazio YCbCr codifica il colore con tre componenti: Luma (Y), che rappresenta la luminosità, e Cb, Cr, le due componenti cromatiche dette blue-difference e red-difference. La codifica è stata proposta in relazione alla trasmissione digitale di immagini (nel mondo analogico si chiama YUV) per tre motivi: lo spazio RGB è poco efficiente perché contiene un elevato grado di ridondanza; l'occhio umano è più sensibile a cambiamenti di luminosità che di cromaticità; per ridurre la quantità di informazioni trasmesse, il canale Y viene codificato a risoluzione maggiore.
Partendo da valori R, G, B ∈ [0,1], con MAX = max(R,G,B) e MIN = min(R,G,B):
⎧ 0° se MAX = MIN (R = G = B)
⎪ 60° · (0 + (G − B)/(MAX − MIN)) se MAX = R
H := ⎨ 60° · (2 + (B − R)/(MAX − MIN)) se MAX = G
⎩ 60° · (4 + (R − G)/(MAX − MIN)) se MAX = B
se H < 0° allora H := H + 360°
⎧ 0 se MAX = 0 (R = G = B = 0)
S_HSV := ⎨ (MAX − MIN)/MAX altrimenti
⎧ 0 se MAX = 0
S_HSL := ⎨ 0 se MIN = 1
⎩ (MAX − MIN)/(1 − |MAX + MIN − 1|) altrimenti
V := MAX L := (MAX + MIN)/2
Per YCbCr, i segnali prima della digitalizzazione si chiamano Y'PbPr e sono creati dai primari RGB corretti in gamma usando due costanti Kb e Kr:
Y' = Kr · R' + (1 − Kr − Kb) · G' + Kb · B' R', G', B' ∈ [0; 1], Y' ∈ [0; 1]
Pb = 0.5 · (B' − Y') / (1 − Kb) Pb, Pr ∈ [−0.5; 0.5]
Pr = 0.5 · (R' − Y') / (1 − Kr)
Direttamente da RGB a YCbCr:
Y = 0.299·(R − G) + G + 0.114·(B − G)
Cb = 0.564 · (B − Y)
Cr = 0.713 · (R − Y)
Sono disponibili codifiche diverse, che differiscono per piccole variazioni nei coefficienti utilizzati.
Le formule qui sopra, applicate dal vivo. Prova il caso limite R = G = B (H indefinito, posto a 0 e S = 0) e i colori puri (S = 1).
Le immagini digitali possono essere affette da diverse problematiche: sfocatura, rumore, basso contrasto, aliasing. È possibile migliorarle e/o evidenziarne particolari caratteristiche (per esempio gli edge) applicando trasformazioni ai pixel dell'immagine stessa.
Come per qualsiasi altra funzione, è possibile applicare a un'immagine operatori che realizzino trasformazioni: g(x,y) = f(x,y) + 20 aumenta la luminosità, g(x,y) = f(−x, y) specchia orizzontalmente. Tra tutte le trasformazioni possibili riveste particolare importanza l'operazione di convoluzione con filtri digitali, perché permette di realizzare numerose operazioni interessanti: sharpening, blurring, edge extraction e altre.
Applicare un filtro digitale significa modificare il valore di ciascun pixel dell'immagine sostituendolo con un valore calcolato a partire dai valori dei pixel dell'intorno. Una trasformazione molto semplice sostituisce il valore di ciascun pixel con una combinazione lineare dei suoi vicini: è il filtraggio lineare, cioè la convoluzione.
La modalità usata per combinare i pixel — cioè i pesi della combinazione lineare — determina il kernel (detto anche maschera o filtro). Kernel diversi producono effetti diversi sull'immagine: è tutto qui il gioco.
Vale la pena fissare subito la terminologia, perché ritorna identica nel capitolo 9 con le CNN: lì il "kernel" è esattamente lo stesso oggetto, con la differenza che i pesi non sono scelti dal progettista ma appresi durante l'addestramento. Chi ha capito bene la convoluzione qui, nel capitolo 9 deve imparare solo l'ottimizzazione.
Siano f un'immagine digitale e h un kernel di dimensioni (2k+1) × (2k+1). Il risultato dell'operazione di cross-correlation g = h ⊗ f è dato da:
k k
g(x, y) = Σ Σ h(u, v) · f(x + u, y + v)
u=−k v=−k
Se il kernel viene capovolto orizzontalmente e verticalmente si ha l'operazione di convoluzione g = h ∗ f:
k k
g(x, y) = Σ Σ h(u, v) · f(x − u, y − v)
u=−k v=−k
Il modo più chiaro per vedere la differenza è applicare le due operazioni a un'impulso, cioè a un'immagine tutta nulla con un solo 1 al centro. Se il kernel è
h = ⎡ a b c ⎤
⎢ d e f ⎥
⎣ g h i ⎦
la cross-correlation con l'impulso restituisce il kernel identico, mentre la convoluzione restituisce il kernel ruotato di 180°:
⎡ i h g ⎤
⎢ f e d ⎥
⎣ c b a ⎦
Per i kernel simmetrici (media, gaussiano, laplaciano) le due operazioni coincidono e la distinzione è irrilevante nella pratica. Diventa invece cruciale per i kernel asimmetrici: shift, Sobel, Prewitt. Un segno invertito nel gradiente si traduce in edge "al contrario". Nel widget qui sotto potete attivare e disattivare il ribaltamento e vedere l'effetto sui filtri asimmetrici.
Prendiamo un'immagine 5×5 con un quadrato di intensità 90 su fondo 0, e applichiamo il filtro medio (box filter) 3×3 con kernel (1/9)·[[1,1,1],[1,1,1],[1,1,1]]. Il kernel è simmetrico, quindi convoluzione e correlazione coincidono.
f = ⎡ 0 0 0 0 0 ⎤ h = (1/9) ⎡ 1 1 1 ⎤
⎢ 0 90 90 90 0 ⎥ ⎢ 1 1 1 ⎥
⎢ 0 90 90 90 0 ⎥ ⎣ 1 1 1 ⎦
⎢ 0 90 90 90 0 ⎥
⎣ 0 0 0 0 0 ⎦
Calcoliamo tre pixel di uscita (indicizzando righe e colonne da 0):
g(1,1) = (0 + 0 + 0 + 0 + 90 + 90 + 0 + 90 + 90) / 9 = 360/9 = 40
g(1,2) = (0 + 0 + 0 + 90 + 90 + 90 + 90 + 90 + 90) / 9 = 540/9 = 60
g(2,2) = (90 · 9) / 9 = 810/9 = 90
Il risultato è leggibile: al centro del quadrato il valore resta 90 (l'intorno è tutto pieno), sui bordi scende a 60, sugli angoli a 40. Il filtro medio non "cancella" il quadrato: ne sfuma i bordi distribuendo l'intensità su una fascia larga quanto il kernel. Ecco perché si chiama blur.
Gli esempi canonici visti a lezione (fonte: D. Lowe) mostrano quattro kernel e i loro effetti:
| Kernel | Effetto | Perché |
|---|---|---|
[[0,0,0],[0,1,0],[0,0,0]] |
Immagine identica | Ogni pixel viene sostituito con se stesso: è l'impulso unitario. |
[[0,0,0],[1,0,0],[0,0,0]] |
Shift a sinistra di 1 px | Il peso unitario è spostato a sinistra del centro: per effetto del ribaltamento della convoluzione, ogni pixel prende il valore del vicino di destra. |
(1/9)·[[1,1,1],[1,1,1],[1,1,1]] |
Blur (filtro medio) | Media sull'intorno: attenua le alte frequenze, quindi rumore e dettagli. |
[[0,0,0],[0,2,0],[0,0,0]] − (1/9)·[[1,1,1],[1,1,1],[1,1,1]] |
Sharpening | Due volte l'immagine originale meno la sua versione sfocata: si esaltano le componenti ad alta frequenza, cioè i dettagli. |
Lo sharpening è la formulazione classica dell'unsharp masking: 2·f − blur(f) = f + (f − blur(f)), cioè l'immagine più il suo "dettaglio" (la differenza tra l'originale e la versione sfocata).
Il filtro di smoothing più importante non è la media ma la gaussiana:
g_σ(x, y) = 1/(2πσ²) · exp( −(x² + y²) / (2σ²) )
Il parametro σ controlla il raggio di azione: con σ = 1 pixel l'effetto è appena percettibile, con σ = 5, 10, 30 pixel l'immagine diventa progressivamente irriconoscibile. La gaussiana pesa i vicini in modo decrescente con la distanza — a differenza della media, che li pesa tutti uguali — e per questo produce uno sfocamento privo di artefatti squadrati. Nel capitolo 6 vedremo che il kernel gaussiano è anche separabile (un filtraggio 2D si può sostituire con due filtraggi 1D, più efficienti) ed è la base dello scale space.
Scegli un'immagine di prova e un kernel, poi clicca una cella dell'uscita per vedere il calcolo che l'ha prodotta e l'intorno usato (in blu sull'immagine di input). Il selettore convoluzione/correlazione mostra concretamente l'effetto del ribaltamento.
Molte tecniche di estrazione di feature si basano sulla codifica di informazioni relative agli edge (bordi) presenti nell'immagine. Un edge è una zona dell'immagine caratterizzata da una repentina variazione dell'intensità.
Osservando l'intensità lungo una linea che attraversa un bordo, si vede un gradino; la sua derivata prima presenta in quel punto un massimo o un minimo. Gli edge corrispondono ai punti estremi (massimi e minimi) della derivata prima.
Il problema pratico è: come si deriva una funzione definita su una griglia di interi? Con le differenze finite:
∂f/∂x (x, y) ≈ f(x + 1, y) − f(x, y)
∂f/∂y (x, y) ≈ f(x, y + 1) − f(x, y)
Il gradiente dell'immagine è il vettore delle due derivate parziali:
∇f = [ ∂f/∂x , ∂f/∂y ]
Il gradiente indica la direzione di massima variazione di intensità. Casi notevoli: se ∇f = [∂f/∂x, 0] la variazione è puramente orizzontale; se ∇f = [0, ∂f/∂y] puramente verticale; nel caso generale entrambe le componenti sono non nulle e il gradiente punta in diagonale.
Le due grandezze derivate che useremo continuamente (nei descrittori SIFT, in HOG, nell'Harris corner detector) sono:
intensità dell'edge ‖∇f‖ = sqrt( (∂f/∂x)² + (∂f/∂y)² ) magnitudo
direzione dell'edge θ = tan⁻¹( (∂f/∂y) / (∂f/∂x) )
Le differenze finite pure sono estremamente sensibili al rumore: un singolo pixel sporco produce un picco di gradiente. Gli operatori classici combinano quindi differenziazione in una direzione e smoothing nella direzione ortogonale.
Misura il gradiente lungo assi ruotati di 45° ed è molto sensibile al rumore (le maschere sono 2×2, quindi non c'è alcuno smoothing).
∇x = ⎡ 1 0 ⎤ ∇y = ⎡ 0 1 ⎤
⎣ 0 −1 ⎦ ⎣ −1 0 ⎦
Filtro 3×3 meno sensibile a variazioni di luce e rumore: calcola il gradiente lungo una direzione e opera uno smoothing nella direzione ortogonale. Il fattore di normalizzazione è 1/3.
∇x = (1/3) ⎡ 1 0 −1 ⎤ ∇y = (1/3) ⎡ 1 1 1 ⎤
⎢ 1 0 −1 ⎥ ⎢ 0 0 0 ⎥
⎣ 1 0 −1 ⎦ ⎣ −1 −1 −1 ⎦
Come Prewitt, ma attribuisce peso maggiore al pixel centrale della riga/colonna di smoothing. Il fattore di normalizzazione è 1/8.
∇x = (1/8) ⎡ 1 0 −1 ⎤ ∇y = (1/8) ⎡ 1 2 1 ⎤
⎢ 2 0 −2 ⎥ ⎢ 0 0 0 ⎥
⎣ 1 0 −1 ⎦ ⎣ −1 −2 −1 ⎦
Applicando i tre operatori alla stessa immagine si ottengono mappe ∇x, ∇y e ‖∇f‖ qualitativamente simili ma via via più pulite passando da Roberts a Sobel. Metodi più complessi sono in grado di produrre edge maggiormente connessi: il riferimento classico è il Canny edge detector, che nel capitolo 7 ritroveremo come pre-processing della trasformata di Hough.
La domanda tipica è "differenza tra Prewitt e Sobel". Risposta: stessa struttura (differenza lungo una direzione, smoothing nell'ortogonale), ma Sobel dà peso doppio al pixel centrale nella direzione di smoothing, cioè usa una media pesata invece di una media uniforme; è quindi leggermente più robusto al rumore. Roberts è 2×2, opera a 45° ed è il più sensibile al rumore.
La teoria di Fourier ci insegna che ogni segnale può essere scomposto in una serie (eventualmente infinita) di funzioni seno e coseno di varie frequenze. Questo tipo di rappresentazione consente di valutare la velocità di cambiamento del segnale (dell'immagine) in diverse direzioni.
La componente elementare è A · sin(ωx + φ), con A ampiezza, ω frequenza, φ fase; il segnale target è la somma f_target = f₁ + f₂ + ... + fₙ + .... L'esempio visto a lezione è l'onda quadra approssimata da g(t) = sin(2πft) + (1/3)·sin(2π(3f)t), con spettro composto dalle due righe a f e 3f; proseguendo la serie A · Σ (1/k)·sin(2πkt) si ricostruisce l'onda quadra.
Nell'analisi di Fourier un segnale viene rappresentato in relazione alle frequenze che lo caratterizzano e non in termini spaziali (o temporali). Per ogni valore di ω dobbiamo rappresentare il corrispondente valore di magnitudo (A) e fase (φ): ne segue che F(ω) è una funzione a valori complessi.
F(ω) = R(ω) + i·I(ω)
A = ± sqrt( R(ω)² + I(ω)² ) magnitudo
φ = tan⁻¹( I(ω) / R(ω) ) fase
La parte reale è legata alle funzioni pari, la parte immaginaria alle funzioni dispari. Le definizioni per il caso continuo 1D:
F(u) = ∫ f(x) · e^(−i2πux) dx (da −∞ a +∞)
f(x) = ∫ F(u) · e^(+i2πux) du (trasformata inversa)
con e^(ik) = cos k + i·sin k e i = sqrt(−1)
Le immagini sono segnali 2D discreti, quindi si adotta la 2D discrete Fourier Transform. Per un'immagine N × N:
N−1 N−1
F(kx, ky) = (1/N) Σ Σ f(x, y) · e^( −i·2π(kx·x + ky·y)/N )
x=0 y=0
dove kx e ky rappresentano i valori discreti di frequenza.
Il filtraggio dell'immagine nel dominio delle frequenze viene normalmente eseguito in tre passi:
Un filtro passa basso ideale (uno scalino netto nel dominio delle frequenze) introduce artefatti. Il filtro di Butterworth è un filtro passa basso radiale nel quale la riduzione delle alte frequenze avviene gradualmente e non con un brusco scalino:
H(ω) = 1 / [ 1 + (ω/ω_c)² ]ⁿ
ω_c = frequenza di taglio n = ordine del filtro
Il complementare 1 − H(ω) è un filtro passa alto. L'esempio applicativo mostrato a lezione è la riduzione del rumore con ω_c = 0.2 e n = 1.
Un filtro passa banda angolare consente di preservare o rimuovere dall'immagine dettagli caratterizzati da ben definite orientazioni:
⎧ cos²( π(θ − θ_c) / (2·ΔBW) ) se |θ − θ_c| ≤ ΔBW
H(θ) = ⎨
⎩ 0 altrimenti
Anche qui, 1 − H(θ) è un filtro elimina banda. L'esempio visto a lezione è la rimozione di righe verticali da un'immagine, con θ_c = π/2 e ΔBW = π/2, usando il filtro elimina banda. Un filtro composito combina le due famiglie:
H(ω, θ) = max( H(ω), H(θ) )
con H(ω) filtro di Butterworth e H(θ) filtro passa banda angolare
parametri dell'esempio: ω_c = 0.15 ; n = 3 ; θ_c = π/2 ; ΔBW = π/2
Filtrare nello spazio (convoluzione con un kernel) e filtrare in frequenza (moltiplicare lo spettro per una maschera) sono la stessa operazione vista da due lati. La scelta è pragmatica: un kernel piccolo conviene nello spazio; una selezione fine di frequenze o di orientazioni — come rimuovere solo le righe verticali di una scansione — è molto più naturale in frequenza.
Il campionamento discretizza il dominio: acquisisce campioni del segnale analogico a intervalli generalmente uniformi, producendo una griglia di w × h celle. La quantizzazione discretizza il codominio: approssima ciascun campione con uno dei valori di un range finito predefinito (es. 256 livelli). Insieme trasformano f: R² → R in una matrice di pixel.
Cross-correlation: g(x,y) = ΣΣ h(u,v)·f(x+u, y+v). Convoluzione: g(x,y) = ΣΣ h(u,v)·f(x−u, y−v), cioè con il kernel capovolto orizzontalmente e verticalmente. Coincidono per kernel simmetrici (media, gaussiano, laplaciano); differiscono per kernel asimmetrici (shift, Sobel, Prewitt), dove il ribaltamento cambia il segno o la direzione del risultato. Applicando le due operazioni a un impulso, la correlazione restituisce il kernel identico, la convoluzione il kernel ruotato di 180°.
Con il quadrato 3×3 di valore 90 su fondo 0: al centro l'intorno è tutto pieno, quindi g = (90·9)/9 = 90; sul bordo l'intorno contiene 6 pixel a 90, quindi g = 540/9 = 60; all'angolo contiene 4 pixel a 90, quindi g = 360/9 = 40. Il filtro medio non cancella la figura: ne sfuma i bordi su una fascia larga quanto il kernel.
Sottraendo la versione sfocata da due volte l'immagine originale: [[0,0,0],[0,2,0],[0,0,0]] − (1/9)·ones(3,3). Equivale a f + (f − blur(f)): si somma all'immagine il suo "dettaglio", cioè le componenti ad alta frequenza che il blur aveva rimosso.
Un edge è una zona dell'immagine caratterizzata da una repentina variazione dell'intensità. Osservando il profilo di intensità lungo una linea, gli edge corrispondono ai punti estremi (massimi e minimi) della derivata prima. Su immagini discrete si deriva con differenze finite: ∂f/∂x ≈ f(x+1,y) − f(x,y).
Il gradiente è ∇f = [∂f/∂x, ∂f/∂y] e indica la direzione di massima variazione di intensità. L'intensità dell'edge è la magnitudo ‖∇f‖ = sqrt((∂f/∂x)² + (∂f/∂y)²); la direzione è θ = tan⁻¹((∂f/∂y)/(∂f/∂x)). Sono le due grandezze su cui si costruiscono SIFT, HOG e l'Harris corner detector.
Roberts: maschere 2×2, misura il gradiente lungo assi ruotati di 45°, molto sensibile al rumore. Prewitt: 3×3 con fattore 1/3, calcola il gradiente lungo una direzione e opera smoothing nella direzione ortogonale, meno sensibile a variazioni di luce e rumore. Sobel: 3×3 con fattore 1/8, come Prewitt ma con peso maggiore al pixel centrale. Per edge più connessi servono metodi più complessi, come il Canny edge detector.
Perché pesa i vicini in modo decrescente con la distanza, secondo g_σ(x,y) = 1/(2πσ²)·exp(−(x²+y²)/(2σ²)), mentre la media li pesa tutti uguali. Il parametro σ controlla direttamente il raggio d'azione (σ = 1, 5, 10, 30 pixel producono sfocature progressivamente più forti) ed è il parametro che genera lo scale space del capitolo 6.
Perché per ogni frequenza ω occorre rappresentare due grandezze: la magnitudo A = ±sqrt(R(ω)² + I(ω)²) e la fase φ = tan⁻¹(I(ω)/R(ω)). Si scrive F(ω) = R(ω) + i·I(ω); la parte reale è legata alle funzioni pari, quella immaginaria alle dispari.
Tre passi: 1) eseguire la FFT dell'immagine e calcolare spettro e fase; 2) modificare lo spettro (passa basso, passa alto, passa banda) e/o la fase (potenziamento o attenuazione di determinate orientazioni); 3) eseguire la InvFFT per tornare nel dominio spaziale.
È un filtro passa basso radiale definito da H(ω) = 1 / [1 + (ω/ω_c)²]ⁿ, con ω_c frequenza di taglio e n ordine del filtro. La riduzione delle alte frequenze avviene gradualmente e non con un brusco scalino, evitando gli artefatti del taglio ideale. Il complementare 1 − H(ω) è un passa alto. Esempio applicativo visto a lezione: riduzione del rumore con ω_c = 0.2 e n = 1.
Con un filtro angolare: H(θ) = cos²(π(θ − θ_c)/(2·ΔBW)) se |θ − θ_c| ≤ ΔBW, altrimenti 0. Il complementare 1 − H(θ) è un elimina banda: nell'esempio delle righe verticali si usa quest'ultimo con θ_c = π/2 e ΔBW = π/2. Un filtro composito combina frequenza e orientazione: H(ω,θ) = max(H(ω), H(θ)).