Docsity
Docsity

Prepara i tuoi esami
Prepara i tuoi esami

Studia grazie alle numerose risorse presenti su Docsity


Ottieni i punti per scaricare
Ottieni i punti per scaricare

Guadagna punti aiutando altri studenti oppure acquistali con un piano Premium


Guide e consigli
Guide e consigli


Codifica di sorgente, Appunti di Teorie e tecniche della comunicazione multimediale

Codifica di sorgente, multimedia forensics anno 2025

Tipologia: Appunti

2025/2026

Caricato il 12/05/2026

rosaria-50
rosaria-50 🇮🇹

1 documento

1 / 15

Toggle sidebar

Questa pagina non è visibile nell’anteprima

Non perderti parti importanti!

bg1
MULTIMEDIA LEZIONE 5 (13.10)
La codifica di una sorgente
La codifica di sorgente si riferisce al processo di codifica e decodifica di un segnale digitale al fine
di ridurre il numero di bit necessari per memorizzarlo o trasmetterlo.
Se non facciamo nessuna forma di compressione quante immagini entrerebbero in una pennetta di
1Gb? Consideriamo un’immagine a colori; quindi, dobbiamo fare riferimento a 3 matrici, una per
ogni colore primario: 1 rosso, 1 verde, 1 blu. Ogni matrice ha M colonne e N righe (che sono il numero
di Pixel) e per ogni matrice usiamo 8k (k = bit per pixel). Dunque, una immagine in memoria ha:
3xMxNxk bit. Ad esempio, se abbiamo M = 3000, N = 4000, k = 8 esce che un’immagine occupa
34,3 Megabyte, contando che 1 Gigabyte sono 1000 Megabyte se lo dividiamo per 34 risulta 29.
Dunque, possiamo salvare solo 29 immagini in una pennetta di 1Gb.
Compressione JPEG
Che succede se usiamo una compressione? Riduciamo il numero di bit, dunque questo ci permette di
salvare più immagini. Ad esempio, la compressione JPEG (standard più usato per la compressione)
può ridurre l’occupazione di spazio di un’immagine di più di 8 volte. Dunque passiamo da 29
immagini salvate a 238 immagini. La compressione è inevitabile soprattutto per video e audio.
Quando ho 8 bit per pixel ho la possibilità di rappresentare 256 livelli possibili di grigi. Con 1 bit per
pixel, invece, posso rappresentare solo 2 livelli di grigio, perché posso avere solo due valori (0 o 1).
Dunque, con 1 bit per pixel, senza alcuna forma di compressione, ottengo un’immagine di questo
tipo:
In JPEG sta scritto 1 bit per pixel, ma è un’informazione media, cioè ci sono dei pixel che hanno 5
bit, altri invece 0, ecc. Quindi è mediamente 1 bit per pixel, che viene calcolata facendo la somma di
tutti i bit diviso il numero di pixel. Osservando le due immagini notiamo che a sinistra non vi è alcuno
pf3
pf4
pf5
pf8
pf9
pfa
pfd
pfe
pff

Anteprima parziale del testo

Scarica Codifica di sorgente e più Appunti in PDF di Teorie e tecniche della comunicazione multimediale solo su Docsity!

MULTIMEDIA LEZIONE 5 (13.10)

La codifica di una sorgente La codifica di sorgente si riferisce al processo di codifica e decodifica di un segnale digitale al fine di ridurre il numero di bit necessari per memorizzarlo o trasmetterlo. Se non facciamo nessuna forma di compressione quante immagini entrerebbero in una pennetta di 1Gb? Consideriamo un’immagine a colori; quindi, dobbiamo fare riferimento a 3 matrici, una per ogni colore primario: 1 rosso, 1 verde, 1 blu. Ogni matrice ha M colonne e N righe (che sono il numero di Pixel) e per ogni matrice usiamo 8k (k = bit per pixel). Dunque, una immagine in memoria ha: 3xMxNxk bit. Ad esempio, se abbiamo M = 3000, N = 4000, k = 8 esce che un’immagine occupa 34,3 Megabyte, contando che 1 Gigabyte sono 1000 Megabyte se lo dividiamo per 34 risulta 29. Dunque, possiamo salvare solo 29 immagini in una pennetta di 1Gb. Compressione JPEG Che succede se usiamo una compressione? Riduciamo il numero di bit, dunque questo ci permette di salvare più immagini. Ad esempio, la compressione JPEG (standard più usato per la compressione) può ridurre l’occupazione di spazio di un’immagine di più di 8 volte. Dunque passiamo da 29 immagini salvate a 238 immagini. La compressione è inevitabile soprattutto per video e audio. Quando ho 8 bit per pixel ho la possibilità di rappresentare 256 livelli possibili di grigi. Con 1 bit per pixel, invece, posso rappresentare solo 2 livelli di grigio, perché posso avere solo due valori (0 o 1). Dunque, con 1 bit per pixel, senza alcuna forma di compressione, ottengo un’immagine di questo tipo: In JPEG sta scritto 1 bit per pixel, ma è un’informazione media, cioè ci sono dei pixel che hanno 5 bit, altri invece 0, ecc. Quindi è mediamente 1 bit per pixel, che viene calcolata facendo la somma di tutti i bit diviso il numero di pixel. Osservando le due immagini notiamo che a sinistra non vi è alcuno

