









Studia grazie alle numerose risorse presenti su Docsity
Guadagna punti aiutando altri studenti oppure acquistali con un piano Premium
Prepara i tuoi esami
Studia grazie alle numerose risorse presenti su Docsity
Prepara i tuoi esami con i documenti condivisi da studenti come te su Docsity
Trova i documenti specifici per gli esami della tua università
Preparati con lezioni e prove svolte basate sui programmi universitari!
Rispondi a reali domande d’esame e scopri la tua preparazione
Riassumi i tuoi documenti, fagli domande, convertili in quiz e mappe concettuali
Studia con prove svolte, tesine e consigli utili
Togliti ogni dubbio leggendo le risposte alle domande fatte da altri studenti come te
Esplora i documenti più scaricati per gli argomenti di studio più popolari
Ottieni i punti per scaricare
Guadagna punti aiutando altri studenti oppure acquistali con un piano Premium
Codifica di sorgente, multimedia forensics anno 2025
Tipologia: Appunti
1 / 15
Questa pagina non è visibile nell’anteprima
Non perderti parti importanti!










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:
Tutte le codifiche lossy si basano sulla quantizzazione per ridurre l’informazione. Di solito i passaggi che si adottano sono tre:
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.