JPEG baseline · blocchi 8×8 · DCT
Algoritmo JPEG passo per passo
Una demo interattiva per seguire un singolo blocco: luminanza, spostamento di livello, DCT, quantizzazione, scansione zig-zag, run-length coding e codifica Huffman.
- Blocco
- x 0, y 0
- Qualità
- 50
- Coefficienti non nulli
- 0 / 64
- Bit entropici
- 0
Passo 1
Da RGB a luminanza e spostamento di livello
JPEG baseline lavora di solito nello spazio YCbCr. Qui seguiamo il canale di luminanza \(Y\), perché è il più importante per la percezione dei dettagli. Prima della DCT i valori vengono centrati intorno allo zero.
Passo 2
Discrete Cosine Transform 2D
La DCT riscrive il blocco come somma di 64 pattern cosinusoidali. Il coefficiente \((0,0)\) è la componente DC, cioè il livello medio; gli altri coefficienti descrivono frequenze spaziali via via più alte.
Passo 3
Quantizzazione: il punto in cui JPEG perde informazione
Ogni coefficiente DCT viene diviso per un passo di quantizzazione e poi arrotondato. I passi sono più grandi alle alte frequenze, dove l'occhio umano è meno sensibile.
Passo 4
Scansione zig-zag
Dopo la quantizzazione molti coefficienti ad alta frequenza diventano zero. L'ordine zig-zag mette prima le frequenze basse e tende a raggruppare gli zeri in fondo alla sequenza.
Passo 5
Run-length coding
Il coefficiente DC viene codificato come differenza dal blocco precedente in ordine raster. Gli AC vengono rappresentati con triple \((\text{RUN},\text{SIZE},\text{AMPLITUDE})\): RUN conta quanti zeri precedono il valore non nullo, SIZE è il numero di bit necessari per scrivere l'ampiezza.
| Tipo | Run | Size | Valore | Evento | Bit ampiezza |
|---|
Passo 6
Codifica Huffman entropica
JPEG baseline associa un codice Huffman al simbolo DC o AC e concatena i bit di ampiezza. La demo usa le tabelle standard di luminanza JPEG: nel file reale questi bit verrebbero poi impaccati in byte e inseriti nello stream insieme ai marker.
Lo zig-zag fissa l'ordine delle frequenze, ma lo stream non contiene tutti i 64 coefficienti uno per uno. Dopo la RLE contiene eventi a lunghezza variabile: differenza DC, coppie \((RUN,SIZE)\), simboli ZRL ed EOB. Il simbolo Huffman serve a dire al decoder quale evento sta arrivando e quanti bit di ampiezza deve leggere subito dopo.
| # | Evento | Huffman | Bit ampiezza | Totale |
|---|