standard di compressione, mentre a destra vi è lo standard JPEG (l’occupazione in memoria è la stessa perché per entrambi abbiamo 1 bit per pixel): Inoltre, si può ancora ridurre il numero di bit ed utilizzare, ad esempio, un numero inferiore a 1 bit per pixel. Ad esempio, utilizziamo 0.27 bit per pixel. Notiamo che se riduciamo molto il numero di bit per pixel (quindi se riduco il passo di codifica) c’è differenza tra l’immagine originale e l’immagine compressa: Questi esempi però facevano tutti riferimento allo standard JPEG. Se si usano standard più recenti, come ad esempio JPEG2000 e WEBP, anche con un passo di 0,27 bit per pixel l’immagine è più simile all’originale, non vi è molta degradazione o modifica:

Ridondanza statistica La ridondanza statistica è quella che si usa anche quando si comprimono i dati in zip perché è quella che permette di ridurre il numero di bit senza alterarne il contenuto. Si può ridurre un file testuale o un’immagine senza modificarne il contenuto. La ridondanza statistica, come abbiamo detto, si basa su delle regolarità ossia delle caratteristiche statistiche del segnale (esempio: la ripetitività). Ad esempio, vogliamo comprimere il primo capitolo di Frankenstein. Per semplificare non consideriamo la punteggiatura, ma solo le 26 lettere dell’alfabeto (dalla A alla Z). Le 26 lettere le posso rappresentare attraverso 5 bit (perché con 5 bit posso rappresentare 32 possibilità, quindi le 26 lettere rientrano in queste 32 possibilità. Quindi, utilizzo 5 bit per ogni lettera). Nel primo capitolo ci sono 8155 lettere, dunque saranno 40775 bit. Qui non si è utilizzata nessuna forma di ridondanza. Se guardiamo l’istogramma delle lettere del primo capitolo (ossia ogni lettera quante volte compare nel capitolo) notiamo che alcune lettere sono molto presenti come la E e la T, mentre altre poche volte come la J e la Q. Dunque, a questo punto, che senso ha usare lo stesso numero di bit per ogni lettera? Possiamo utilizzare una strategia più efficace: per le lettere che sono più presenti usiamo meno bit, mentre, per le lettere che sono meno presenti usiamo più bit. Useremo, dunque, molte volte pochi bit e solo in casi eccezionali useremo molti bit. Tutto ciò è già stato fatto nel 1800 ed è il Codice Morse, che è la prima forma di codifica intelligente. In questo codice il punto e il tratto si possono considerare come 0 e 1, dunque la codifica Morse è una codifica in bit (perché utilizza un codice binario). In questa codifica non esiste un numero di tratti uguali per tutte le lettere, ma le lettere più presenti hanno pochi tratti (ad esempio la T ha un solo tratto), mentre le lettere meno presenti hanno più tratti (ad esempio la J ha 3 tratti).

A questo punto proviamo a codificare il primo capitolo di Frankenstein usando questo approccio; quando ci capiteranno la E e la T un solo bit, due bit pe la A, I N e M, e così via. Il capitolo avrà così in totale 20674 bit, si riduce così il numero di bit. Rispetto a 40775 bit, abbiamo ridotto il numero di bit necessario di quasi la metà utilizzando solo l’informazione statistica su quali lettere dell’alfabeto erano più ricorrenti. Possiamo spingerci anche oltre, ossia contando quando capitano coppie o terne di lettere e così via. In questo caso possiamo ulteriormente ridurre il numero di bit. Effettivamente nella lingua inglese vi sono delle coppie che sono molto frequenti (come AN, TH, ecc.); mentre altre sono poco frequenti (come FB, NZ, ecc.). Queste informazioni possono essere utilizzate per ridurre ulteriormente il numero di bit necessari. In questo caso utilizziamo una ridondanza statistica che è di ordine superiore al primo. La ridondanza statistica esiste anche nelle immagini. Si considera un blocco di immagine (ossia una matrice numerica). All’interno della matrice potrebbe esserci un numero compreso tra 36 e 56, ed è poco probabile che ci sia ad esempio uno 0 o un 200. Questa è una ridondanza statistica, perché abbiamo delle situazioni in cui è più probabile che vi sia un numero piuttosto che un altro. Se invece ci troviamo in una situazione in cui tutti i valori sono ugualmente probabili non abbiamo ridondanza statistica.

