Parte I — Fondamenti: acquisizione e immagini · Capitolo 2

Immagini digitali, colore e filtraggio

~45 min di lettura5 widget interattivi4 tavole

In questo capitolo

  1. L'immagine come funzione
  2. Campionamento e quantizzazione
  3. Il colore: sintesi additiva e sottrattiva
  4. Spazi colore: RGB, HSV/HSL, YCbCr
  5. Trasformazioni e filtraggio digitale
  6. Cross-correlation e convoluzione
  7. Filtri lineari: esempi ed effetti
  8. Estrazione di edge e gradiente
  9. Operatori di gradiente: Roberts, Prewitt, Sobel
  10. Filtraggio nel dominio di Fourier
  11. Verifica le tue conoscenze

1. L'immagine come funzione

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) ]ᵀ
Idea chiave

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.

2. Campionamento e quantizzazione

Un'immagine digitale di dimensioni w × h è un segnale discreto (un insieme finito di valori), ottenuto attraverso due processi distinti:

ProcessoDefinizioneAgisce 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)
QuantizzazioneApprossimazione 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.

segnale continuo campionamento quantizzazione (4 livelli) 1 2 3 2 3 2 1 2 3 2 campioni sul dominio f(x)
Tavola 2.1 — I due passaggi che rendono digitale un'immagine: il campionamento discretizza il dominio (dove misuro), la quantizzazione discretizza il codominio (con quanta finezza misuro). Ridurre i campioni produce blocchi; ridurre i livelli produce banding.

Campionamento e quantizzazione a confronto

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.

3. Il colore: sintesi additiva e sottrattiva

Sintesi additiva (RGB)

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.

Sintesi sottrattiva (CMY)

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).

4. Spazi colore: RGB, HSV/HSL, YCbCr

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.

Le formule di conversione

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.

Convertitore RGB → HSV / HSL / YCbCr

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).

colore

5. Trasformazioni e filtraggio digitale

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.

Il principio del filtraggio

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.

Nota del redattore

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.

6. Cross-correlation e convoluzione

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 ⎦
Attenzione

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.

Esempio numerico svolto a mano

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.

f (immagine) 00000 09090900 09090900 09090900 00000 h = (1/9)·ones(3,3) 111 111 111 g = h ∗ f 01020100 1040604010 2060906020 1040604010 01020100 g(1,1) = (0+0+0 + 0+90+90 + 0+90+90) / 9 = 360/9 = 40 bordi calcolati con padding a zero
Tavola 2.2 — La convoluzione pixel per pixel. Il riquadro vermiglio è l'intorno 3×3 correntemente coperto dal kernel; il valore prodotto finisce nel pixel evidenziato dell'immagine di uscita. Il quadrato di 90 sopravvive al centro (90) e sfuma su bordi (60) e angoli (40).

7. Filtri lineari: esempi ed effetti

Gli esempi canonici visti a lezione (fonte: D. Lowe) mostrano quattro kernel e i loro effetti:

KernelEffettoPerché
[[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 kernel gaussiano

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.

Applica un kernel a una griglia

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.

f — input
h — kernel
g — output (clicca)
Clicca una cella dell'uscita per vedere il calcolo.

8. Estrazione di edge e gradiente

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.

intensità osservata lungo la linea — f(x) derivata prima — ∂f/∂x max min max x
Tavola 2.3 — Un edge è una discontinuità di intensità. Derivando il profilo, ogni gradino diventa un picco: rilevare gli edge significa cercare gli estremi della derivata prima (o gli zeri della derivata seconda, come nel Laplaciano del capitolo 6).

Differenziare un'immagine discreta

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) )

9. Operatori di gradiente: Roberts, Prewitt, Sobel

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.

Per l'esame

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.

10. Filtraggio nel dominio di Fourier

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.

g(t) = sin(2πft) + (1/3)·sin(2π·3f·t) spettro f 3f maschere nel dominio delle frequenze (u, v) passa basso passa alto passa banda angolare
Tavola 2.4 — In alto: due sinusoidi (blu e grigio) e la loro somma (nero), con lo spettro a due righe. In basso: le maschere di filtro nel piano delle frequenze; il bianco lascia passare, il nero blocca. Il filtro angolare seleziona orientazioni anziché frequenze.

La trasformata di Fourier

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.

La procedura di filtraggio in frequenza

Il filtraggio dell'immagine nel dominio delle frequenze viene normalmente eseguito in 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/attenuazione di determinate orientazioni).
  3. Eseguire la InvFFT per tornare nel dominio spaziale.

Il filtro di Butterworth

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.

Il filtro angolare passa banda

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
Idea chiave

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.

Verifica le tue conoscenze

Qual è la differenza tra campionamento e quantizzazione?

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.

Scrivete le formule di cross-correlation e convoluzione e dite quando differiscono.

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°.

Applicate a mano un filtro medio 3×3 al centro e all'angolo di un quadrato di intensità 90.

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.

Come si costruisce un filtro di sharpening a partire dal filtro medio?

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.

Che cos'è un edge e come si rileva?

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).

Definite gradiente, magnitudo e direzione dell'edge.

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.

Confrontate Roberts, Prewitt e Sobel.

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é il kernel gaussiano è preferibile al filtro medio per lo smoothing?

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é F(ω) è una funzione a valori complessi?

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.

Descrivete la procedura di filtraggio nel dominio delle frequenze.

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.

Che cos'è il filtro di Butterworth e perché si preferisce a un passa basso ideale?

È 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.

Come si rimuovono da un'immagine dettagli con una specifica orientazione?

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(θ)).