Come funziona il formato JPEG

Le immagini JPEG sono onnipresenti nelle nostre vite digitali, ma dietro questa patina di consapevolezza si nascondono algoritmi che rimuovono dettagli che non sono percepibili dall’occhio umano. Il risultato è la massima qualità visiva nella dimensione del file più piccola, ma come funziona esattamente? Vediamo cosa esattamente i nostri occhi non vedono!

Come funziona il formato JPEG

È facile dare per scontata la possibilità di inviare una foto a un amico e non preoccuparsi del dispositivo, del browser o del sistema operativo che sta utilizzando, ma non è sempre stato così. All'inizio degli anni '1980, i computer potevano archiviare e visualizzare immagini digitali, ma c'erano molte idee contrastanti sul modo migliore per farlo. Non potevi semplicemente inviare un'immagine da un computer a un altro e sperare che funzionasse.

Per risolvere questo problema, nel 1986 fu riunito un comitato di esperti provenienti da tutto il mondo chiamato "Gruppo congiunto di esperti di fotografia» (Joint Photographic Experts Group, JPEG), fondato come sforzo congiunto tra l'Organizzazione internazionale per la standardizzazione (ISO) e la Commissione elettrotecnica internazionale (IEC), due organizzazioni di standardizzazione internazionali con sede a Ginevra, Svizzera.

Un gruppo di persone chiamato JPEG ha creato lo standard di compressione delle immagini digitali JPEG nel 1992. Chiunque abbia utilizzato Internet probabilmente si è imbattuto in immagini codificate JPEG. Questo è il modo più comune per codificare, inviare e archiviare immagini. Dalle pagine Web alle e-mail fino ai social media, JPEG viene utilizzato miliardi di volte al giorno, praticamente ogni volta che visualizziamo un'immagine online o la inviamo. Senza JPEG, il Web sarebbe meno colorato, più lento e probabilmente avrebbe meno immagini di gatti!

Questo articolo spiega come decodificare un'immagine JPEG. In altre parole, ciò che è necessario per convertire i dati compressi memorizzati su un computer in un'immagine che appare sullo schermo. Vale la pena saperlo, non solo perché è importante comprendere la tecnologia che utilizziamo ogni giorno, ma anche perché sbloccando i livelli di compressione, impariamo di più sulla percezione e sulla visione e su quali dettagli i nostri occhi sono più sensibili.

Inoltre, giocare con le immagini in questo modo è molto interessante.

Come funziona il formato JPEG

Guardando all'interno di JPEG

Su un computer, tutto è memorizzato come una sequenza di numeri binari. Tipicamente questi bit, zero e uno, sono raggruppati in gruppi di otto per formare i byte. Quando si apre un'immagine JPEG su un computer, qualcosa (un browser, un sistema operativo, qualcos'altro) deve decodificare i byte, ripristinando l'immagine originale come un elenco di colori che possono essere visualizzati.

Se scarichi questo dolce foto di un gatto e aprilo in un editor di testo, vedrai un mucchio di caratteri incoerenti.

Come funziona il formato JPEG
Qui utilizzo Notepad++ per esaminare il contenuto del file, poiché i normali editor di testo come Blocco note su Windows corromperanno il file binario dopo il salvataggio e non soddisferà più il formato JPEG.

Aprire un'immagine in un elaboratore di testi confonde il computer, proprio come confondi il cervello quando ti stropicci gli occhi e inizi a vedere macchie di colore!

Questi punti che vedi sono conosciuti come fosfeni, e non sono il risultato di uno stimolo luminoso o di un'allucinazione generata dalla mente. Si verificano perché il cervello pensa che qualsiasi segnale elettrico nei nervi ottici trasmetta informazioni sulla luce. Il cervello ha bisogno di fare queste ipotesi perché non c’è modo di sapere se un segnale è un suono, una visione o qualcos’altro. Tutti i nervi del corpo trasmettono esattamente gli stessi impulsi elettrici. Esercitando pressione sugli occhi, invii segnali che non sono visivi, ma attivano i recettori dell'occhio, che il tuo cervello interpreta, in questo caso erroneamente, come qualcosa di visivo. Puoi letteralmente vedere la pressione!