Esistono altri tipi di ridondanza psicofisica, come la sensibilità al cambiamento, chiamata contrast sensitivity. Il contrasto è l’indice di quanto varia qualcosa: se vi è una grande variazione tra bianco e nero c’è forte contrasto; se vi è una piccola variazione tra bianco e nero c’è poco contrasto. Dunque, la contrast sensivity è la sensibilità alle variazioni di luminosità. Più è piccola la variazione di luminosità più è difficile rilevarla. Questa è diversa per ogni individuo e diminuisce con l’età. La variazione di grigio è inutile salvarla nel file, posso fare in modo di unirle tutte perché l’uomo non percepisce la differenza. Ciò dipende anche dalla frequenza, ossia dalla velocità di variazione di luminosità (quanto veloce passo dal bianco al nero, e viceversa). La percezione di un unico grigio è influenzata dalle frequenze, a frequenze medie riesco meglio a vedere i cambiamenti di luminosità, mentre a basse frequenze è molto visibile la variazione.

La codifica dell’immagine: codifica lossless e codifica lossy La codifica si divide in 2 categorie:

  • Codifica lossless (o entropica): comprime i dati senza perdita di informazioni. Sfrutta solo la ridondanza statistica. Il segnale finale corrisponde a quello iniziale; dunque, non vi sono distorsioni
  • Codifica lossy: comprime i dati considerando una perdita di informazioni marginale. Si basa su entrambe le ridondanze. Il segnale codificat non corrisponde a quello originale di partenza, ci sono quindi delle distorsioni Funzionalità della codifica: tasso di codifica e misura di distorsione Se devo valutare la funzionalità di una codifica utilizzo due indici: tasso di codifica e misura di distorsione. Il tasso di codifica indica il numero di bit che vado a consumare, cioè quanti bit utilizzerò nel mio segnale compresso. Tale tasso viene normalizzato per il numero di campioni. Dunque per le immagini si parla sempre di numero di bit usati diviso il numero di pixel per l’immagine. Più basso è il valore di questo tasso, più immagini posso inserire all’interno della mia pennetta. Le misure di distorsione quantificano la differenza tra il segnale decodificato e quello originale, una misura di distorsione è il Mean Squared Error (MSE). Dato che c’è il quadrato il valore è sempre positivo, > o = di 0. Quando è uguale a 0 non abbiamo distorsione, se è maggiore di 0 abbiamo distorsioni. Immaginiamo di avere l’immagine di partenza (quella prima di comprimerla) e l’immagine ottenuta dopo la decodifica (ossia dopo la compressione). Sugli assi abbiamo: in orizzontale il tasso (misurato in bit/pixel), in verticale abbiamo la distorsione (misurata in Mean Squared Error, ossia MSE). Ogni punto in questo piano è una possibile soluzione del codificatore, ha introdotto una certa distorsione e ha compresso un certo tot dell’immagine. Qual è il punto ideale che vorremmo? Ovviamente il punto d’origine (ossia il punto 0,0), in cui non si introduce distorsione, ma è un ideale impossibile. Dunque, un buon codificatore deve selezionare un punto vicino all’ideale: più il punto è vicino a quello ideale più il codificatore sta funzionando bene;

