JPEG. Algoritmo di compressione

E di nuovo, ciao! Ho trovato questo articolo scritto nel maggio 2019. Questo è un seguito a una serie di articoli su WAVE e JPEG. Ecco il primo. Questa pubblicazione includerà informazioni sull'algoritmo di codifica delle immagini e sul formato stesso in generale.

Un pizzico di storia

Un cucchiaio di articolo da Wikipedia:

JPEG (Joint Photographic Experts Group) è uno dei formati grafici raster più popolari, utilizzato per memorizzare fotografie e immagini simili.

Questo standard è stato sviluppato dal Gruppo Unito di Esperti in Fotografia nel 1991 per una compressione efficiente delle immagini.

Quale percorso seguono le immagini dal loro stato grezzo a JPEG

Alcuni pensano che le immagini JPEG siano dati grezzi compressi con il metodo di Huffman, ma non è così. Prima della compressione di controllo, i dati seguono un lungo percorso.

Prima di tutto, il modello di colore viene cambiato da RGB a YCbCr. Per questo c'è anche un algoritmo speciale - qui. Non tocchiamo Y, poiché è responsabile della luminosità, e la sua modifica sarebbe evidente.

La prima cosa che si fa con l'immagine è «subsampling» (sottocampionamento). È semplice da capire: si considera un array di pixel 2x2, poi si prendono Cb e Cr - i valori medi di ciascuno dei componenti YCbCr di questi 4 pixel. E così, abbiamo risparmiato 6 byte, invece di 4 Y, 4 Cb, 4 Cr abbiamo ottenuto 4 Y e Cb e Cr uguali per ognuno di essi (4 + 4 + 4 = 12; 4 + 1 + 1 = 6; 12 - 6 = 6). Su scala anche 2x2, la compressione con perdita con un rapporto di compressione di 2:1 suona solido. Questo viene applicato a tutta l'immagine. E così - abbiamo ridotto la dimensione della metà. E questo approccio lo possiamo utilizzare grazie alla nostra percezione del colore. Una persona noterà facilmente la differenza nella luminosità, ma non nel colore, se è mediato in un piccolo blocco di pixel. Inoltre, il sottocampionamento può essere eseguito in linea, 4 pixel in orizzontale e verticale. Il primo metodo è usato più spesso. Se la qualità dell'immagine è importante, il sottocampionamento non viene eseguito affatto.
Un'illustrazione visiva del sottocampionamento (Habr non ha permesso di inserire il gif) - https://i.ibb.co/Rg5Th9H/150953010617579181.gif

La parte principale della preparazione

DCT

Ora passiamo alla parte più complessa e necessaria. L'intera immagine viene divisa in blocchi 8x8 (viene utilizzato il riempimento nel caso in cui la risoluzione non sia un multiplo della dimensione del blocco).

Ora a ciascun blocco viene applicato DCT (Trasformata discreta del coseno). In questa parte dell'immagine viene estratto tutto l'eccesso. Utilizzando il DCT, è necessario capire se questo blocco (8×8) descrive una parte monotona dell'immagine: cielo, muro; o se contiene una struttura complessa (capelli, simboli, ecc.). È logico che 64 pixel simili per colore possano essere descritti da un solo valore, poiché la dimensione del blocco è già nota. Ecco a voi la compressione: 64 a 1.

Il DCT trasforma il blocco in uno spettro, e dove le letture cambiano drasticamente, il coefficiente diventa positivo, e più brusco è il passaggio, maggiore sarà l'uscita. Dove il coefficiente è più alto, nell'immagine ci sono transizioni nette di colore e luminosità, dove è più basso — cambiamenti deboli (morbidi) dei valori dei componenti YCbCr nel blocco.

Quantizzazione

Qui vengono applicate le impostazioni di compressione. Ognuno dei coefficienti in ciascuna delle matrici 8×8 viene diviso per un numero specifico. Se non desiderate ridurre ulteriormente la qualità dell'immagine dopo tutte le sue modifiche, il divisore deve essere uno. Se è più importante per voi la memoria occupata da questa fotografia, il divisore sarà maggiore di 1, e il quoziente viene arrotondato. Risultato: spesso, dopo l'arrotondamento, si ottiene molti zeri.

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

JPEG. Algoritmo di compressione

Compressione

Iniziamo a scorrere la matrice a zig-zag:

JPEG. Algoritmo di compressione

Otteniamo un array unidimensionale con i numeri. Vediamo che contiene molti zeri, che possono essere rimossi. A tal fine, invece di una sequenza di molti zeri, scriviamo 1 zero e dopo di esso un numero che indica la loro quantità nella sequenza. In questo modo, è possibile ridurre fino a 1/3 delle dimensioni dell'intero array. Successivamente, questo array viene semplicemente compresso mediante il metodo di Huffman e inserito direttamente nel file.

Dove viene utilizzato

Ovunque. Come PNG, JPEG è utilizzato in fotocamere, sistemi operativi (come loghi aziendali, icone delle applicazioni, miniature) e in tutti i settori in cui è necessario memorizzare le immagini in modo efficace.

Conclusione

Attualmente, le conoscenze su JPEG sono preziose solo a scopi educativi, poiché è già integrato ovunque e ottimizzato da grandi gruppi di persone, ma il granito della scienza è comunque appetitoso.

Fonti

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

Fonte: habr.com

Acquista hosting affidabile per siti web con protezione DDoS, VPS VDS server 🔥 Acquista hosting affidabile per siti web con protezione DDoS, VPS VDS server | ProHoster