È divertente pensare a quanto i computer siano simili al cervello, ma è anche un'analogia utile per illustrare quanto il significato dei dati, siano essi trasportati attraverso i nervi o archiviati in un computer, dipenda da come vengono interpretati. Tutti i dati binari sono costituiti da XNUMX e XNUMX, i componenti di base che possono trasmettere informazioni di qualsiasi tipo. Il tuo computer spesso capisce come interpretarli utilizzando indizi come le estensioni dei file. Ora lo costringiamo a interpretarli come testo, perché è quello che si aspetta l'editor di testo.

Per capire come decodificare JPEG, dobbiamo vedere i segnali originali stessi: i dati binari. Questo può essere fatto utilizzando un editor esadecimale o direttamente su pagina web dell'articolo originale! C'è un'immagine, accanto alla quale nel campo di testo ci sono tutti i suoi byte (tranne l'intestazione), presentati in forma decimale. Puoi modificarli e lo script ricodificherà e produrrà una nuova immagine al volo.

Come funziona il formato JPEG

Puoi imparare molto semplicemente giocando con questo editor. Ad esempio, puoi dire in quale ordine sono archiviati i pixel?

La cosa strana di questo esempio è che la modifica di alcuni numeri non influisce affatto sull'immagine, ma, ad esempio, se sostituisci il numero 17 con 0 nella prima riga, la foto sarà completamente rovinata!

Come funziona il formato JPEG

Altre modifiche, come la sostituzione del 7 in linea 1988 con il numero 254, cambia il colore, ma solo dei pixel successivi.

Come funziona il formato JPEG

Forse la cosa più strana è che alcuni numeri cambiano non solo il colore, ma anche la forma dell'immagine. Cambia il 70 nella riga 12 in 2 e guarda la riga superiore dell'immagine per vedere cosa intendo.

Come funziona il formato JPEG

E non importa quale immagine JPEG usi, troverai sempre questi misteriosi schemi di scacchi quando modifichi i byte.

Quando si gioca con l'editor, è difficile capire come viene ricreata una foto da questi byte, poiché la compressione JPEG è composta da tre diverse tecnologie, applicate in sequenza in livelli. Studieremo ciascuno separatamente per scoprire il comportamento misterioso che stiamo vedendo.

Tre livelli di compressione JPEG:

  1. Sottocampionamento del colore.
  2. Trasformata discreta del coseno e campionamento.
  3. Codifica della lunghezza di esecuzione, delta и Huffmann

Per darti un'idea dell'entità della compressione, tieni presente che l'immagine sopra rappresenta 79 numeri, ovvero circa 819 KB. Se lo memorizzassimo senza compressione, ogni pixel richiederebbe tre numeri: per i componenti rosso, verde e blu. Ciò ammonterebbe a 79 numeri, ovvero ca. 917KB. Come risultato della compressione JPEG, il file finale è stato ridotto di oltre 700 volte!

In effetti, questa immagine può essere compressa molto di più. Di seguito sono riportate due immagini affiancate: la foto a destra è stata compressa a 16 KB, ovvero 57 volte più piccola della versione non compressa!

Come funziona il formato JPEG

Se guardi da vicino, vedrai che queste immagini non sono identiche. Entrambe sono immagini con compressione JPEG, ma quella di destra ha un volume molto più piccolo. Sembra anche un po' peggio (guarda i quadrati del colore di sfondo). Ecco perché JPEG è anche chiamato compressione con perdita; Durante il processo di compressione, l'immagine cambia e perde alcuni dettagli.

1. Sottocampionamento del colore

Ecco un'immagine con solo il primo livello di compressione applicato.

