Compressione dei dati Appunti di Sistemi A cura del prof. Ing. Mario Catalano Compressione di dati Cosa significa comprimere i dati? Eliminare l'informazione ridondante, in modo da poter rappresentare lo stesso documento con un minor numero di bytes. Vantaggi e svantaggi della compressione dei dati Risparmio della spazio quando si memorizzano i file; Risparmio di tempo all’invio del file. Tempo impiegato per comprimere e decomprimere un file; il file compresso non è usabile direttamente, per usarlo si deve decomprimere; il file compresso è più “fragile”. Alcuni errori di trasmissione possono alterarne il contenuto. Formati di file compressi (i più conosciuti) Zip Rar 7Z Jar Ace Arj ISO (per immagini di CD o DVD) Tecniche di compressione Si dividono in due categorie: Compressione dati lossy (con perdita di informazione); Compressione dati lossless (senza perdita di informazione). Osservazione: La percentuale di compressione ottenibile dipende: 1. dall’algoritmo utilizzato 2. dalla propensione dei dati a essere compressi università ca'foscari di Venezia - corso di sistemi di elaborazione delle informazioni Comprimere un testo (loseless) Nei computer i caratteri vengono codificati usando il codice ASCII "American Standard Code for Information Interchange", cioè "Standard americano per lo scambio di informazioni": codice di 8 bit per ogni simbolo ad esempio: 01100001 in binario rappresenta la lettera a. Un file di 100 caratteri quindi occuperà sempre 800 bit (8 bit * 100 caratteri = 800) sia esso composto da 100 caratteri differenti piuttosto che da 100 identici. Comprimere un testo (loseless) Visto che in tutti i file testo alcuni caratteri appaiono con una frequenza maggiore di altri non avrebbe senso assegnare a questi un codice composto da un numero inferiore di bit in modo da risparmiare spazio nella codifica? Codifica di Huffman È un algoritmo di usato per la compressione dei dati, basato sul principio di trovare il sistema ottimale per codificare stringhe a seconda della frequenza relativa di ciascun carattere. Compressione di Huffmann La lunghezza di ogni parola del codice non è identica per tutti i simboli: i simboli più frequenti (che appaiono più spesso) sono codificati con delle piccole parole di codice, mentre i simboli più rari ricevono dei codici binari più lunghi. Si parla allora di codifica a lunghezza variabile (in ingleseVLC per variable code length) Esempio di compressione Huffman Vogliamo comprimere un file testo contenente la stringa: CIAO_MAMMA In un normale file testo, ogni lettera è rappresentata da 8 bit codificati rispettando il codice ASCII. Il nostro file salvato sarà composto così da 80 bit. Per prima cosa è necessario contare la frequenza di ogni lettera nella nostra stringa: C(1) I(1) A(3) M(3) O(1) _(1) Codifichiamo A e M con sequenze di 2 bit e gli altri con sequenze di 3 bit; ad esempio: A=10, M=11, C=000, I=001, O=010, _=011 Ottengo un testo compresso di 24 bit, invece di 80! Compressione a dizionario è basata sull'idea di rimpiazzare, in un file, occorrenze di stringhe ripetute con puntatori a precedenti copie. La compressione è dovuta al fatto che la lunghezza di un puntatore è in genere più piccola della lunghezza della stringa che è rimpiazzata. Compressione a dizionario Maggiori sono le ripetizioni di occorrenze di stringhe nel file da comprimere, maggiore è il grado di compressione raggiunta. Quindi, una delle attività dell'algoritmo di compressione è trovare la stringhe che si ripetono. Quest'attività è svolta inserendo il file in un buffer di dati, chiamato dizionario. La velocità dell'algoritmo dipende dalla struttura dati utilizzata per implementare il dizionario, dall'algoritmo utilizzato per trovare i match tra le stringhe del file prese in considerazione e le stringhe presenti nel dizionario. Compressione a dizionario (LZW) La famiglia degli algoritmi a dizionario, ha molte varianti, la principale è detta LZW ed è la base del formato ZIP. Essa ha il vantaggio di comprimere in modo semplice ed efficiente tipi di dati eterogenei, come testo, immagini, database, ecc. È possibile applicare questo tipo di compressione non solo a testo, ma a qualunque sequenza che si ripete. Compressione RLE (RLE = run length encoding) Si sostituiscono le sequenze di bit con un codice che indica il valore ripetuto e quante volte si ripete nella sequenza. Funziona bene quando i dati da comprimere sono scomponibili in lunghe sequenze di valori identici ripetuti. Un esempio (?) Esempio: "A A A A A A A A A A A A A A A A A A A A A A A A A A AAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAA A A A A" (600 bytes) "300 volte `A ' " (13 bytes) Compressione RLE Sia M (messaggio da comprimere) una configurazione di bit costituita da: 253 bit posti a 1, seguiti da 118 bit posti a 0, seguiti da 87 bit posti a 1 E’ più compatto rappresentare in binario 253 x 1, 118 x 0, 87 x 1 11111101111101100010101111 ad esempio dedicando 8 bit alla cardinalità e 1 bit al simbolo per ciascun blocco rispetto ad elencare i 458 bit. Compressione Lossy Per comprimere dati come il suono o le immagini, dove una perdita di qualità potrebbe non essere notata viene usata la compressione lossy . Gli algoritmi di compressione lossy quindi, sacrificano parte dei dettagli contenuti, ad esempio in un'immagine, in favore di un maggiore rapporto di compressione. Solitamente tali differenze non risultano percettibili, in quanto la parte di informazione persa è comunque quella che l'utente non avrebbe notato. Eliminando, perciò, alcuni dettagli di un'immagine non la deterioreremo. è bene sottolineare che una compressione lossy comporta una perdita permanente di dati. JPEG (Joint Photographic Experts Group) JPEG è il primo formato compresso Lossy. I meccanismi di compressione risultano particolarmente adatti ad immagini contenenti un elevato numero di colori per la memorizzazione di immagini fotografiche o di disegni molto sfumati. Negli altri casi, come cartoon, forniscono risultati generalmente peggiori di altri formati, sia in termini di qualità sia di dimensione dei file. JPEG, non usa un metodo fisso di compressione. E' possibile scegliere il grado di compressione che si desidera applicare a un'immagine, determinando in questo modo anche la qualità dell'immagine. Più si comprime un'immagine, più se ne riduce la qualità. JPEG: come funziona Si può applicare solo alle immagini raster (cioè alle fotografie). Per diminuire la dimensione dell'immagine, JPEG elimina alcuni pixel, che verranno poi ricostruiti (non esattamente uguali) in fase di decompressione. JPEG tuttavia è stato progettato in modo tale che i pixel eliminati siano quelli meno percepibili per l'occhio umano il quale è più sensibile alle piccole variazioni di luminosità che alle piccole variazioni di colore. Così se JPEG trova due pixel vicini di minima variazione di luminosità li conserva, ma se trova due pixel vicini di minima variazione di colore ne tiene uno solo. Altri formati Lossy e Codec MP3, WMA, MPC, OGG per l’audio MPEG, DivX per il video Operano nel loro settore con una tecnica simile a JPEG (tralasciano informazioni che apparentemente non servono) I codec sono parti software che dicono al sistema quali algoritmi applicare alle immagini per codificarle o decodificarle. Codec Praticamente tutti i codec moderni sono lossy, perdono parte dell'informazione cercando di ottenere il massimo di compressione possibile. Nel caso degli ultimi codec sviluppati si è visto un progressivo interesse nei confronti delle tecniche cosiddette “psicovisuali” quelle cioè che studiano il modo in cui il cervello percepisce le informazioni da un video in movimento. Sfruttando queste caratteristiche del cervello alcuni sviluppatori hanno inserito nei loro codec degli algoritmi che si occupano di gestire i bit di informazione in modo più preciso, dedicando maggiore precisione di codifica per le aree dell'immagine che il cervello percepisce maggiormente e sottraendo dati a tutte quelle zone dell'immagine che non sono riconosciute dal cervello, ad esempio comprimendo di più le scene veloci con immagini sfumate oppure quelle completamente buie in cui il cervello umano non è in grado di estrapolare dettagli. Con questo metodo pesantemente “lossy” per i dati, ma impercettibile per gli umani, gli sviluppatori sono riusciti a fare un ulteriore salto in avanti nella qualità e nel grado di compressione delle immagini in movimento.