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 . 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 - . 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) -
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):

Compressione
Iniziamo a scorrere la matrice a zig-zag:

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
Fonte: habr.com
