Esercizio - Zig-zag, run-length e flusso di bit di un blocco JPEG (domande ed esercizi del corso)
In questa pagina 4
Teoria: Compressione di immagini - DCT e standard JPEGPer comprimere con perdita non basta quantizzare i pixel (non sono sparsi): si applica una trasformata lineare ortogonale che concentra l'energia in pochi coefficienti, si quantizzano i coefficienti e si codificano senza perdita. Le trasformate ortogonali conservano l'MSE ($\frac1N|\mathbf x-\tilde{\mathbf x}|^2=\frac1N|\mathbf y-\tilde{\mathbf y}|^2$). JPEG baseline: si sottrae 128, si divide in blocchi $8\times8$, DCT 2D ($Y=AXA^T$), quantizzazione uniforme con tabella (passi piccoli a bassa frequenza, scalata da un fattore di qualità $Q$), zig-zag scan, DC codificato in modo differenziale con categoria/ampiezza, AC con coppie (run, categoria) e simbolo EOB, codici di Huffman non standardizzati scritti nel file. Esempio completo: un blocco da 512 bit diventa 49 bit (0,766 bit/pixel).Compressione di immagini - DCT e standard JPEG → (zig-zag, codifica del DC e degli AC, categorie, run-length) e Codifica lossless - entropia, Huffman e codifiche a dizionarioLa codifica lossless rappresenta i simboli di una sorgente con parole di codice a lunghezza variabile in modo invertibile; si usano codici a prefisso (istantanei). L'entropia $H(X)=\sum p_i\log_2\frac1{p_i}$ è il limite: $H(X)\le\mathcal L^*<H(X)+1$ (Shannon), con uguaglianza se le probabilità sono potenze di 1/2. Il codice di Huffman è ottimo ma lascia fino a 1 bit di overhead per simbolo; raggruppando $K$ simboli (codifica a blocchi) si tende al tasso entropico $\mathcal H(X)\le H(X)$, ma la complessità cresce come $M^K$; la codifica aritmetica ($\mathcal L<H+2$ per messaggio) ha complessità lineare. Altre tecniche: dizionario (LZ, DEFLATE di ZIP e PNG, ANS in Zstandard), Exp-Golomb e categoria/ampiezza (usati in JPEG e nei codec video) per interi con probabilità decrescente col modulo, codifica predittiva (si codifica l'errore di predizione, che ha entropia molto più bassa).Codifica lossless - entropia, Huffman e codifiche a dizionario →. Fonte: domande a risposta multipla ed esempi di preparazione, slide e demo jpeg del corso di Reti di Calcolatori, Ing. Informatica UniPD 2025-26. Conti verificati in Python. Il blocco di indici è quello ottenuto in Esercizio - Trasformata DCT e quantizzazione di un blocco JPEG (demo del corso).
Ordine dello zig-zag in un blocco (indici riga, colonna): : si percorrono le diagonali a partire dall'angolo in alto a sinistra, alternando il verso (sulle diagonali con pari si sale, sulle dispari si scende).
1. Zig-zag e run-length
Domanda 1. Dopo DCT e quantizzazione, un blocco ha i coefficienti (le ultime tre righe sono nulle). Quale affermazione è esatta? (a) dopo lo zig-zag scan e il run-length coding la sequenza è: ; ; ; ; ; ; ; EOB; (b) il blocco contiene soprattutto variazioni orizzontali; (c) il blocco contiene soprattutto alte frequenze; (d) dopo lo zig-zag e il run-length la sequenza è ; EOB.
Soluzione. Lo zig-zag percorre: (DC); ; ; ; ; ; ; ; ; ; ; poi solo zeri. Sequenza: .
- Il DC (20) si codifica a parte. Per gli AC il run-length sostituisce ogni gruppo di zeri con un conteggio: prima di nessuno zero ; prima di nessuno ; ; ; poi zeri e ; nessuno zero e ; infine solo zeri fino alla fine del blocco: EOB.
- (a) è esatta. (d) riporta la sequenza dello zig-zag con gli zeri scritti esplicitamente: manca il run-length (gli zeri non sono stati sostituiti da conteggi).
- (b) è falsa: i coefficienti non nulli stanno nella prima colonna, che contiene le variazioni verticali (l'indice di riga è la frequenza verticale; le variazioni orizzontali sono nella prima riga, dove c'è solo il 5).
- (c) è falsa: i coefficienti grandi (20, 12, 9, 9, 8) sono a frequenze basse, vicino all'angolo in alto a sinistra; le alte frequenze sono in basso a destra e valgono 0.
Domanda 2 (blocco ). Un blocco dopo DCT e quantizzazione è Qual è la sequenza corretta in formato run-length? (a) ; EOB, (b) ; EOB, (c) , (d) .
Zig-zag : , poi tutti zeri: . Dopo ogni coefficiente non nullo il successivo è immediatamente adiacente nell'ordine, quindi tutti i run sono : (a). (b) è la sequenza dello zig-zag senza la notazione ; (c) e (d) attribuiscono run diversi da zero, ma tra , , non c'è alcuno zero.
2. Codifica completa di un blocco (demo del corso)
Il blocco di indici dopo la quantizzazione con è Il DC del blocco precedente è 1.
Zig-zag. (DC); ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; poi zeri. La sequenza è (il primo è il DC; gli altri sono gli AC).
DC. Predittore: DC del blocco precedente . Errore . Categoria (codice ); ampiezza: su 1 bit , negativo complemento . Bit del DC: .
AC: simboli . Dopo il DC: ; ; ; ; ; ; ; ; ; EOB .
Bit. Con il codice di categoria del DC e il codice dei simboli : (EOB), , , , , :
| Simbolo | codice | valore ( bit, complemento se negativo) | bit | |
|---|---|---|---|---|
| DC | cat. 1 | |||
| EOB |
Flusso: 0100 11000 11000 0100 0110 11000 1110111 000 11000 000 1010 0100110001100001000110110001110111000110000001010, lunghezza bit. Bit per pixel: ; rispetto agli 8 bpp del blocco non compresso il rapporto è .
Decodifica (esercizio). Riportare il flusso ai simboli. Si legge un prefisso alla volta con le tabelle:
- : categoria 1; il bit successivo è un valore negativo (primo bit 0): si complementa , valore ; DC .
- , valore (1 bit, negativo): 1 zero poi .
- , valore : 1 zero poi .
- , valore negativo, complemento .
- , valore positivo .
- 1 zero, .
- , valore : 4 zeri, .
- , valore .
- 1 zero, .
- .
- EOB. Il primo bit del valore decide il segno: positivo, negativo (dopo aver complementato per ottenere il modulo). Riscrivendo gli AC in ordine di zig-zag si ritrova la sequenza di partenza: .
3. Un run lungo: il simbolo ZRL (costruito sul modello del corso)
Un blocco ha DC predetto con errore ; poi i coefficienti AC sono , poi 20 zeri, poi , poi solo zeri. Codifica.
- DC: , categoria (codice ), : bit .
- AC: primo simbolo : categoria di (): ; coppia codice ; valore : bit .
- Run di 20 zeri: un run non può superare 15, quindi si emette il simbolo speciale ZRL che vale 16 zeri consecutivi (codice ), e il run restante è : simbolo , categoria 2: coppia , codice ; valore : complemento : bit .
- EOB: .
Flusso:
01111 100101 11111111001 111111100001 101001111100101111111110011111111000011010, 38 bit (verificato con le tabelle del demo).
Errori tipici
- Percorrere il blocco a righe invece che a zig-zag, o girare nel verso sbagliato sulle diagonali.
- Contare l'EOB tra i coefficienti, oppure mettere un EOB se l'ultimo coefficiente è non nullo e in posizione 63 (in quel caso non serve).
- Includere il DC nelle coppie : il DC si codifica a parte, in differenza rispetto al blocco precedente.
- Dimenticare di complementare il valore per i negativi, o di usare la categoria per il numero di bit del valore.
- Scrivere con la categoria al posto del valore nel simbolo (la coppia codificata è ; il valore si aggiunge dopo).
Versione ripasso
Zig-zag: (diagonali costante, verso alternato). Il DC si codifica a parte (in differenza); gli AC con : zeri precedenti, il valore; EOB quando restano solo zeri; ZRL zeri.
Domanda 1. Prima colonna , prima riga , : zig-zag ; run-length ; EOB. (d) ha gli zeri espliciti (niente run-length); (b) falsa: non nulli nella prima colonna variazioni verticali; (c) falsa: coefficienti grandi a frequenze basse.
Domanda 2. Blocco con (colonna 0 e posizione ): zig-zag , tutti run 0: ; EOB. (b) senza coppie; (c), (d) run non nulli sbagliati.
Blocco della demo, . Zig-zag: EOB. DC: predittore 1, , cat. 1 (codice ), valore : . AC: EOB. Codici: , , , , , EOB . Valore su bit, complementato se negativo (, , ).
- Flusso:
0100 11000 11000 0100 0110 11000 1110111 000 11000 000 1010, 49 bit bit/pixel, rapporto . - Decodifica: prefisso , poi bit di valore (primo bit 1: positivo; 0: negativo, complementare per il modulo); DC precedente .
ZRL. DC (), AC (: ), 20 zeri ZRL (, 16 zeri) run 4 con : , valore ; EOB . Totale 38 bit: 01111100101111111110011111111000011010.
Errori tipici: scorrere a righe o nel verso sbagliato; contare l'EOB come coefficiente; includere il DC nelle coppie ; non complementare i negativi; confondere e .