Formati immagine: WebP

Originariamente Google ha sviluppato WebP come formato di immagine con perdita di dati, che sostituisce il formato JPEG, in grado di produrre file più piccoli di un file immagine di qualità simile codificato in formato JPEG. I successivi aggiornamenti del formato hanno introdotto l'opzione di compressione senza perdita di dati, trasparenza del canale alfa di tipo PNG e animazione di tipo GIF, tutti utilizzabili insieme alla compressione con perdita di dati in stile JPEG. WebP è un formato incredibilmente versatile.

L'algoritmo di compressione con perdita di dati di WebP si basa su un metodo utilizzato dal codec video VP8 per comprimere i fotogrammi chiave dei video. A livello generale, è simile alla codifica JPEG: WebP opera in termini di "blocchi" piuttosto che di singoli pixel e ha una simile divisione tra luminanza e crominanza. I luma block di WebP sono 16 x 16, mentre i blocchi di crominanza sono 8 x 8 e questi "macroblocchi" sono ulteriormente suddivisi in sotto-blocchi 4x4.

Dove WebP differisce radicalmente da JPEG ci sono due caratteristiche: "previsione dei blocchi" e "quantizzazione adattiva dei blocchi".

Blocca previsione

La previsione dei blocchi è il processo attraverso il quale vengono previsti i contenuti di ogni blocco di crominanza e luminanza in base ai valori dei blocchi circostanti, in particolare i blocchi sopra e a sinistra del blocco corrente. Come puoi immaginare, gli algoritmi che lo svolgono sono piuttosto complessi, ma in un linguaggio semplice: "se c'è blu sopra il blocco corrente e blu a sinistra del blocco attuale, supponiamo che questo blocco sia blu".

In realtà, sia PNG che JPEG fanno anche questo tipo di previsione in una certa misura. WebP, tuttavia, è univoco in quanto campiona i dati dei blocchi circostanti e poi tenta di compilare il blocco attuale tramite varie "modalità di previsione ", cercando di"disegnare " la parte mancante dell'immagine. I risultati forniti da ciascuna modalità di previsione vengono quindi confrontati con i dati dell'immagine reali e viene selezionata la corrispondenza predittiva più vicina.

Diagramma dei vari metodi di previsione a blocchi di WebP.

Anche la corrispondenza predittiva più vicina non sarà del tutto corretta, ovviamente, quindi le differenze tra i valori previsti e quelli effettivi del blocco sono codificate nel file. Quando decodifica l'immagine, il motore di rendering utilizza gli stessi dati per applicare la stessa logica predittiva, il che genera gli stessi valori previsti per ogni blocco. La differenza tra la previsione e l'immagine prevista codificata nel file viene quindi applicata alle previsioni, in modo simile a come un commit Git rappresenta una patch differenziale che viene applicata sul file locale, invece che su una nuova copia del file.

Per spiegarci: anziché approfondire i complessi matematici coinvolti nel vero algoritmo predittivo, inventeremo una codifica simile a WebP con una singola modalità di previsione e la utilizzeremo per inoltrare in modo efficiente una griglia di numeri, come facevamo con i formati precedenti. Il nostro algoritmo ha un'unica modalità di previsione, che chiameremo "modalità di previsione uno". Il valore di ogni blocco è la somma dei valori dei blocchi in alto e a sinistra, a partire da 1.

Ora, supponiamo di iniziare con i seguenti dati di immagini reali:

111151111
122456389

Utilizzando il nostro modello predittivo per determinare i contenuti di una griglia 2x9, otterremmo il seguente risultato:

111111111
123456789

I nostri dati sono adatti all'algoritmo predittivo che abbiamo inventato: i dati previsti sono molto simili ai nostri dati reali. Non è la soluzione perfetta, ovviamente: i dati effettivi presentano diversi blocchi diversi da quelli previsti. Pertanto, la codifica inviata include non solo il metodo di previsione da utilizzare, ma anche una differenza dei blocchi che dovrebbero essere diversi dai valori previsti:

_ _ _ _ +4 _ _ _ _
_ _ -1 _ _ _ -4 _ _

Utilizza lo stesso linguaggio semplice utilizzato per alcune delle codifiche dei formati precedenti di cui abbiamo parlato:

Griglia 2x9 utilizzando la modalità di previsione uno. da -4 a 1x5, da -1 a 2x3, da -4 a 2x7.

Il risultato finale è un file codificato incredibilmente efficiente.

Quantizzazione adattiva dei blocchi

