| MPEG1 | MPEG2 | MPEG4 |
| E'
il formato più "vecchio" ed oggi non viene praticamente
più utilizzato. Sono disponibili diversi programmi gratuiti che
consentono di creare video MPEG-1, quali ad esempio TMPGEnc. |
E'
il formato utilizzato nei DVD e nei SVCD. Si tratta attualmente del
formato video che consente di ottenere la qualità migliore,
sebbene i migliori codec di compressione non siano molto abbordabili in
termini di prezzo. |
E'
lo standard più recente, ed i codec di compressione MPEG4 sono
tutt'ora in fase di sviluppo. Pensato anche per lo streaming video
(trasmissione tramite internet) è in grado di fornire una
qualità sostanzialmente identica a quella di un DVD in 1/4 - 1/3
dello spazio (a parità di risoluzione). I più promettenti
codec MPEG-4 sono il noto DivX (a pagamento nella versione con piene
funzionalità) e la sua controparte opensource Xvid, liberamente
utilizzabile a fini non commerciali. |
| Utilizzi possibili: creazione di
video CD (VCD) compatibili con i normali lettori DVD da tavolo. In un
VCD è possibile inserire generalmente 30-40 minuti di video,
sebbene la qualità non sia paragonabile a quella del suo
successore MPEG-2, quanto piuttosto a quella di una videocassetta VHS. |
Utilizzi possibili: creazione di
super video CD (SVCD) o di DVD compatibili con i normali lettori DVD da
tavolo. Il formato SVCD consente una qualità notevolmente
superiore al vecchio VCD, e generalmente è possibile inserie
40-45 minuti di video di buona qualità (superiore a quella di
una VHS) in un comune CD da 80 minuti. A mio avviso, disponendo di un
programma con codec di compressione MPEG-2, è il formato ideale
in cui salvare i video provenienti dalla videocamera digitale se
si desidera una qualità discreta ed una buona
compatibilità. |
Utilizzi possibili: è
teoricamente possibile inserie fino ad 1 ora e mezza di video di buona
qualità in un solo CD (con risoluzioni fino a 640x368 punti), ed
è l'ideale per comprimere i DVD in uno o due CD. Tuttavia il
formato non risulta compatibile con i normali lettori DVD (che
decodificano solo video MPEG-1 e MPEG-2). Solo recentemente sono stati
introdotti lettori da tavolo in grado di riprodurre DivX (od Xvid),
tuttavia, la loro compatibilità non è garantita (data
l'elevata variabilità dei formati e dei parametri di
compressione utilizzati). |
| I differenti e
possibili approcci della compressione video A. Tecniche relative al modo di memorizzazione del video stesso, in combinazione con le caratteristiche del sistema visivo umano. E' possibile comprimere un video riducendo la precisione con cui vengono memorizzate le informazioni: un esempio tipico di questo tipo di compressione, nel caso di un flusso video digitale, è il passaggio dallo spazio di colore RGB a tutta una serie di spazi di colore denominati YUV; si ha una reale perdita di informazione, che risulta tuttavia difficilmente notabile per l'inferiore sensibilità al colore dell'occhio umano. B. Tecniche che sfruttano alcune caratteristiche intrinseche al video stesso E' possibile comprimere un segnale video rimuovendo la ridondanza (ripetitività) statistica contenuta in un video e mantenendo solo le nuove informazioni, ovvero quelle effettivamente utili; si cerca cioè una rappresentazione "meno correlata" delle immagini, correlata nel senso delle similitudini all'interno dello stesso fotogramma e tra fotogrammi adiacenti, eliminando quindi nel possibile tutte le "ripetizioni". Quindi, dato che è statisticamente provato che pixels adiacenti (vicini) all'interno di una stessa immagine, presentano caratteristiche molto simili per quel che riguarda il colore e la luminosità (cosa del resto piuttosto intuitiva: se considero una porzione azzurra di cielo, con buona probabilità pixel vicini avranno lo stesso colore), venne ideata la codifica intra-frames che si occupò per l'appunto di rimuovere questa ripetitività o ridondanza spaziale all'interno dello stesso fotogramma. Inoltre, dato che esiste una netta correlazione non solo tra i pixel dello stesso fotogramma, ma anche tra i pixels di fotogrammi adiacenti. Infatti, dato che ogni secondo si susseguono diversi fotogrammi (25 nello standard PAL), è logico aspettarsi che un fotogramma ed i due a lui vicini (il successivo ed il precedente) spesso risultano pressoché identici (fanno eccezione le situazioni in cui si hanno cambi di scena); questa correlazione, ridondanza temporale tra fotogrammi vicini che ne sfrutta le loro minime differenze, venne trattata con l'implementazione della codifica inter-frames. C. Tecniche che sfruttano intensivamente le caratteristiche del sistema visivo umano. Studiando la percezione che l'occhio e del cervello umano hanno della realtà ed in particolare del movimento, ci si è resi conto della scarsa sensibilità del sistema visivo umano nei riguardi delle cosidette alte frequenze video. Il concetto di frequenza nel video è associato alla "complessità" di una scena: “…le basse frequenze corrispondono ai colori uniformi (un cielo sereno senza nubi, il colore di una automobile) mentre le alte frequenze corrispondono alle immagini frastagliate tipo le foglie di un albero visto da lontano, i quadrettini minuti di una giacca, o i caratteri minuti della pagina di un giornale...” (1). E' possibile "tagliare", buttar via, alcune delle informazioni sulle alte frequenze di un'immagine senza per questo portare ad un visibile deterioramento dell'immagine stessa. Per come è strutturato, il sistema visivo umano non è in grado di percepire le variazioni nei dettagli di figure molto frastagliate; è molto difficile rendersi conto di una perdita di dettaglio nelle fronde di alcuni alberi in movimento; molto più semplice invece notare anche la più piccola variazione di colore o luminosità nell'azzurro di un cielo limpido e sereno sullo sfondo di un video (DCT e quantizzazione). |

