next up previous
Next: Zig-zag scan Up: Codifica Previous: Trasformata Coseno Discreta

Quantizzazione

La quantizzazione è un processo per ridurre la precisione dei coefficienti della DCT, al fine di ottenere un minore bitrate senza un apprezzabile decadimento della qualità dell'immagine.

Fondamentalmente, si tratta di dividere ogni valore per una costante intera; il risultato è un numero intero più una frazione che può essere approssimata in due modi diversi: in caso di codifica intra, l'arrotondamento è all'intero più vicino (all'intero superiore nel caso di valori esattamente uguali a 0.5), mentre in caso di codifica inter, l'arrotondamento è sempre all'intero inferiore.

Dato che i blocchi intra-codificati contengono energia in tutte le frequenze possibili, non possono subire una quantizzazione eccessiva, pena un effetto di ``blocchettizzazione'' dell'immagine che sarebbe rilevato dall'utente. Al contrario, i blocchi di tipo non-intra contengono prevalentemente energia ad alta frequenza, e quindi possono essere maggiormente quantizzati senza che l'utente possa accorgersene. Si suppone che il processo di codifica dia una predizione accurata delle basse frequenze, cosicchè il segnale di errore, contenuto nei blocchi non-intra, sia sufficientemente piccolo. Se non è questo il caso, la codifica intra deve essere preferita a quella non-intra, e si ricade nel caso precedente.

Questa differenza fra i due tipi di blocchi si traduce in un diverso comportamento del quantizzatore nell'intorno dello zero: il quantizzatore per i blocchi intracodificati non ha una ``dead-zone'', che invece ha l'altro quantizzatore.

Ulteriori regole di ``oddification'' sono utilizzate per fare in modo che i coefficienti abbiano tutti un valore dispari: il perché di questo verrà spiegato in seguito.

Figura: Caratteristiche dei quantizzatori per macroblocchi non-intra (a sinistra) e intra (a destra).

Nel caso di codifica intra, la quantizzazione per il coefficiente DC è sempre 8, mentre i valori di quantizzazione per i coefficienti AC sono variabili, e devono essere organizzati in tabelle, chiamate ``matrici di quantizzazione'', da inviare nel bitstream. La scelta di questi valori non è banale, e dev'essere fatta in accordo alle funzioni di base della DCT, e considerando che la sensibilità dell'occhio umano ai dettagli spaziali decresce col crescere della frequenza. Inoltre, è opportuno tener conto di altri fattori quali la quantità di rumore e le caratteristiche del display che sarà utilizzato dall'utente per vedere la sequenza video. É possibile definire una matrice di quantizzazione per una specifica applicazione, o anche per una singola sequenza video.

Un ulteriore coefficiente di quantizzazione, detto quantizer_scale, può essere cambiato all'inizio della codifica di ogni macroblocco. Questo consente di adattare la precisione della codifica dell'immagine al suo contenuto: quei macroblocchi che rappresentano dati uniformi, con un gradiente regolare, devono essere codificati con molta precisione, poiché anche minime inesattezze sarebbero rilevate dall'occhio umano, generando nell'utente la sgradevole sensazione di un immagine ``a blocchi''. Al contrario, macroblocchi più irregolari possono essere quantizzati maggiormante senza che l'occhio possa notare scadimento di qualità. Questo concetto di ``quantizzazione variabile'' è un importante strumento per controllare la qualità dell'immagine e, nel contempo, per adattare le operazioni di codifica a un determinato bitrate.

Nel caso di codifica intra, il coefficiente $DCT$ quantizzato, $QDCT$, è così definito:

\begin{displaymath}
QDCT=\frac
{(16 \times DCT) + ( \textrm{sign}(DCT) \times \t...
...cale} \times Q)}
{2 \times \textsf{quantizer\_scale} \times Q}
\end{displaymath} (2.20)

dove Q è il valore ricavato dalla tabella di quantizzazione e sign() è la funzione segno:

\begin{displaymath}
\textrm{sign}(x) = \left\{ \begin{array}{ll}
+1 & \textrm{se...
...textrm{se $x=0$}\\
-1 & \textrm{se $x<0$}
\end{array} \right.
\end{displaymath}

Nel caso di codifica inter, si ha:

\begin{displaymath}
QDCT=\frac{16 \times DCT}{2 \times \textsf{quantizer\_scale} \times Q}
\end{displaymath} (2.21)

In questa formula, il fattore 2 al denominatore è chiaramente semplificabile, ma è stato mantenuto per consentire un più agevole confronto con la formula [*].


next up previous
Next: Zig-zag scan Up: Codifica Previous: Trasformata Coseno Discreta
Marco Delaurenti
1999-06-25