E ciao di nuovo! Ho trovato questo articolo, scritto nel maggio del 2019. Questo è un seguito di una serie di articoli su WAVE e JPEG. Ecco . Questa pubblicazione includerà informazioni sull'algoritmo di codifica delle immagini e sul formato stesso.
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 congiunto di esperti fotografi già nel 1991 per comprimere le immagini in modo efficace.
Quale percorso seguono le immagini dalla loro forma grezza 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.
Inizialmente, il modello di colore viene cambiato da RGB a YCbCr. A questo proposito, 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 è «l'assottigliamento» (subcampionamento). È semplice da capire: si prende una matrice di pixel 2x2, quindi si prendono Cb e Cr — i valori medi di ciascuno dei componenti YCbCr di questi 4 pixel. E così, abbiamo guadagnato 6 byte, invece di 4 Y, 4 Cb, 4 Cr abbiamo ottenuto 4 Y e gli stessi per ciascuno di essi Cb e Cr (4 + 4 + 4 = 12; 4 + 1 + 1 = 6; 12 — 6 = 6). Anche a livello di 2×2, una compressione con perdita con un rapporto di compressione 2:1 suona solida. Questo viene applicato all'intera immagine. E così — abbiamo ridotto la dimensione della metà. E questo metodo possiamo usarlo grazie alla nostra percezione del colore. Una persona noterà facilmente la differenza di luminosità, ma non nel colore, se è mediato in un piccolo blocco di pixel. Inoltre, il campionamento può essere eseguito in linea, 4 pixel in orizzontale e verticale. La prima opzione è usata più spesso. Se la qualità dell'immagine è importante, il campionamento non viene eseguito affatto.
Un'illustrazione chiara del campionamento (Habr non ha permesso di inserire il GIF) —
La parte principale della preparazione
DCT
Ora la parte più complessa e necessaria. L'intera immagine viene suddivisa in blocchi 8×8 (si utilizza il padding se la risoluzione non è un multiplo del lato del blocco).
Ora a ciascun blocco viene applicato DCT (Trasformata Discreta del Coseno). In questa fase si rimuovono tutte le parti superflue dell'immagine. Utilizzando la DCT, è necessario capire se questo blocco (8×8) descrive una parte monotona dell'immagine, come il cielo o una parete, oppure se contiene una struttura complessa (capelli, simboli, ecc.). È logico che 64 pixel simili per colore possano essere descritti da un solo valore, dato che la dimensione del blocco è già nota. Ecco a voi la compressione: 64 a 1.
La DCT trasforma il blocco in uno spettro, e dove le letture cambiano drasticamente, il coefficiente diventa positivo; più brusco è il cambiamento, più alto sarà il valore d’uscita. Dove il coefficiente è più alto, ci sono transizioni nette nel colore e nella luminosità; dove è più basso, ci sono cambiamenti deboli (morbidi) nei valori dei componenti YCbCr nel blocco.
Quantizzazione
Qui vengono già applicate le impostazioni di compressione. Ogni coefficiente in ciascuna delle matrici 8×8 viene diviso per un certo numero. Se non intendete ridurre ulteriormente la qualità dell'immagine dopo tutte le sue modifiche, il divisore deve essere uno. Se invece vi importa di più dello spazio occupato da questa fotografia, il divisore sarà maggiore di 1 e il quoziente verrà arrotondato. È così che dopo l’arrotondamento si ottengono frequentemente molti zeri.
La quantizzazione viene eseguita per creare opportunità di compressione ancora maggiori. Ecco come appare con la quantizzazione del grafico y = sin(x):

Compressione
Iniziamo a percorrere la matrice a zig-zag:

Otteniamo un array unidimensionale di numeri. Vediamo che contiene molti zeri, che possono essere rimossi. A questo scopo, invece di una sequenza di molti zeri, scriviamo un solo zero seguito da un numero che rappresenta la loro quantità nella sequenza. In questo modo si può ridurre fino a 1/3 della dimensione dell'intero array. Poi, questo array viene compresso usando il metodo di Huffman e inserito nel file stesso.
Dove viene utilizzato
Ovunque. Come PNG, JPEG è utilizzato nelle fotocamere, nei sistemi operativi (come loghi aziendali, icone delle applicazioni, miniature) e in tutti i settori in cui è necessario memorizzare immagini in modo efficiente.
Risultato
Attualmente, le conoscenze su JPEG sono utili solo a fini educativi, poiché è già integrato ovunque e ottimizzato da grandi gruppi di persone, ma la roccia della scienza resta comunque succulenta.
Fonti
Fonte: habr.com