| n° fotogramma |
1 |
2 |
3 |
4 |
| tipo di fotogramma: | I |
B |
B |
P |
| n° fotogramma |
1 |
4 |
2 |
3 |
| tipo di fotogramma: | I |
P |
B |
B |
| n° fotogramma |
1 |
4 |
| tipo di fotogramma: | I |
P |
| n° fotogramma |
1 |
4 |
2 |
| tipo di fotogramma: | I |
P |
B |
| n° fotogramma |
1 |
4 |
2 |
3 |
| tipo di fotogramma: | I |
P |
B |
B |
Sequenze video con
scene in rapido movimento o con un'elevata dinamica
sono molto più impegnative da codificare e richiedono un numero
di bit (bitrate)
più elevato: essendo maggiori
le differenze tra i fotogrammi adiacenti, maggiori sono le informazioni
che devono essere memorizzate e conservate. Al contrario, scene statiche con movimenti lenti o pochi cambi di scena, presentano minime differenze tra fotogrammi adiacenti, minime differenze che si traducono con un numero decisamente inferiore di informazioni da mantenere e trasmettere ovvero con un basso bitrate. |

| Intra-Frames (I-Frames) ![]() |
Delta-Frames
o Inter-Frames (P e B-Frames)![]() |
|||
Sugli
I-frames non viene effettuata nessuna
modellizzazione del moto![]() |
3) Modellizzazione
del moto: Motion Estimation e Motion Compensation, Inter-Frames
Prediction |
|||
| La
procedura è piuttosto complessa ed è difficile
sintetizzare il tutto in poche righe. Tenterò di illustrarvi
solo
i concetti di base in modo tale che vi facciate per lo meno un'idea
generale. Ripeto: le cose in realtà non sono così
semplici. In questa fase viene sfruttata la ridondanza temporale dei
fotogrammi del video, ovvero il fatto che fotogrammi adiacenti
(successivi) risultano tra loro molto simili. Per citare l'esperto ;) "se un pixel in un certo frame ha un certo
colore, lo stesso pixel o quelli vicini, nei fotogrammi successivi o
precedenti con buona probabilità avranno un colore simile"(1).
In pratica ora vengono
costruiti i
P-frames ed i B-frames. Come? Con due procedure: 1) Motion Estimation (ME): per ciascun macroblocco 16x16 o blocco 8x8 (a seconda della precisione sulla ricerca del moto, la ricerca viene effettuata sui macroblocchi 16x16 o sui blocchi 8x8; di seguito utilizzerò sempre il termine blocco, restando sottinteso che potrebbe anche trattarsi di un macroblocco) viene effettuata una stima del movimento; in pratica l'encoder tenta di individuare tra i fotogrammi adiacenti (nel solo fotogramma precedente per i P-Frames, nel precedente e nel successivo per i B-Frames) il blocco più simile (se non uguale). Dopodichè viene associato al blocco su cui è stata effettuata l'analisi, un vettore di moto, cioè una coppia di numeri tipo (x,y) = (-1,4) che individuano sul piano ipotetico rappresentato dal fotogramma, il vettore di spostamento, sostanzialmente una freccia che mi indica direzione, verso e entità dello spostamento del blocco passando dal fotogramma 1 al fotogramma 2. Tale vettore deve essere necessariamente associato ad ogni blocco su cui viene effettuata la ME, e viene utilizzato in fase di decodifica per ricostruire l'immagine originale. Si noti inoltre che la ricerca per il blocco di riferimento viene generalmente effettuata in un intorno limitato del blocco di partenza (area in grigio nella figura in basso) in quanto se la ricerca fosse effettuata su tutto il fotogramma, i tempi per la codifica potrebbero allungarsi in modo non accettabile; l'efficenza del metodo è assicurata dal principio della rindondanza spaziale: la probabilità di trovare un blocco simile man mano che ci si allontana dal blocco di partenza, diminuisce in modo esponenziale con l'aumentare della distanza.
2)
Motion Compensation (MC): viene creato il blocco differenza, in
pratica viene sostituito il blocco originale su cui è stata
effettuata la ricerca, con il risultato che si ottiene sottraendo dal
blocco molto simile trovato del fotogramma 1 (reference frame) il blocco in
questione nel fotogramma 2. Se tutto ha funzionato a dovere, ovvero
l'encoder non ha commesso errori nella ricerca del blocco di
riferimento
(nel fotogramma 1), si ottiene un netto vantaggio consistente nel fatto
che il nuovo blocco "differenza" sarà costituito da un numero
decisamente inferiore di dati (nella matrice del blocco saranno
presenti
molti zeri (colore nero)). Le uniche informazioni aggiuntive da
considerare saranno quelle relative al vettore di moto (una coppia di
numeri). |
||||