Come funziona il formato JPEG
(Versione interattiva - in l'originale articoli). La rimozione di un numero distrugge tutti i colori. Tuttavia, se vengono rimossi esattamente sei numeri, ciò non avrà praticamente alcun effetto sull'immagine.

Ora i numeri sono un po’ più facili da decifrare. Si tratta quasi di un semplice elenco di colori, in cui ogni byte cambia esattamente di un pixel, ma allo stesso tempo è già la metà delle dimensioni dell'immagine non compressa (che occuperebbe circa 300 KB in questa dimensione ridotta). Riesci a indovinare perché?

Puoi vedere che questi numeri non rappresentano i componenti standard rosso, verde e blu, poiché se sostituiamo tutti i numeri con zeri, otterremo un'immagine verde (anziché bianca).

Come funziona il formato JPEG

Questo perché questi byte rappresentano Y (luminosità),

Come funziona il formato JPEG

Cb (blu relativo),

Come funziona il formato JPEG

e immagini Cr (arrossamento relativo).

Come funziona il formato JPEG

Perché non usare l'RGB? Dopotutto, è così che funziona la maggior parte degli schermi moderni. Il tuo monitor può visualizzare qualsiasi colore, inclusi rosso, verde e blu, con intensità diverse per ciascun pixel. Il bianco si ottiene accendendoli tutti e tre alla massima luminosità, il nero spegnendoli.

Come funziona il formato JPEG

Anche questo è molto simile a come funziona l’occhio umano. I recettori del colore nei nostri occhi sono chiamati "coni“, e sono divisi in tre tipi, ognuno dei quali è più sensibile ai colori rosso, verde o blu [i coni di tipo S sono sensibili al viola-blu (S dall'inglese Short - spettro delle onde corte), M -tipo - nelle parti giallo-verde (M dall'inglese Medium - onda media), e tipo L - nelle parti giallo-rosse (L dall'inglese Long - onda lunga) dello spettro. La presenza di questi tre tipi di coni (e bastoncelli, che sono sensibili nella parte verde smeraldo dello spettro) dà a una persona la visione dei colori. /ca. trad.]. bastoni, un altro tipo di fotorecettore dei nostri occhi, è in grado di rilevare i cambiamenti di luminosità, ma è molto più sensibile al colore. I nostri occhi hanno circa 120 milioni di bastoncelli e solo 6 milioni di coni.

Questo è il motivo per cui i nostri occhi sono molto più bravi a rilevare i cambiamenti di luminosità rispetto ai cambiamenti di colore. Se separi il colore dalla luminosità, puoi rimuovere un po' di colore e nessuno noterà nulla. Il sottocampionamento della crominanza è il processo di rappresentazione dei componenti del colore di un'immagine con una risoluzione inferiore rispetto ai componenti della luminanza. Nell'esempio sopra, ogni pixel ha esattamente una componente Y e ogni singolo gruppo di quattro pixel ha esattamente una componente Cb e una componente Cr. Pertanto, l'immagine contiene quattro volte meno informazioni sul colore rispetto all'originale.

Lo spazio colore YCbCr viene utilizzato non solo in JPEG. È stato originariamente inventato nel 1938 per i programmi televisivi. Non tutti hanno una TV a colori, quindi separare colore e luminosità ha permesso a tutti di ottenere lo stesso segnale, mentre i televisori senza colori utilizzavano semplicemente solo la componente di luminosità.

Quindi rimuovere un numero dall'editor rovina completamente tutti i colori. I componenti vengono memorizzati nel formato AAAA Cb Cr (in realtà, non necessariamente in quest'ordine: l'ordine di memorizzazione è specificato nell'intestazione del file). Togliendo il primo numero si farà sì che il primo valore di Cb venga percepito come Y, Cr come Cb, e in generale si avrà un effetto domino che scambia tutti i colori dell'immagine.

La specifica JPEG non obbliga a utilizzare YCbCr. Ma la maggior parte dei file lo utilizza perché produce immagini sottocampionate migliori rispetto all'RGB. Ma non devi credermi sulla parola. Guarda tu stesso nella tabella qui sotto come apparirà il sottocampionamento di ogni singolo componente sia in RGB che in YCbCr.