La compressione JPEG è un'operazione generale, in quanto applica lo stesso livello di quantizzazione a ogni blocco dell'immagine. In un'immagine con una composizione uniforme, questo ha sicuramente senso, ma le fotografie del mondo reale non sono più uniformi del mondo che ci circonda. In pratica, questo significa che le nostre impostazioni di compressione JPEG non sono determinate dai dettagli ad alta frequenza (dove eccelle la compressione JPEG), ma dalle parti dell'immagine in cui è più probabile che si verifichino artefatti di compressione.

Un'immagine JPEG compressa di una farfalla monarca

Come vedi in questo esempio esagerato, le ali del monarca in primo piano sembrano relativamente acute, un po' sgranate se confrontate con l'originale ad alta risoluzione, ma di sicuro non si noteranno senza l'originale. Allo stesso modo, io e te possiamo vedere tracce di artefatti di compressione con occhi ben allenati e le foglie in primo piano, ma anche con la compressione aumentata ben oltre i livelli ragionevoli, le cose in primo piano appaiono discretamente nitide. Le informazioni a bassa frequenza in alto a sinistra nell'immagine, lo sfondo verde sfocato delle foglie, sembrano terribili. Anche un visualizzatore non addestrato potrebbe notare immediatamente il problema di qualità: i sottili gradienti sullo sfondo vengono arrotondati per difetto in blocchi frastagliati e in tinta unita.

Per evitare questo problema, WebP adotta un approccio adattivo alla quantizzazione: un'immagine è suddivisa in un massimo di quattro segmenti visivamente simili e i parametri di compressione per questi segmenti vengono ottimizzati in modo indipendente. Utilizzo della stessa compressione di dimensioni eccessive con WebP:

Un'immagine WebP compressa di una farfalla monarca

Le dimensioni di entrambi questi file immagine sono all'incirca le stesse. La qualità è più o meno la stessa quando guardiamo le ali del monarca: puoi notare alcune piccole differenze nel risultato finale se osservi molto, da vicino, senza differenze reali nella qualità complessiva. Nel WebP, i fiori dell'erba del latte sono solo leggermente più nitidi, probabilmente non abbastanza per essere visibili, a meno che non si confrontino i due aspetti e si cerchino davvero differenze di qualità, come siamo. Lo sfondo è un'altra storia, nel complesso: non lascia quasi alcuna traccia degli artefatti estremamente evidenti di JPEG. WebP ci dà la stessa dimensione di file, ma un'immagine di qualità molto superiore: fornisci o prendi alcuni piccoli dettagli che i nostri sistemi psicovisivi non sarebbero in grado di rilevare se non confrontassimo i due da vicino.

Utilizzo di WebP

Gli elementi interni di WebP potrebbero essere molto più complessi rispetto alla codifica JPEG, ma altrettanto semplice ai fini del nostro lavoro quotidiano: tutta la complessità della codifica WebP è standardizzata intorno a un singolo valore di "qualità", espresso da 0 a 100, proprio come il formato JPEG. Ancora una volta, questo non significa che sia limitato a un'unica impostazione generale di "qualità". Puoi (e devi) applicare tutti i dettagli della codifica WebP, solo per comprendere meglio in che modo queste impostazioni normalmente invisibili possono influire sulle dimensioni e sulla qualità dei file.

Google offre un codificatore a riga di comando cwebp che ti consente di convertire o comprimere singoli file o intere directory di immagini:

$ cwebp -q 80 butterfly.jpg -o butterfly.webp

Saving file 'butterfly.webp'
File:   butterfly.jpg
Dimension: 1676 x 1418
Output: 208418 bytes Y-U-V-All-PSNR 41.00 43.99 44.95   41.87 dB
        (0.70 bpp)
block count:    intra4:     7644  (81.80%)
               Intra16:     1701  (18.20%)
               Skipped:       63  (0.67%)
bytes used:  header:            249  (0.1%)
              mode-partition:  36885  (17.7%)
Residuals bytes  |segment 1|segment 2|segment 3|segment 4|  total
macroblocks:     |       8%|      22%|      26%|      44%|   9345
quantizer:       |      27 |      25 |      21 |      13 |
filter level:    |       8 |       6 |      19 |      16 |

E se non sei orientato verso la riga di comando, Squoosh ci servirà altrettanto per la codifica WebP. Offre la possibilità di confrontare fianco a fianco tra diverse codifiche, impostazioni, livelli qualitativi e differenze nelle dimensioni dei file rispetto alla codifica JPEG.