Data un'immagine con m , n numeri interi, l'interpolazione di quell'immagine in qualsiasi punto arbitrario m ′ , n ′ può essere scritta comeio( m , n )m , nm', n'
io~( m', n') = ∑m = ⌊ m'⌋ -w+1⌊ m'⌋ +sett Σn = ⌊ n'⌋ -w+1⌊ n'⌋ +settio( m , n ) f ( m'- m , n'- n )
Il risultato è ancora solo un'approssimazione della vera immagine continua sottostante I ( x , y ) e tutto ciò che fanno le diverse funzioni di interpolazione è minimizzare l'errore di approssimazione con vincoli e obiettivi diversi.io~io( x , y)
Nell'elaborazione del segnale, desideri che la funzione di interpolazione sia il filtro passa basso ideale. Tuttavia, la sua risposta in frequenza richiede un supporto infinito ed è utile solo per segnali bandlimited. La maggior parte delle immagini non ha limiti di banda e nell'elaborazione delle immagini ci sono altri fattori da considerare (come il modo in cui l'occhio interpreta le immagini. Ciò che è matematicamente ottimale potrebbe non essere visivamente accattivante). La scelta di una funzione di interpolazione, proprio come le funzioni della finestra , dipende molto dal problema specifico a portata di mano. Non ho sentito parlare di Connes, Welch e Parzen (forse sono specifici del dominio), ma gli altri dovrebbero essere gli equivalenti 2-D delle funzioni matematiche per una finestra 1-D fornita nel link Wikipedia sopra.f( m , n )
Proprio come con le funzioni della finestra per i segnali temporali, è facile avere un'idea di cosa fa un kernel di interpolazione di immagini osservando la sua risposta in frequenza. Dalla mia risposta sulle funzioni della finestra :
I due fattori principali che descrivono una funzione di finestra sono:
- Larghezza del lobo principale (cioè, a quale frequenza bin è la metà della potenza della risposta massima)
- Attenuazione dei lobi laterali (cioè, quanto distanti sono i lobi laterali dal lobo principale). Questo ti dice della perdita spettrale nella finestra.
Questo vale praticamente per i kernel di interpolazione. La scelta è fondamentalmente un compromesso tra il filtro di frequenza (attenuazione dei sidelobes), la localizzazione spaziale (larghezza del lobo principale) e la riduzione di altri effetti come lo squillo (effetto di Gibbs), l'aliasing, la sfocatura, ecc. Ad esempio, un kernel con oscillazioni come poiché il kernel sinc e il kernel Lanczos4 introdurranno il "ringing" nell'immagine, mentre un ricampionamento gaussiano non introdurrà il ringing.
Ecco un esempio semplificato in Mathematica che ti consente di vedere gli effetti di diverse funzioni di interpolazione:
true = ExampleData[{"TestImage", "Lena"}];
resampling = {"Nearest", "Bilinear", "Biquadratic", "Bicubic",
"Gaussian", "Lanczos", "Cosine", "Hamming", "Hann", "Blackman",
"Bartlett", "Connes", "Welch", "Parzen", "Kaiser"};
small = ImageResize[true, Scaled[1/4]];
true
io( x , y)small
io( m , n )io( m , n )io~( m', n')
Puoi vedere tu stesso che diverse funzioni di interpolazione hanno effetti diversi. Più vicino e pochi altri hanno caratteristiche molto grossolane e puoi essenzialmente vedere linee frastagliate (vedi immagine a dimensione intera, non la visualizzazione della griglia). Bicubic, biquadratic e Parzen lo superano ma introducono molte sfocature. Di tutti i kernel, Lanczos sembra (visivamente) essere il più accattivante e uno che fa il miglior lavoro del lotto.
Proverò ad ampliare questa risposta e fornirò esempi più intuitivi che dimostrano le differenze quando ho tempo. Potresti voler leggere questo articolo piuttosto semplice e informativo che ho trovato sul web (avviso PDF).