◩ Grafica e immagini

Come funziona il JPEG: DCT, quantizzazione e artefatti

Il percorso di una foto dentro un encoder JPEG: YCbCr, sottocampionamento, blocchi 8×8, DCT, quantizzazione e codifica, e da dove nascono gli artefatti.

Il JPEG è probabilmente il formato di immagine più usato al mondo, ed è anche uno dei più eleganti dal punto di vista tecnico. Capire cosa succede dentro l'encoder permette di scegliere la qualità con criterio, riconoscere gli artefatti e sapere quali operazioni danneggiano una foto e quali no. Seguiamo un'immagine passo dopo passo.

1. Da RGB a YCbCr

Il primo passo separa la luminosità dal colore. I valori RGB vengono trasformati in tre componenti:

  • Y (luminanza): quanto è chiaro il pixel, in pratica una versione in bianco e nero dell'immagine;
  • Cb e Cr (crominanza): quanto il colore si discosta dal grigio verso il blu e verso il rosso.

La trasformazione è reversibile e di per sé non perde informazione. Serve a preparare il passo successivo, sfruttando il fatto che l'occhio è molto più sensibile ai dettagli di luminosità che a quelli di colore.

2. Sottocampionamento della crominanza

Le componenti Cb e Cr vengono spesso memorizzate a risoluzione ridotta:

Schema Risoluzione del colore Uso tipico
4:4:4 piena grafica, testi, qualità massima
4:2:2 metà in orizzontale alcuni flussi fotografici e video
4:2:0 metà in orizzontale e in verticale impostazione comune per le foto

Con 4:2:0 i dati di colore si riducono a un quarto. Su una fotografia la differenza è difficilmente visibile; su un testo rosso su fondo blu, invece, i bordi diventano sbavati. Ecco perché gli screenshot salvati in JPEG mostrano spesso aloni attorno alle scritte colorate.

3. Blocchi di 8 × 8 pixel

Ogni componente viene divisa in blocchi di 8 × 8 campioni, che saranno elaborati indipendentemente. La scelta di blocchi piccoli rende l'algoritmo veloce e poco esigente in memoria; il prezzo è che, a compressione elevata, i confini tra blocchi diventano visibili.

4. La trasformata discreta del coseno (DCT)

Ogni blocco viene trasformato con la DCT, che esprime i 64 valori come somma di 64 "motivi" di base, dal tono uniforme fino a scacchiere sempre più fitte. Il risultato è una matrice di 64 coefficienti:

  • il coefficiente in alto a sinistra (detto DC) rappresenta il valore medio del blocco;
  • gli altri (detti AC) rappresentano variazioni sempre più fini, cioè frequenze più alte.

In una zona di cielo quasi uniforme, quasi tutta l'energia si concentra nel coefficiente DC e in pochi AC a bassa frequenza; gli altri sono vicini a zero. Anche la DCT, in teoria, è reversibile: la perdita non avviene qui.

5. Quantizzazione: dove si perde informazione

Ogni coefficiente viene diviso per un valore preso da una tabella di quantizzazione e arrotondato all'intero. Le tabelle usano divisori piccoli per le basse frequenze e grandi per le alte. Molti coefficienti ad alta frequenza diventano così esattamente zero.

Il parametro "qualità" che vediamo nei programmi non fa parte dello standard: è una scala definita da ciascun encoder che, di fatto, moltiplica i valori delle tabelle. Per questo «qualità 80» in due programmi diversi non produce necessariamente lo stesso risultato.

6. Ordinamento a zig-zag e codifica

I 64 coefficienti quantizzati vengono letti a zig-zag, dalle basse alle alte frequenze, così che gli zeri finiscano raggruppati in coda. A quel punto:

  • i coefficienti DC sono codificati come differenza rispetto al blocco precedente;
  • gli AC sono codificati come coppie «quanti zeri, poi quale valore», con un simbolo speciale per «da qui in poi solo zeri»;
  • tutto passa infine per una codifica entropica, di solito Huffman.

Il JPEG progressivo organizza i dati in passate successive: prima le basse frequenze di tutta l'immagine, poi i dettagli. Durante il caricamento si vede subito una versione sfocata che si definisce progressivamente, e spesso il file risulta anche un po' più piccolo.

Gli artefatti e come riconoscerli

  • Blocchettatura: quadrati di 8 × 8 pixel visibili nelle zone uniformi, dovuti alla quantizzazione forte del coefficiente DC e dei primi AC.
  • Ringing (o mosquito noise): aloni e puntini attorno ai bordi netti, perché eliminando le alte frequenze non si riesce più a rappresentare un salto brusco.
  • Sbavature di colore: bordi colorati imprecisi, effetto del sottocampionamento.
  • Banding nei cieli: la quantizzazione appiattisce le variazioni lievi.

Nel mio lavoro di analisi le tracce della quantizzazione sono anche un indizio prezioso: zone di un'immagine che mostrano griglie di blocchi non allineate con il resto possono rivelare un incollaggio da un'altra foto.

Operazioni sicure e operazioni dannose

Operazione Effetto
Aprire e risalvare in JPEG nuova quantizzazione: perdita aggiuntiva
Ruotare di 90° con strumenti "lossless" nessuna perdita, se le dimensioni sono multiple della dimensione dei blocchi
Ritagliare con strumenti "lossless" nessuna perdita, se il ritaglio è allineato ai blocchi
Modificare solo i metadati nessuna perdita
Aumentare la qualità di un JPEG già compresso file più pesante, nessun dettaglio recuperato

Consigli pratici

  1. Per le foto da pubblicare, una qualità media-alta con 4:2:0 è un buon compromesso; verificate a occhio su zone uniformi e bordi.
  2. Per immagini con testo o grafica, usate 4:4:4 o, meglio, un formato senza perdita.
  3. Conservate il file originale e generate ogni nuova versione da lì, non dall'ultimo JPEG.

In sintesi

  • Il JPEG separa luminanza e crominanza e riduce la risoluzione del colore.
  • Ogni blocco 8 × 8 viene trasformato con la DCT in coefficienti di frequenza.
  • La perdita avviene nella quantizzazione; la "qualità" è una scala specifica di ciascun encoder.
  • Blocchettatura, ringing e sbavature di colore sono gli artefatti tipici.
  • Ogni risalvataggio aggiunge perdita: lavorate sempre dall'originale.
MM
Marco Marzaduri

Marco Marzaduri si occupa di cybersecurity, informatica forense e sviluppo web. Laureato in informatica, unisce il rigore dell'analisi tecnica all'attenzione per le persone che usano la tecnologia.

Leggi anche