Come funziona il formato JPEG
(Versione interattiva - in l'originale articoli).

La rimozione del blu non è così evidente come quella del rosso o del verde. Questo perché dei sei milioni di coni nei tuoi occhi, circa il 64% è sensibile al rosso, il 32% al verde e il 2% al blu.

Si vede meglio il downsampling della componente Y (in basso a sinistra). Anche un piccolo cambiamento è evidente.

La conversione di un'immagine da RGB a YCbCr non riduce le dimensioni del file, ma semplifica la ricerca dei dettagli meno visibili che possono essere rimossi. La compressione con perdita avviene nella seconda fase. Si basa sull'idea di presentare i dati in una forma più comprimibile.

2. Trasformata discreta del coseno e campionamento

Questo livello di compressione è, per la maggior parte, ciò di cui si occupa JPEG. Dopo aver convertito i colori in YCbCr, i componenti vengono compressi individualmente, quindi possiamo concentrarci solo sul componente Y. Ed ecco come appaiono i byte del componente Y dopo aver applicato questo livello.

Come funziona il formato JPEG
(Versione interattiva - in l'originale articoli). Nella versione interattiva, cliccando su un pixel si scorre l'editor fino alla riga che lo rappresenta. Prova a rimuovere i numeri dalla fine o ad aggiungere qualche zero a un determinato numero.

A prima vista, sembra una compressione pessima. Ci sono 100 pixel in un'immagine e sono necessari 000 numeri per rappresentarne la luminosità (componenti Y): è peggio che non comprimere nulla!

Tuttavia, tieni presente che la maggior parte di questi numeri sono zero. Inoltre, tutti quegli zeri alla fine delle righe possono essere rimossi senza modificare l'immagine. Sono rimasti circa 26 numeri, ovvero quasi 000 volte di meno!

Questo livello contiene il segreto degli schemi degli scacchi. A differenza di altri effetti che abbiamo visto, la comparsa di questi motivi non è un problema tecnico. Sono gli elementi costitutivi dell'intera immagine. Ogni riga dell'editor contiene esattamente 64 numeri, coefficienti di trasformata coseno discreta (DCT) corrispondenti alle intensità di 64 modelli unici.

Questi modelli sono formati in base al grafico del coseno. Ecco come appaiono alcuni di loro:

Come funziona il formato JPEG
8 probabilità su 64

Di seguito è riportata un'immagine che mostra tutti i 64 modelli.

Come funziona il formato JPEG
(Versione interattiva - in l'originale articoli).

Questi modelli sono di particolare importanza perché costituiscono la base delle immagini 8x8. Se non hai familiarità con l'algebra lineare, ciò significa che qualsiasi immagine 8x8 può essere creata da questi 64 modelli. DCT è il processo di divisione delle immagini in blocchi 8x8 e di conversione di ciascun blocco in una combinazione di questi 64 coefficienti.

Sembra magico che qualsiasi immagine possa essere composta da 64 modelli specifici. Tuttavia, questo equivale a dire che qualsiasi luogo sulla Terra può essere descritto da due numeri: latitudine e longitudine [che indicano gli emisferi / ca. trad.]. Spesso pensiamo alla superficie terrestre come bidimensionale, quindi abbiamo solo bisogno di due numeri. Un'immagine 8x8 ha 64 dimensioni, quindi abbiamo bisogno di 64 numeri.

Non è ancora chiaro come questo ci aiuti in termini di compressione. Se abbiamo bisogno di 64 numeri per rappresentare un'immagine 8x8, perché sarebbe meglio che memorizzare semplicemente 64 componenti di luminosità? Lo facciamo per lo stesso motivo per cui abbiamo trasformato tre numeri RGB in tre numeri YCbCr: ci consente di rimuovere i dettagli più sottili.

È difficile vedere esattamente quali dettagli vengono rimossi in questa fase perché JPEG applica DCT a blocchi 8x8. Tuttavia, nessuno ci vieta di applicarlo all’intero quadro. Ecco come appare DCT per il componente Y applicato all'intera immagine:

Come funziona il formato JPEG

È possibile rimuovere più di 60 numeri dalla fine praticamente senza modifiche evidenti alla foto.

Come funziona il formato JPEG

Tuttavia, tieni presente che se azzeriamo i primi cinque numeri, la differenza sarà evidente.

Come funziona il formato JPEG

I numeri all'inizio rappresentano i cambiamenti a bassa frequenza nell'immagine, che i nostri occhi percepiscono meglio. I numeri verso la fine indicano cambiamenti nelle alte frequenze che sono più difficili da notare. Per “vedere ciò che l’occhio non può vedere”, possiamo isolare questi dettagli ad alta frequenza azzerando i primi 5000 numeri.

Come funziona il formato JPEG

Vediamo tutte le aree dell'immagine dove avviene il cambiamento maggiore da pixel a pixel. Spiccano gli occhi del gatto, i suoi baffi, la coperta di spugna e le ombre nell'angolo in basso a sinistra. Puoi andare oltre azzerando i primi 10 numeri:

Come funziona il formato JPEG

20 000:

Come funziona il formato JPEG

40 000:

Come funziona il formato JPEG

60 000:

Come funziona il formato JPEG

Questi dettagli ad alta frequenza vengono rimossi da JPEG durante la fase di compressione. Non vi è alcuna perdita nella conversione dei colori nei coefficienti DCT. La perdita si verifica nella fase di campionamento, dove vengono rimossi i valori ad alta frequenza o vicini allo zero. Quando si abbassa la qualità di salvataggio JPEG, il programma aumenta la soglia per il numero di valori rimossi, riducendo la dimensione del file, ma rendendo l'immagine più pixelata. Ecco perché l'immagine nella prima sezione, che era 57 volte più piccola, appariva così. Ogni blocco 8x8 era rappresentato da molti meno coefficienti DCT rispetto alla versione di qualità superiore.

Puoi creare un effetto fantastico come lo streaming graduale delle immagini. È possibile visualizzare un'immagine sfocata che diventa sempre più dettagliata man mano che vengono scaricati sempre più coefficienti.

Ecco, solo per divertimento, cosa ottieni utilizzando solo 24 numeri:

Come funziona il formato JPEG

O solo 5000:

Come funziona il formato JPEG

Molto sfocato, ma in qualche modo riconoscibile!

3. Codifica della lunghezza di esecuzione, delta e Huffman

Finora, tutte le fasi della compressione sono state in perdita. L'ultima fase, invece, procede senza perdite. Non elimina le informazioni, ma riduce significativamente la dimensione del file.

Come puoi comprimere qualcosa senza buttare via le informazioni? Immagina come descriveremmo un semplice rettangolo nero 700 x 437.

JPEG utilizza 5000 numeri per questo, ma si possono ottenere risultati molto migliori. Riesci a immaginare uno schema di codifica che descriva un'immagine del genere nel minor numero di byte possibile?

Lo schema minimo che ho potuto ideare ne usa quattro: tre per rappresentare un colore e un quarto per indicare quanti pixel ha quel colore. L'idea di rappresentare valori ripetuti in questo modo condensato è chiamata codifica run-length. È senza perdite perché possiamo ripristinare i dati codificati nella loro forma originale.

Un file JPEG con un rettangolo nero è molto più grande di 4 byte: ricorda che a livello DCT la compressione viene applicata a blocchi di 8x8 pixel. Pertanto, come minimo, abbiamo bisogno di un coefficiente DCT ogni 64 pixel. Ne abbiamo bisogno perché invece di memorizzare un coefficiente DCT seguito da 63 zeri, la codifica della lunghezza di esecuzione ci consente di memorizzare un numero e indicare che "tutti gli altri sono zeri".

La codifica delta è una tecnica in cui ogni byte contiene una differenza rispetto a un valore, anziché un valore assoluto. Pertanto, la modifica di determinati byte modifica il colore di tutti gli altri pixel. Ad esempio, invece di archiviare

12 13 14 14 14 13 13 14

Potremmo iniziare con 12 e poi indicare semplicemente quanto dobbiamo aggiungere o sottrarre per ottenere il numero successivo. E questa sequenza nella codifica delta assume la forma:

12 1 1 0 0 -1 0 1

I dati convertiti non sono più piccoli dei dati originali, ma sono più facili da comprimere. L'applicazione della codifica delta prima della codifica della lunghezza di esecuzione può essere di grande aiuto pur mantenendo una compressione senza perdite.

La codifica delta è una delle poche tecniche utilizzate al di fuori dei blocchi 8x8. Dei 64 coefficienti DCT, uno è semplicemente una funzione d'onda costante (colore solido). Rappresenta la luminosità media di ciascun blocco per i componenti luma, o il blu medio per i componenti Cb e così via. Il primo valore di ogni blocco DCT è chiamato valore DC, e ogni valore DC è codificato in delta rispetto ai precedenti. Pertanto, la modifica della luminosità del primo blocco avrà effetto su tutti i blocchi.

Resta il mistero finale: in che modo cambiare il singolare rovina completamente l'intero quadro? Finora, i livelli di compressione non hanno avuto tali proprietà. La risposta sta nell'intestazione JPEG. I primi 500 byte contengono metadati sull'immagine: larghezza, altezza, ecc., e non abbiamo ancora lavorato con essi.

Senza un'intestazione è quasi impossibile (o molto difficile) decodificare JPEG. Sembrerà come se stessi cercando di descriverti l'immagine e sto iniziando a inventare parole per trasmetterti la mia impressione. Probabilmente la descrizione sarà molto concisa, perché posso inventare parole con esattamente il significato che voglio trasmettere, ma per tutti gli altri non avranno senso.

Sembra stupido, ma è esattamente quello che succede. Ogni immagine JPEG è compressa con codici ad essa specifici. Il dizionario dei codici è memorizzato nell'intestazione. Questa tecnica è chiamata codice Huffman e il vocabolario è chiamato tabella Huffman. Nell'intestazione la tabella è contrassegnata con due byte: 255 e poi 196. Ciascun componente di colore può avere la propria tabella.

Le modifiche alle tabelle influenzeranno radicalmente qualsiasi immagine. Un buon esempio è cambiare la quindicesima riga in 15.

Come funziona il formato JPEG

Ciò accade perché le tabelle specificano come devono essere letti i singoli bit. Finora abbiamo lavorato solo con numeri binari in forma decimale. Ma questo ci nasconde il fatto che se vuoi memorizzare il numero 1 in un byte, sembrerà 00000001, poiché ogni byte deve avere esattamente otto bit, anche se ne serve solo uno.

Questo è potenzialmente un grande spreco di spazio se hai molti numeri piccoli. Il codice Huffman è una tecnica che ci consente di allentare questo requisito secondo cui ogni numero deve occupare otto bit. Ciò significa che se vedi due byte:

234/115

Quindi, a seconda della tabella di Huffman, questi potrebbero essere tre numeri. Per estrarli è necessario prima scomporli in singoli bit:

11101010/01110011

Poi guardiamo la tabella per capire come raggrupparli. Ad esempio, potrebbero essere i primi sei bit (111010) o 58 in decimale, seguiti da cinque bit (10011) o 19 e infine gli ultimi quattro bit (0011) o 3.

Pertanto, è molto difficile comprendere i byte in questa fase di compressione. I byte non rappresentano ciò che sembrano. Non entrerò nei dettagli del lavoro con la tabella in questo articolo, ma materiale su questo problema on-line abbastanza.

Un trucco interessante che puoi fare con questa conoscenza è separare l'intestazione dal JPEG e memorizzarla separatamente. In effetti, si scopre che solo tu puoi leggere il file. Facebook lo fa per rendere i file ancora più piccoli.

Ciò che si può fare è modificare un po’ la tabella di Huffman. Per altri sembrerà un'immagine rotta. E solo tu conoscerai il modo magico per risolverlo.

Riassumiamo: quindi cosa è necessario per decodificare JPEG? Necessario:

  1. Estrai le tabelle Huffman dall'intestazione e decodifica i bit.
  2. Estrai i coefficienti discreti della trasformazione coseno per ciascun componente di colore e luminanza per ciascun blocco 8x8, eseguendo trasformazioni di codifica delta e di lunghezza di esecuzione inversa.
  3. Combina i coseni in base ai coefficienti per ottenere i valori dei pixel per ciascun blocco 8x8.
  4. Scala i componenti del colore se è stato eseguito il sottocampionamento (questa informazione è nell'intestazione).
  5. Converti i valori YCbCr risultanti per ciascun pixel in RGB.
  6. Visualizza l'immagine sullo schermo!

Un lavoro serio per la semplice visualizzazione di una foto con un gatto! Tuttavia, quello che mi piace è che mostra quanto la tecnologia JPEG sia incentrata sull'uomo. Si basa sulle peculiarità della nostra percezione, permettendoci di ottenere una compressione molto migliore rispetto alle tecnologie convenzionali. E ora che abbiamo capito come funziona il JPEG, possiamo immaginare come queste tecnologie possano essere trasferite in altri ambiti. Ad esempio, la codifica delta nel video può fornire una riduzione significativa delle dimensioni del file, poiché spesso ci sono intere aree che non cambiano da un fotogramma all'altro (ad esempio, lo sfondo).

Codice utilizzato nell'articolo, è aperto e contiene istruzioni su come sostituire le immagini con le tue.

Fonte: habr.com

Aggiungi un commento