![]() |
![]() |
| Fotogramma
A |
Fotogramma
B (successivo) |
![]() |
| L'immagine differenza tra
i due fotogrammi A e B, senza Motion Compensation |
![]() |
![]() |
| Fotogramma
A con tracciati i vettori di moto |
L'immagine differenza tra i due fotogrammi A e B, con Motion Compensation |
NOTA
BENE: tenete sempre a mente che
ogni fotogramma (immagine) di cui è composto il video viene
suddiviso in macroblocchi di 16x16 pixels (o blocchi di 8x8), ed
è lavorando su questi blocchi che il video viene compresso.
Quando catturate, ridimensionate o comprimente un video, se possibile adottate una risoluzione, ovvero un numero
di pixels
verticali ed orizzontali che siano un multiplo di 16, come ad esempio
640x272 piuttosto che 640x280. In altre parole fate si che le
dimensioni orizzontali e verticali del video siano divisibili per 16
(senza resto!). Sebbene molti codec consentano anche dimensioni
multiple di 8, di 4 o di 2, per una compressione ottimale sono da
preferirsi comunque multipli di 16. |
1) lo spazio
occupato dal video è sostanzialmente ininfluente, ciò che
conta è la sola qualità.
|
2) Siamo in presenza di uno spazio limitato, ma non vogliamo rinunciare alla qualità: cerchiamo il miglior compromesso tra spazio occupato e qualità del video. |
||
Una situazione
del genere potrebbe verificarsi
ad esempio se si desidera mantenere i video digitali su di
un disco fisso dedicato (dischi di grosso taglio, superiore ai 120GB
sono oggi piuttosto
economici). Oppure, data la rapida diffusione ed il costante ribasso
dei
prezzi, si potrebbe optare per i supporti DVD: i
4,7GB di un supporto DVD (o gli 8,5 nel caso di un DVD doppio strato),
sono sicuramente più che
sufficienti per un normale video di 3-4 ore in Mpeg4 ad elevata
risoluzione (es. 1024x576), lasciando anche spazio libero per eventuali
tracce audio multicanale. In questi casi, non ci si preoccuperà
dello spazio disponibile o di quello
occupato dal video, quanto piuttosto di ottenere la massima
qualità possibile.
|
Qui le cose si
complicano un po',
perché ora quello che interessa non è più la
sola qualità video, ma anche lo spazio occupato dal video, vuoi
ad esempio perché vogliamo sfruttare al massimo il nostro
supporto DVD+/-R inserendovi più di un film, vuoi perché
ad esempio stiamo usando dei supporti CD-R (scelta tutt'altro che rara,
data la loro elevata economicità) per conservare i nostri video.
|
||


