JPEG. Algoritmo di compressione

Ciao di nuovo! Ho trovato questo articolo scritto nel maggio 2019. Questa è la continuazione di una serie di articoli su WAVE e JPEG, qui prima. Questa pubblicazione includerà informazioni sull'algoritmo di codifica delle immagini e sul formato stesso nel suo insieme.

Un pizzico di storia

Un cucchiaio di articolo di Wikipedia:

JPEG (Joint Photographic Experts Group) è uno dei formati grafici raster più diffusi utilizzati per archiviare fotografie e immagini simili.

Questo standard è stato sviluppato dal Joint Photographic Experts Group nel 1991 per una compressione efficiente delle immagini.

Come passano le immagini da Raw a JPEG?

Alcune persone pensano che le immagini JPEG siano dati grezzi compressi utilizzando il metodo Huffman, ma questo non è vero. Prima di controllare la compressione, i dati viaggiano molto.

Innanzitutto, il modello di colore viene modificato da RGB a YCbCr. Esiste anche un algoritmo speciale per questo: qui. Y non viene toccato, poiché è responsabile della luminosità e il suo cambiamento sarà evidente.

La prima cosa da fare con l'immagine è "diradamento" (sottocampionamento). È facile da capire: viene presa una matrice di pixel 2x2, quindi vengono presi Cb e Cr, i valori medi di ciascuno dei componenti YCbCr di questi 4 pixel. COSÌ, abbiamo vinto 6 byte, invece di 4 Y, 4 Cb, 4 Cr abbiamo 4 Y e gli stessi Cb e Cr per ciascuno di essi (4 + 4 + 4 = 12; 4 + 1 + 1 = 6; 12 - 6 = 6). Anche su scala 2x2, la compressione con perdita con un rapporto di compressione 2:1 suona solida. Questo vale per l'intera immagine. E così - sono diminuiti di mezza taglia. E possiamo usare questa tecnica grazie alla nostra percezione del colore. Una persona noterà facilmente una differenza di luminosità, ma non di colore, se viene calcolata la media su un piccolo blocco di pixel. Il diradamento può essere effettuato anche in linea, 4 pixel in orizzontale e in verticale. La prima opzione viene utilizzata più spesso. Se la qualità dell'immagine è importante, la decimazione non viene eseguita affatto.
Un'illustrazione visiva del diradamento (Habr non mi ha permesso di inserire una gif) - https://i.ibb.co/Rg5Th9H/150953010617579181.gif

La parte principale della preparazione

Dkp

Ora arriva la parte più difficile e necessaria. L'intera immagine è divisa in blocchi 8x8 (il riempimento viene utilizzato se la risoluzione non è un multiplo del lato del blocco).

Ora applica a ciascun blocco DCT (trasformata coseno discreta). In questa parte tutto ciò che non è necessario viene eliminato dall'immagine. Utilizzando DCT è necessario capire se un dato blocco (8×8) descrive qualche parte monotona dell'immagine: il cielo, il muro; oppure contiene strutture complesse (capelli, simboli, ecc.). È logico che 64 pixel di colore simile possano essere descritti solo da 1, perché la dimensione del blocco è già nota. Questo per quanto riguarda la compressione: 64 a 1.

DCT trasforma il blocco in uno spettro e, laddove le letture cambiano bruscamente, il coefficiente diventa positivo e quanto più netta è la transizione, tanto maggiore sarà l'uscita. Dove il coefficiente è più alto, l'immagine mostra chiare transizioni di colore e luminosità, dove è più basso - cambiamenti deboli (fluidi) nei valori dei componenti YCbCr nel blocco.

Quantizzazione

Le impostazioni di compressione sono già applicate qui. Ciascuno dei coefficienti in ciascuna delle matrici 8x8 è diviso per un certo numero. Se non ridurrai la qualità dell'immagine dopo tutte le sue modifiche, il divisore dovrebbe essere uno. Se per te è più importante la memoria occupata da questa foto, il divisore sarà maggiore di 1 e il quoziente verrà arrotondato. Si scopre che dopo l'arrotondamento spesso ci si ritrova con molti zeri.

La quantizzazione viene eseguita per creare la possibilità di una compressione ancora maggiore. Ecco come appare usando l'esempio di quantizzazione del grafico y = sin(x):

JPEG. Algoritmo di compressione

compressione

Per prima cosa esaminiamo la matrice seguendo uno schema a zig-zag:

JPEG. Algoritmo di compressione

Otteniamo un array unidimensionale con numeri. Vediamo che ci sono molti zeri, possono essere rimossi. Per fare ciò, invece di una sequenza di molti zeri, inseriamo 1 zero e dopo di esso un numero che indica il loro numero nella sequenza. In questo modo puoi reimpostare a 1/3 la dimensione dell'intero array. E poi comprimiamo semplicemente questo array usando il metodo Huffman e lo scriviamo nel file stesso.

Dove usare

Ovunque. Come PNG, JPEG viene utilizzato nelle fotocamere, nei sistemi operativi (come loghi aziendali, icone di applicazioni, miniature) e in tutte le possibili aree in cui le immagini devono essere archiviate in modo efficiente.

conclusione

Al momento, la conoscenza del JPEG ha valore solo per scopi didattici, perché è già integrata ovunque e ottimizzata da grandi gruppi di persone, ma il granito della scienza è ancora gustoso.

fonti

Articolo su YCbCr su Wikipedia
Articolo di Wikipedia su JPEG
Un po' di PrEP dal post di Pikabu
Articolo di Wikipedia sulla PrEP

Fonte: habr.com

Aggiungi un commento