Tutte le codifiche lossy si basano sulla quantizzazione per ridurre l’informazione. Di solito i passaggi che si adottano sono tre:

  1. Prima si cerca di ridurre le dipendenze e le correlazioni che esistono tra i pixel (operazione chiamata di decorrelazione)
  2. Poi fa un’operazione di quantizzazione, che è quella che introduce distorsione
  3. Poi vi è una parte di codifica entropica, ossia usare le rimanenze delle ridondanze statistiche per ridurre ulteriormente il numero di bit Schema del codificatore JPEG JPEG = è uno standard di codifica lossy dell’immagine creato nel 1992 da un comitato di ricercatori esperti di codifica formato nel 1986 denominato “Joint Photographic Experts Group”. L’immagine ha 3 passi per essere compressa: abbiamo la parte della decorrelazione dei dati; la parte di riduzione dell’informazione e quindi di introduzione della distorsione, ossia la quantizzazione; e infine abbiamo la codifica entropica che usa le ultime ridondanze statistiche per ridurre ulteriormente il numero di bit. La codifica JPEG lavora su una codifica 8×8. Dunque, l’immagine viene scomposta in blocchi non- sovrapposti di dimensione 8x8 pixel. Se il numero di righe o di colonne non è multiplo di 8 le aggiunge alla fine per assicurarsi che sia multiplo di 8. Prende l’immagine e la divide in blocchi da 8×8. Trasformata Coseno Discreta (DCT) Il primo passaggio è la Decorrelazione, in cui: ad ogni blocco viene effettuata la trasformata coseno discreta (1 blocco è scritto come combinazione di 64 blocchi fondamentali. Dunque, un blocchettino è scritto come scomposizione di quei 64 blocchi. Questi blocchi sono quelli della DCT e abbiamo

vari tipi di blocchi: ossi blocchi a bassa frequenza, in cui le variazioni dal bianco al nero variano piano; fino ad arrivare a blocchi ad alta frequenza, in cui le variazioni dal bianco al nero variano velocemente. Inoltre, esistono sia variazioni in orizzontale che in verticale). Per ogni blocco 8x8 si può scrivere come combinazione di tutti questi 64 usando degli specifici numeri. Prendiamo un tot del primo + un tot del secondo + un tot del terzo e così via; sommandoli tutti quanti riusciamo ad ottenere il blocco che vogliamo rappresentare dell’immagine. Quindi possiamo scrivere poi tutti questi numeri in una matrice e quindi abbiamo 64 coefficienti. Per ogni blocco ottengo 64 coefficienti DCT.

Quantizzazione Dopo aver trasformato la foto a blocchi, si esegue la quantizzazione. Ogni coefficiente viene diviso per il passo di quantizzazione (che si intende utilizzare) e arrotondato all’intero più vicino. È questa la fase in cui viene introdotta la distorsione. Dunque, ho un intervallo di valori che viene rappresentato con lo stesso valore. In questo caso, prima di approssimare all’intero più vicino, abbiamo un parametro delta (chiamato passo di quantizzazione) che dobbiamo regolare. Quindi, prendiamo i coefficienti DCT e come prima cosa li dividiamo per delta; poi, successivamente, li approssimiamo all’intero più vicino. Il passo di quantizzazione, in questo caso, è quello che ci dà il trade-off. Immaginiamo di scegliere un delta pari ad 1. Quindi prendo tutti i coefficienti DCT li divido per 1 e poi li approssimo all’intero più vicino. Notiamo una grande presenza di zero: con la codifica entropica puntiamo a rappresentare una sequenza lunga di zeri con pochi bit riduco enormemente il numero di bit. La presenza di molti zero è tipica dei blocchi uniformi. Con delta pari a 2 ogni coefficiente DCT viene diviso per 2 e poi approssimato all’intero più vicino. Più aumenta delta e più aumentano gli zeri. E avere tanti zeri significa che posso utilizzare ancora meno bit per rappresentare questa matrice.

Dunque, il passo di quantizzazione è quello che ci dà il trade-off della curva tasso di distorsione. Questa curva se uso un delta piccolo non introduco molta distorsione e quindi sarà vicina all’origine (utilizzerò molti bit); al contrario, se uso un delta grande avrò molta distorsione, dunque, la curva si distanza dal punto ideale (utilizzo meno bit). Il coefficiente in alto a sinistra ossia il coefficiente DC è più importante degli altri. Perché non usare un delta più piccolo per quello? E quindi si definisce la matrice dei delta o Tabella dei delta. Questa matrice mi fa usare delta piccoli per i coefficienti DC e man mano che vado in basso a destra utilizzo delta più grandi. Questo lo facciamo perché la sensibilità dipende dalle variazioni, quando la variazione è molto forte, l’occhio umano non è molto sensibile e quindi posso buttare più informazione per le alte frequenze. Mentre, se le frequenze sono basse posso buttare meno informazioni perché l’occhio umano è più sensibile. Per fare ciò utilizzo un passo di quantizzazione diverso. Dunque, il delta non è uguale per tutti, ma esiste una matrice dei delta chiamata tabella di quantizzazione. Tale tabella deriva da numerosi studi in cui si sono sperimentate varie tabelle. Questi studi si basano sulla percezione visiva e sono stati eseguiti su dei volontari che davano un giudizio sulla qualità dell’immagine, ovviamente venivano scelte le immagini distorte di meno. Tali studi hanno portato a tabelle di quantizzazione con passi di quantizzazione piccoli per le basse frequenze e passi di quantizzazioni grandi per le alte frequenze. La tabella, dunque, è totalmente arbitraria e viene salvata all’interno del file JPEG (dunque, nella parte inziale del file viene formata questa matrice). All’interno dello standard ci sono 100 tabelle di default da poter utilizzare: se utilizziamo la tabella 1 introduciamo molte distorsioni, se utilizziamo la tabella 100 utilizziamo poca distorsione.