◩ Grafica e immagini

Compressione delle immagini: senza perdita e con perdita a confronto

Come si riduce il peso di un'immagine: ridondanza, RLE, codifica di Huffman, predizione, compressione con perdita e perché certe immagini pesano tanto.

Una foto non compressa da 12 megapixel occupa circa 36 MB; lo stesso scatto in JPEG ne occupa pochi. Uno screenshot di una finestra di testo, salvato in PNG, pesa spesso meno di una foto in JPEG della stessa dimensione. Per capire perché, e per scegliere il formato giusto senza andare a tentativi, conviene conoscere i principi comuni a tutti gli algoritmi di compressione delle immagini.

Due famiglie

  • Compressione senza perdita (lossless): dopo la decompressione si ottengono esattamente gli stessi pixel di partenza, bit per bit. Esempi: PNG, GIF, la modalità lossless di WebP, TIFF con compressione LZW o ZIP.
  • Compressione con perdita (lossy): si scartano informazioni giudicate poco visibili, ottenendo file molto più piccoli. L'immagine decompressa è simile, non identica. Esempi: JPEG, WebP e AVIF nelle modalità con perdita.

La scelta non riguarda la "qualità" in astratto, ma il tipo di contenuto e l'uso che se ne farà.

Il principio della compressione senza perdita: la ridondanza

Si può comprimere senza perdere nulla solo se i dati contengono ridondanza, cioè regolarità prevedibili. Un'immagine di rumore casuale non si comprime affatto; un'immagine con grandi aree uniformi si comprime moltissimo. Le tecniche principali sfruttano tipi diversi di ridondanza.

Run-length encoding (RLE)

Si sostituiscono sequenze di valori uguali con la coppia «quante volte, quale valore». Una riga di 1000 pixel bianchi diventa «1000 × bianco». È efficace per grafica semplice e loghi, inutile per le fotografie, dove due pixel consecutivi identici sono rari.

Dizionari (famiglia LZ)

Gli algoritmi della famiglia Lempel–Ziv cercano sequenze già incontrate e le sostituiscono con un riferimento all'indietro: «ripeti i 20 byte che stanno 300 posizioni prima». Funzionano bene con motivi ripetuti, come le icone in un'interfaccia o un pattern decorativo.

Codifica entropica

Non tutti i valori compaiono con la stessa frequenza. La codifica di Huffman assegna codici corti ai valori frequenti e codici lunghi a quelli rari, come nell'alfabeto Morse la lettera E ha il segnale più breve. La codifica aritmetica e le sue varianti fanno lo stesso con maggiore efficienza. Il limite teorico è dato dall'entropia dei dati: nessun metodo senza perdita può scendere sotto quella soglia in media.

Predizione

Le immagini hanno una forte correlazione spaziale: un pixel somiglia ai vicini. Invece di memorizzare il valore, si memorizza la differenza tra il valore reale e una previsione basata sui pixel già noti. In un cielo uniforme le differenze sono quasi tutte vicine a zero, e una sequenza di piccoli numeri si comprime molto meglio dei valori originali. Questo è il cuore dei filtri di PNG e di molti formati lossless moderni.

Il principio della compressione con perdita: ciò che non si vede

La compressione con perdita sfrutta i limiti della visione:

  1. Siamo meno sensibili al colore che alla luminosità: si può ridurre la risoluzione delle informazioni di colore (sottocampionamento della crominanza) con un impatto visivo modesto.
  2. Siamo meno sensibili ai dettagli fini che alle variazioni ampie: si trasforma l'immagine in componenti di frequenza (con la DCT nel JPEG, con trasformate simili nei formati più recenti) e si rappresentano le alte frequenze con meno precisione.
  3. Il rumore e la grana non vanno riprodotti esattamente: alcuni codec moderni li eliminano e li ricreano in modo sintetico alla decodifica.

La fase che effettivamente butta via informazione si chiama quantizzazione: i valori vengono arrotondati a un numero limitato di livelli. Dopo la quantizzazione, il resto della catena è di nuovo senza perdita: predizione e codifica entropica comprimono i dati rimasti.

Quale contenuto per quale compressione

Contenuto Compressione adatta Motivo
Fotografie con perdita rumore e sfumature continue si comprimono male senza perdita
Screenshot, interfacce senza perdita bordi netti e aree uniformi; la perdita crea artefatti attorno al testo
Loghi, icone, grafica piatta senza perdita o vettoriale pochi colori, molta ridondanza
Master di lavoro senza perdita ogni salvataggio con perdita degrada ulteriormente
Immagini scientifiche e forensi senza perdita i valori dei pixel sono dati, non solo aspetto

Perché certe immagini "non si comprimono"

Alcuni esempi che nel mio lavoro incontro spesso:

  • Foto ad alti ISO: il rumore del sensore è, di fatto, casualità, e la casualità non ha ridondanza. Una leggera riduzione del rumore prima della compressione riduce il peso molto più di quanto ci si aspetterebbe.
  • Foto salvate in PNG: un PNG di una fotografia è spesso tre o quattro volte più pesante di un JPEG di buona qualità, senza alcun vantaggio visibile per l'uso sul web.
  • Grafica con dithering: il rumore aggiunto per eliminare il banding aumenta il peso.
  • Ricompressioni ripetute: aprire un JPEG, modificarlo e salvarlo di nuovo con perdita accumula artefatti a ogni passaggio. Il peso non scende, la qualità sì.

Una regola d'oro

Conservate sempre un originale senza perdita, o il file RAW, e generate le versioni compresse da quello. La compressione con perdita è un formato di consegna, non di lavoro.

In sintesi

  • La compressione senza perdita sfrutta la ridondanza: RLE, dizionari, predizione e codifica entropica.
  • La compressione con perdita sfrutta i limiti della visione e scarta informazione con la quantizzazione.
  • Fotografie: con perdita; screenshot, loghi e master: senza perdita.
  • Il rumore è il nemico della compressione: si comprime male in qualunque formato.
  • Lavorate su originali senza perdita e comprimete con perdita solo all'esportazione.
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