| Se non interessa sprecare CD, o non vi scoccia dividere il film in più supporti anche se non strettamente necessario, il problema sostanzialmente non si pone. |
| Durata
del film (video di 640x352 pixel) |
Numero
di CD (da 700MB) |
| Inferiore a 1h 00m | 1 |
| tra 1h 00m e 2h 00m | 2 |
| tra 2h 00m e 3h00m | 3 |
| Le cose si complicano se invece siete decisamente tirchi e/o pigri e non volete sprecare un CD in più di quelli effettivamente necessari per ottenere una buona qualità (come il sottoscritto ad esempio ;). |
| "The Mothman Prophecies" di 115 minuti, risoluzione 640x272 | è stato compresso in un solo CD, con una dimensione del file video di 555MB; facendo un po' di conti, risulta un rapporto bit/pixel = 0,15 |
| "Balck Hawk Down" di 138 minuti, risoluzione 640x256 | è stato compresso in due CD, con una dimensione del file video di 1167MB; facendo un po' di conti, risulta un rapporto bit/pixel = 0,29 |
| Test di comprimibilità |
Alcuni software, quali GordianKnot, consentono di effettuare un test sulla comprimibilità prima della codifica del film, ed il test è effettuabile sia con il codec Xvid, sia con il DivX. Iniziano ad essere disponibili anche i primi software che consentono di effettuare test di comprimibilità con praticamente qualunque codec video. Per il codec Xvid potete usare Enc by Jonny, che tra le varie cose permette anche di gestire anche la compressione del video (tramite VirtualDub). Come funziona un test di comprimibilità? Viene praticamente compressa e codificata una piccola parte del video (generalmente il 5%); terminata la compressione, note le dimensioni del file risultante e nota la percentuale di video compressa, è possibile risalire alle dimensioni che avrebbe il video intero compresso, commettendo generalmente un errore di qualche punto percentuale. Un test di comprimibilità simile a quello effettuato da GordianKnot (comprimendo ad esempio il 5% del film) potrebbe essere implementato utilizzando, all'interno di in uno script per AviSynth 2.5 il filtro SelectRangeEvery (video_di_input, periodo, num_fotogrammi) (è un filtro build-in, interno, di AviSynth, disponibile solo nelle versioni 2.5 e successive, ma non disponibile nelle versioni precedenti), dove periodo è un numero intero che descrive ogni quanti fotogrammi verranno selezionati il numero di fotogrammi specificati in num_fotogrammi. Ad esempio SelectRangeEvery(1000,50) seleziona 50 fotogrammi ogni 1000: vengono selezionati i fotogrammi 0-50, 1000-50, 2000-50, ecc... Si tratta quindi di effettuare la codifica con VirtualDub o con un altro programma a piacere, e, note le dimensioni del video corrispondente al 5% dell'intero film, stimare la dimensione finale del video moltiplicando tale valore per 20 (es: se il file video corrispondente al 5% risulta avere una dimensione di 75MB, è probabile che l'intero video abbia una dimensione finale di 75x20=1500MB). Per rendere attendibile il risultato vi consiglio di scegliere degli intervalli piuttosto ampi (1000-2000), onde consentire al codec di effettuare un certo grado di compensazione del moto. Questo metodo, in genere, data l'esiguità della parte di video da comprimere (generalmente il 5%) non richiede molto tempo. |
| Creazione del video durante il primo passaggio o analisi del file stats |
E' il metodo sostanzialmente più preciso, ma che non consente di conoscere la possibile dimensione del nostro video se non al termine del primo passaggio. Disabilitando l'opzione "Discard first pass" nella finestra di configurazione "Two Pass" del codec Xvid, durante il primo passaggio viene creato dal codec il video con quantizers = 2. Al termine si potrà quindi conoscere la dimensione del video creato alla massima qualità e quindi avente dimensione massima. Note le dimensioni del file video, è quindi possibile avere un'idea della comprimibilità, ovvero quanto sia comprimibile il video, ovvero quanti MB siano necessari per la massima qualità; più basso è questo valore, più il video risulta favorevolmente comprimibile, e quindi minore risulta lo spazio (o il numero di CD) di cui abbiamo bisogno per ottenere una qualità paragonabile all'originale. In genere si può ottenere un'ottima qualità impostando nella finestra del secondo passaggio, come dimensioni finali per il video, un valore tra il 70% e l'80% delle dimensioni del video ottenuto con la qualità massima (quantizer = 2). Potreste ottenere una qualità accettabile anche con un valore attorno al 60% (ma qui dipende da cosa intendete per accettabile). Anche senza creare il video durante il primo passaggio (ad esempio nel caso abbiate problemi di spazio), è comunque possibile conoscerne le dimensioni utilizzando alcuni programmi che leggono il file stats; uno tra tutti "Nitrogen's XviD Stats Viewer", decisamente generoso nelle informazioni che è in grado di elargire. |
Concludendo:
partendo dalla durata del film è possibile farsi solo un'idea di
partenza molto approssimativa dello spazio necessario per una buona
codifica; tenendo poi conto del tipo di film che andiamo a comprimere,
ovvero se ci troviamo in una situazione particolarmente favorevole
(film molto scuro, statico, con poche scene d'azione) potremmo
ipotizzare di essere in una situazione di materiale video altamente
comprimibile e quindi accettare anche valori del rapporto bit/pixel
estremamente bassi. A questo punto si potrebbero verificare le ipotesi
di partenza effettuando un test di comprimibilità oppure
effettuare un primo passaggio e procedere quindi all'analisi del file
stats. Questo ed un pò di pratica ed esperienza, dovrebbe essere
tutto quello di cui avrete bisogno per creare dei video perfetti anche
dal punti di vista qualitativo, senza inutile spreco di tempo e spazio
(ovvero CD-R). |
Appendice A - I "difetti" dovuti ad una cattiva compressione video |
||||
Se il video è ben compresso (ovvero è stato usato un bitrate sufficientemente elevato per ogni situazione), generalmente potrebbe essere difficile distinguerlo dall'originale non compresso o compresso in altri formati ad elevata qualità. Ad esempio, è possibile ridurre di circa 1/3 le dimensioni di un video in formato MPEG2 (es. un DVD) convertendolo in MPEG4 (Xvid o DivX) e non essere in grado di notare (se non ad una più attenta analisi) una sostanziale differenza. Talvolta però se il bitrate non è sufficientemente elevato e se non si è configurato propriamente l'encoder, si possono presentare alcuni difetti tipici della compressione Mpeg e non dovuti magari ad un baco (bug) dell'encoder stesso. I più evidenti sono due e vengono generalmente indicati con il nome di "blocking-artifact" e "mosquito-noise".
Il "blocking-artifacts" o "blocchettizzazione" o "quadrettatura" che dir si voglia, è causato da una eccessiva compressione del fotogramma, cosa che consente l'individuazione dei blocchi in cui è stata suddivisa l'immagine ai fini della compressione prima dell'utilizzo della DCT (maggiori dettagli). Il fenomeno è causato da una non perfetta corrispondenza tra i diversi blocchi a causa di un numero troppo elevato di informazioni che sono state "eliminate" al momento della quantizzazione della matrice delle frequenze DCT (maggiori dettagli). Il "mosquito-noise" detto anche "ringing" si presenta invece come un alone di disturbo, rumore accanto agli oggetti che presentano una netto contrasto con lo sfondo. Le immagini qui sopra aiutano a chiarire i due concetti ed illustrano i due più tipici difetti causati da un compressione eccessiva basata sugli algoritmi Discrete Cosine Transform, ovvero da un bitrate non adeguato alla situazione. Due sono i metodi per eliminare questi difetti:
|
Appendice
B - Undersize (video
sottodimensionato) e problemi simili.
|
Quanto qui descritto si riferisce alla sola modalità di compressione in due passaggi (2 Pass - ...). Undersize Per quel che riguarda la dimensione finale desiderata, come ho avuto io stesso modo di sperimentare, in taluni casi si può ottiene un file più piccolo di quanto richiesto ("undersize", sottodimensionato). In un caso, ad esempio, sebbene avessi impostato una dimensione di 1275MB, il file al termine della conversione, non superava i 900MB. Motivo? Qualcuno aveva inizialmente parlato di un bug nel codec quando vengono attivate alcune funzioni avanzate (Qpel, B-Frames etc...), ma in realtà non è così. Il fenomeno è dovuto al fatto che, con i parametri scelti, il codec riesce tranquillamente ad utilizzare la massima qualità possibile rimanendo al di sotto del massimo bitrate disponibile. In pratica il film risulta ottimamente comprimibile, il bitrate va in saturazione, e si ottiene un file più piccolo del richiesto. Possibili soluzioni sono quelle di aumentare la risoluzione del video, ad esempio mantenendo la risoluzione originale di 720 pixel di larghezza, senza ridimensionare a 640, e/o utilizzare dei valori più bassi nei vari quantizer (lasciando invariato 2 come "Min ...quantizer", provate ad abbassare "Max... quantizer" e/o abbassate "Maximum / Minimum I-frame interval", qualcosa tipo 250/1 invece di, ad esempio, 300/5) e/o utilizzare 100/100 in B-frame quantizer Ratio/Offset oppure ancora disabilitare del tutto l'uso dei B-Frames (Maximum B-frames = -1). Ricordate tuttavia che se da una parte la cosa può essere fastidiosa (nel caso abbiate ad esempio fatto tutti i conti con l'audio, per sfruttare appieno i 2 CD) dall'altro potrete ricomprimere l'audio ad una qualità nettamente superiore od in alternativa inserire anche una seconda traccia audio. Non necessariamente infatti un file di dimensioni inferiori significa che avrete un video di qualità inferiore, dato che il codec avrà comunque utilizzato la massima qualità possibile in base ai parametri che gli avevate assegnato. Nel caso che, oltre ad un file sottodimensionato, il video risulti anche di scadente qualità, assicuratevi di non aver usato una versione dell'encoder video con qualche baco (se è una versione non ufficiale, la possibilità non è del tutto da scartare), e provate a ripetere il tutto installando una differente versione del codec Xvid. Oversize Problemi opposti, ovvero video sovradimensionato rispetto a quanto richiesto, sono in genere causati da un errore di implementazione della curva di compressione. Non mi è mai capitato di incontrare un simile problema usando la curva di compressione interna del codec; piuttosto può capitare di incorrere in tali errori nel caso si stia utilizzando un programma esterno per la configurazione del codec. Ho incontrato tali problemi utilizzando ad esempio Vidomi+Xvid per la compressione video. Soluzioni sono quelle di provare con una differente versione del codec o se il problema non si risolve, utilizzare un differente programma o se possibile, la curva di compressione interna al codec stesso. |
Appendice
C - PSNR (Peak Signal Noise Ratio)
|
||||||||||||||||||||||
Per la valutazione della qualità di un video compresso ci si basa generalmente su di un giudizio soggettivo, per così dire "ad occhio", e si formula un giudizio basandosi ad esempio su di una scala come quella illustrata qui di seguito:
Tuttavia è possibile valutare anche numericamente (matematicamente) la qualità di un video o di un'immagine compressa con un metodo di compressione lossy misurando la distorsione introdotta tra l'originale e la copia compressa. Tra i metodi più utilizzati, vi è il calcolo del PSNR, ovvero Peak Signal-to-Noise Ratio, la cui espressione matematica è la seguente: ![]() L'unità di misura è il decibel (dB) cosa che ci si poteva aspettare se si tiene conto che il PSNR si calcola sostanzialmente come un rapporto segnale / rumore, dove per il segnale si usa una stima di massima considerando l'immagine completamente bianca (valore 255), mentre il rumore viene calcolato come varianza (sigma2) dell'immagine errore (|X-Y|), immagine che si ottiene effettuando la differenza pixel a pixel tra l'immagine non compressa (X) e l'immagine compressa e successivamente decompressa (Y). Il perché il valore 255 corrisponda al bianco è presto detto: anzitutto si deve tener conto che il PSNR confronta solo le componenti della luminanza delle due immagini (la componente Y), mentre non vengono confrontate le componenti dei colori (Cr e Cb). Ora, dato che il video è codificato nel sistema YUV 4:1:1, dove la componente Y utilizza una risoluzione di 8 bit per pixel, ricordando che il maggior numero decimale rappresentabile con un numero n di bit è dato dalla formula Max = 2n-1 (nel nostro caso 28-1 = 255), al valore 0 corrisponde il nero, mentre al valore 255 il bianco (e tutti i valori intermedi sono diverse tonalità di grigio). Per quel che riguarda il denominatore, è necessario un piccolo ripasso di statistica con due definizioni:
Applicando il tutto al nostro caso, ovvero all'immagine errore, dove ogni pixel ha coordinate |x(i,j) - y(i,j)| e sommando su tutti i pixel, si ottiene: ![]() dove l'immagine ha una risoluzione di Larghezza x Altezza (L x A) pixel, ogni pixel ha coordinate (i,j), con i = 1...L, j = 1...A, x(i,j) è il valore del pixel nell'immagine originale non compressa y(i,j) è il valore del medesimo pixel nell'immagine compressa e dove ![]() è il valore medio dei pixel dell'immagine differenza Chiuso con la teoria, al lato pratico il PSNR tipicamente assume valori compresi tra 20 e 50 dB (con due cifre decimali significative del tipo 43,54 dB) e valori più elevanti testimoniano un qualità superiore ovvero una maggior fedeltà con l'originale non compresso. La seguente immagine aiuta a farsi un'idea del rapporto tra esistente tra valore del PSNR, bitrate e qualità soggettiva percettibile: ![]() Fonte: Compression lectures, Prof.dr.ir. Inald Lagendijk, Digital Signal Coding, Cap1, Introduction http://www-ict.its.tudelft.nl/~inald/vcdemo/lectures.htm E' necessario sottolineare che piccole variazioni del PSNR, dell'ordine di 1-2 dB, difficilmente saranno evidenziabili con un giudizio soggettivo e che sebbene utilizzato universalmente per la valutazione della qualità di un'immagine, il PSNR è in grado di dire relativamente poco sulla gravità di alcuni difetti di compressione quali la "blocchettizzazione" ed il "ringing". Per maggiori dettagli e per una procedura pratica su come effettuare un test per il calcolo del PSNR, consiglio di leggere l'ottima guida scritta da Kaiousama dal titolo "Guide To PSNR Computation Via AviSynth" e che dovreste trovare al seguente indirizzo: http://www31.brinkster.com/kaiousama/video_main.htm (nel caso il link fosse cambiato, provate a ricercare in rete l'homepage dell'autore); la guida richiede l'uso di AviSynth in combinazione con Virtualdub. Un altro piccolo software (funziona da riga di comando) piuttosto comodo e che permette il confronto in PSNR tra due file video con estensione avi, è PSNR4avi che potete trovare a questo indirizzo: http://vsofts.com/codec/codec_psnr.html. Potrebbe ad esempio essere utilizzato per il calcolo del PSNR tra il video codificato con quantizer costanti uguali a 2 (primo passaggio) ed il file video risultante al termine del secondo passaggio. Fonti: Prove sperimentali sulla compressione lossy, tesi dall'università di Milano. Rimozione di Blocking-Artifacts da immagini codificate con DCT, di Andrea Coslovich e Daniele Palazzolo Guide To PSNR Computation Via AviSynth, Kaiousama Digital Signal Coding, Prof.dr.ir. Inald Lagendijk |
Appendice D - Rate-Distortion |
||
La teoria Dal punto di vista teorico, la teoria del Rate-Distortion (banda, bitrate - distorsione) è un branca delle teoria dell'informazione che si occupa del problema di determinare il minimo livello di informazione che può essere trasmessa o mantenuta, affinché il segnale originale possa essere ricostruito con un livello di distorsione non superiore ad un determinato valore. In tal senso quindi tale teoria fornisce un limite teorico al livello di compressione ottenibile usando dei metodi di compressione con perdita di informazione (lossy). Molte delle tecniche di compressione esistenti per la musica, il video, la voce, le immagini ecc... utilizzano al loro interno procedure di trasformate (es. DCT), quantizzazione e allocazione del bit-rate che derivano dalla forma generale delle funzioni sulla teoria che lega la banda disponibile (bitrate od in generale rate) ed il livello di distorsione ottenuto. Il termine "rate" viene generalmente accomunato al numero di bits per campione di dati che devono essere trasmessi od archiviati. Il concetto di "distortion" invece richiede una discussione un pò più ampia. Nel caso più semplice (che fortunamente coincide con la maggior parte dei casi), si definisce distorsione la discordanza, differenza, tra il segnale in entrata "I" (l'originale) e quello in uscita "O" (il segnale compresso e quindi decompresso) ed è possibile ad esempio quantificarlo matematicamente tramite l'errore quadratico medio (Mean Square Error, MSE) della differenza:
Tuttavia, dato che la maggior parte delle tecniche di compressione "lossy" operano su dati che hanno a che fare con il sistema sensoriale umano (ascoltare della musica, vedere un'immagine od un video), la misura della distorsione dovrebbe rendere conto anche di alcuni aspetti di quest'ultimo. Nella compressione audio, modelli percettivi sensoriali, ovvero misure percettive della distorsione, sono ampiamente sviluppati e largamente utilizzati in algoritmi di compressione quali l'mp3, ma spesso non è così semplice incorporarli nei modelli pratici. Nella compressione delle immagini e del video, i modelli sensoriali umani sono invece meno sviluppati e la loro applicazione è per lo più ristretta alla scelta dei coefficenti delle matrici di quantizzazione e di normalizzazione nelle compressioni JPEG ed MPEG. Tralasciando ora la parte più stretta di analisi matematica che richiederebbe una certa conoscenza di base (e che non ho tempo ne spazio a sufficienza per spiegarvi, anche perché mi costringerebbe ad un ripasso accelerato di statistica ed analisi 2 ;-), veniamo al succo della questione e riassumiamo il problema:
![]() Dal grafico possiamo ad esempio stabilire che ad un determinato bitrate R1, il minimo livello di distorsione ottenibile sarà D1 (si ricordi che minore il livello di distorsione, più fedele all'originale è il video o l'immagine compressa). Ad un bitrate più basso R2 < R1, necessariamente il livello di distorsione non potrà essere inferiore ma dovrà aumentare, ed il suo valore minimo sarà D2 > D1. --------------------------------------------------
Nel caso del codec Xvid, l'algoritmo funziona a livello dei singoli macroblocchi in cui viene suddivisa l'immagine, prendendo in considerazione un vasto numero di parametri durante la fase della stima del moto (motion estimation). Per ogni blocco, vengono considerate la bontà della stima di moto in termini di precisione sull'individuazione del blocco corrispettivo nel fotogramma adiacente, il numero di bit impiegati per memorizzare tale scenario e la qualità finale del blocco stesso. In base a tutti questi criteri, il codec decide se utilizzare o meno lo scenario corrente per la motion estimation (ME). La teoria del livello di distorsione interviene nella scelta dello scenario per limitare il degrado qualitativo entro un valore stabilito; potrebbero presentarsi situazioni in cui spendendo qualche bit in più si ottiene un livello qualitativo notevolmente più alto rispetto alla situazione con bitrate più basso in assoluto. Si vuole quindi basare la scelta non solo sul bitrate utilizzato, ma anche sulla qualità ottenibile ed è per questo che l'algoritmo sceglie non solo in base al numero di bit risparmiati ma anche in base al livello di distorsione introdotto. Fonti: Rate distortion theory, Wikipedia, the free encyclopedia Digital Signal Coding, Prof.dr.ir. Inald Lagendijk Doom9's Xvid Forum |