Linux multimedia/Immagini/Introduzione

Indice del libro

Molti concetti importanti nel video nascono in realtà nell'ambito dell'elaborazione delle immagini digitali. Infatti, in fin dei conti, un video non compresso si può considerare una sequenza di immagini, abbastanza ravvicinate nel tempo da dare l'impressione di un flusso continuo, ma ognuna delle quali è a tutti gli effetti un'immagine a sé.

In particolare, alla base dei formati e dei codec MPEG, ma non solo, c'è lo standard JPEG. Capire la compressione JPEG è fondamentale perché è un punto di riferimento per tutta la teoria del video.

Campionamento / acquisizione

modifica

Innanzitutto un'immagine JPEG deriva dal campionamento di un'immagine reale, effettuato da una fotocamera, da una videocamera, da uno scanner o da qualche altro dispositivo che produce una matrice di pixel secondo il modello di colore RGB: ad ogni pixel della matrice è associata una terna di valori corrispondenti ai colori rosso, verde e blu. Il numero di possibili valori per ciascun colore costituisce la profondità di colore. Tipicamente ad ogni colore sono dedicati 8 bit, per un totale di 256 valori possibili per ciascun colore, e quindi 24 bit per l'informazione di colore nel suo complesso. In tutto, 2^24 colori.

Da RGB a YCbCr

modifica

Prima di comprimere questa rappresentazione RGB dell'immagine reale, conviene però passare ad un altro spazio di colore, precisamente il YCbCr, nel quale è più facile individuare quella parte di informazione che, essendo relativamente meno significativa, è possibile scartare. Inoltre, nello spazio YCbCr è possibile ricorrere al chroma subsampling, risparmiando ulteriormente. Il passaggio allo spazio YCbCr consiste in una rotazione, una semplice operazione matriciale. Questa e altre operazioni vengono di solito effettuate non sull'intera immagine simultaneamente, ma su porzioni di essa, solitamente blocchi di 8x8 pixel.

Dai pixel alle frequenze: la trasformata DCT

modifica

A partire da un'immagine come matrice di pixel, ognuno con un suo colore, acquisita in un qualsivoglia modo, il primo processo consiste nel ricavare da essa una nuova matrice in cui ogni punto rappresenta non una posizione nel piano, bensì due frequenze che misurano quanto variano luce e colore in senso orizzontale e verticale in una particolare zona dell'immagine originale. Ad ogni frequenza è associato un coefficiente che indica appunto, per quella particolare frequenza base, la variazione in quella zona.

La trasformazione che realizza tutto questo è la già citata DCT, Discrete Cosine Transform. Essa opera normalmente su blocchi di 8x8 pixel nell'immagine non compressa e, pur essendo una trasformazione del piano, e quindi bidimensionale, la componente orizzontale e quella verticale sono del tutto disaccoppiate, per cui, in definitiva, applicarla ad un blocco 8x8 equivale ad applicare otto volte una trasformata monodimensionale, una per ogni riga del blocco 8x8 (oppure, una per ogni colonna).

I coefficienti interi che intervengono nella DCT non dipendono dal blocco né dalla riga o colonna in esame, per cui possono essere calcolati una volta sola per tutta l'immagine.

La DCT è invertibile, e i coefficienti della trasformata inversa sono facilmente ricavabili da quelli della trasformata diretta. Trattandosi sempre di numeri interi, e non floating-point, le operazioni non introducono errori, per cui l'invertibilità non è limitata al sistema dei numeri reali, ma ai numeri gestiti dagli elaboratori elettronici.

In definitiva, l'implementazione della DCT può essere resa estremamente efficiente, al punto che con l'hardware attuale sembra un gioco visualizzare e modificare un'immagine JPEG anche grande.

Ciò che rende interessante la trasformata DCT di un'immagine non compressa è il fatto che, nella maggior parte delle situazioni reali (paesaggi, ritratti, film, cartoni animati e altro), le immagini presentano una caratteristica ricorrente: i coefficienti più elevati si concentrano verso le basse frequenze, che corrispondono ad una porzione relativamente piccola di tutto lo spettro di frequenze, mentre la maggior parte dei coefficienti ha valori più modesti, spesso prossimi allo zero, e distribuiti sulle frequenze più alte, che occupano una parte più significativa dello spettro.

Sembra quindi che molti coefficienti non siano particolarmente significativi, mentre quelli davvero importanti sono pochi e ben concentrati su frequenze specifiche. Questa caratteristica viene poi sfruttata nella quantizzazione.

La DCT ha molte altre interessanti proprietà, che qui non è il caso di riportare. Anche su web esiste una vasta letteratura in merito, che può valer la pena di leggere, purché si disponga delle necessarie basi matematiche.

Quantizzazione

modifica

È a questo punto che avviene l'unica trasformazione non invertibile: la quantizzazione. I coefficienti DCT di un blocco 8x8 che, per inciso, sono tutti numeri interi compresi in un certo intervallo, vengono divisi ciascuno per un ben preciso fattore (il quantizzatore), e il risultato viene ridotto all'intero più vicino (ed è proprio questa operazione che non si può invertire). I divisori vengono normalmente organizzati in una matrice, detta matrice di quantizzazione, anch'essa 8x8, ma l'operazione di quantizzazione non è matriciale: il coefficiente DCT di posto (i,j) viene diviso per il quantizzatore di posto (i,j), per cui non avviene una divisione fra matrici.

La matrice di quantizzazione è caratteristica del codec, anche se codec particolari permettono di impostarla a piacere. In generale, però, i codec permettono solo di stabilire quanto devono essere divisi i coefficienti DCT, senza poter intervenire separatamente sul singolo coefficiente.

La stessa matrice di quantizzazione viene usata in fase di decompressione: i coefficienti DCT compressi vengono moltiplicati per gli elementi corrispondenti della matrice di quantizzazione. Ovviamente, avendo effettuato un troncamento durante la quantizzazione, questi prodotti non potranno riprodurre i coefficienti DCT originali, cioè prima della quantizzazione, e quindi una parte dell'informazione originale va persa.

Compressione finale senza perdita di informazione

modifica

Dopo la quantizzazione, molti coefficienti, soprattutto alle alte frequenze, sono nulli. La maggior parte di quelli non nulli si concentra alle basse frequenze. A questo punto i coefficienti possono essere compressi senza perdita di informazione in modo piuttosto efficace, con algoritmi simili a quelli usati nel formato ZIP. Siccome però i valori decadono sia per righe che per colonne, conviene ordinarli a zig-zag, partendo dal coefficiente (1,1). In questo modo, da un certo punto in poi si incontrano praticamente solo coefficienti nulli, e questo migliora notevolmente il rapporto di compressione.

In fase di decodifica, o decompressione, tutti questi passaggi si ripetono semplicemente a rovescio. È importante capire che sono tutti invertibili, eccetto la quantizzazione.