Coordinamento di Luciano Giustini |
di Cristiano Paris
State navigando il Web; sono le due di notte e, dopo un'estenuante ricerca, finalmente siete riusciti a trovare quel link che cercavate. Spostate trepidanti il puntatore sull'agognato collegamento, e il vostro browser lancia la richiesta al server... ecco, la pagina comincia a comparire ma... disgrazia ! Il sito è pieno zeppo di enormi immagini TRUE COLOR che il vostro misero modem comincia a caricare ad una velocità esasperante. Così, dopo qualche decina di minuti e con la pagina che ancora è lì che deve essere caricata, decidete, a malincuore, di abbattere la comunicazione e andarvene a dormire.
E purtroppo, nonostante questo sia l'incubo di quasi tutti i navigatori, pagine piene di grafica coloratissima continuano a spuntare come funghi. D'altro canto però, come sarebbe la nostra bella Home Page senza tutti quei fronzoli, o senza quello sfondo meraviglioso ? E allora ci si arrangia come meglio si può, cercando compromessi (come ha fatto ultimamente la Microsoft con la sua neonata rivista on-line Slate) che però non sempre riescono a soddisfarci. Certo, un sistema ci sarebbe : usare JPEG a tutto spiano; però non sempre forniscono un rapporto di compressione sufficientemente elevato e, molto spesso, degradano l'immagine in maniera insopportabile. IL PROBLEMACominciamo dall'inizio. Un'immagine possiede alcune caratteristiche che influiscono direttamente sulla sua occupazione : esse sono la larghezza, l'altezza e la profondità. Non penso di dover spiegare cosa significhino le prime due, ma forse, per la terza, occorrono ulteriori spiegazioni. In pratica, la profondità indica la quantità di colori che un'immagine può contenere. Ad esempio, una tipica immagine larga 640 pixel, alta 400 e profonda 8, potrà contenere, al più, 256 colori (2^8 = 256). Attraverso queste tre caratteristiche è possibile stimare con precisione l'occupazione in byte di un'immagine : basterà infatti moltiplicare fra loro detti valori e dividere il tutto per otto. Ad esempio, l'immagine di cui sopra occuperà 640x400x8 / 8 = 256000 bytes (ovvero 250Kb).Una tale occupazione è ovviamente inaccetabile per la maggior parte delle applicazioni, e quindi occorre cercare di ridurla con degli artifici più o meno efficaci. Vediamo quali possano essere considerando ad esempio questa immagine : Come potete vedere essa contiene un gran numero di pixel bianchi e rossi consecutivi e questo ci suggerisce un'idea di come sia possibile ridurne l'occupazione. Se infatti cambiamo il modo di descrivere l'immagine e cominciamo a contare, preliminarmente, tutti i pixel consecutivi di uno stesso colore, possiamo descriverne un gruppo attraverso una coppia di byte che indichino, il primo il numero di pixel consecutivi e il secondo il colore di questi ultimi. Come potete ben immaginare, tale sistema introduce un gran bel risparmio in termini di byte, soprattutto quando sono molti i pixel consecutivi di uno stesso colore (come nel caso dell'immagine precedente). Tale sistema di compressione è chiamato Run-Length-Encoding [RLE] e viene impiegato in svariati formati, uno dei quali è proprio il BMP e il DIB di Windows. Purtroppo però l'RLE risulta del tutto inefficiente in immagini che contengano numerose sfumature di colore e quindi, in definitiva, contenenti pixel contigui di colori differenti. In questo caso infatti, la compressione, non solo non riduce l'occupazione dell'immagine, ma addirittura la fà aumentare (infatti, per descrivere due pixel di colore differente occorrono quattro byte anzichè due). L'RLE, tuttavia, non è che il capostipite di un gruppo di algoritmi che tentano di realizzare la compressione dei dati utilizzando un approccio "lossless" [senza perdita] al problema. Tale termine indica un algoritmo che conserva integralmente, attraverso le varie fasi di compressione/decompressione, tutte le informazioni originarie della fonte dei dati. Mi spiego meglio : ammettiamo per un momento che la nostra immagine sia composta da lettere dell'alfabeto, anzichè da byte, e ammettiamo pure che il suo inzio sia costituito dalla sequenza "ABAAABCDDD". Ebbene, un algoritmo di compressione "lossless" fà si che dopo le operazioni di compressione/decompressione la sequenza di lettere rimanga intatta, ovvero, dopo la decompressione, ritroveremo la stessa sequenza "ABAAABCDDD", come è indicato nella figura seguente : Come vedete, la sequenza iniziale e quella finale risultano identiche. Nonostante questa possa sembrare una caratteristica molto positiva di un sistema di compressione, vedremo in seguito che è possibile sacrificare parte dell'accuratezza di un'immagine, in favore di un più elelvato rapporto di compressione. Gli algoritmi più famosi che fanno uso di tecniche "lossless" sono la codifica ottima di Huffman e l'algoritmo LZW (Lempel-Ziv-Welch). Nonostante l'ultimo dei due venga superato nella compressione di grandi immagini e suoni dalla "Dynamic Markov Compression" [DMC], esso risulta di gran lunga il migliore nel caso medio e viene per questo utilizzato nella codifica delle immagini del formato GIF che quindi le memorizza in maniera "lossless". L'efficienza di questi algoritmi si aggira solitamente attorno a rapporti di compressione dell'ordine del 50-70% al massimo, ovvero i dati compressi occuperanno il 50-30% della lunghezza originale. La nostra immagine da 250Kb occuperà quindi solo 75Kb. Vedremo nel prossimo paragrafo come tale metodo di valutazione dell'efficienza di un algoritmo di compresione venga sostituito in favore di uno senz'altro più comodo. COMPRESSIONE "LOSSY"Gli algoritmi di compressione definiti "lossy", come abbiamo detto, sacrificano parte dei dettagli contenuti in un'immagine in favore di un più elevato rapporto di compressione. Ma è possibile sacrificare alcuni dettagli di un'immagine senza deteriorarla sensibilmente ? Secondo alcune osservazioni e studi sperimentali su come l'occhio umano reagisce all'esperienza visiva, questo è senz'altro possibile. Ovviamente, in questo articolo, citeremo solo i casi più importanti.Cominciamo col dire che l'occhio umano non è assolutamente in grado di distinguere due immagini in bianco e nero che abbiano, la prima profondità 6 (64 grigi) e la seconda profondità 8 (256 grigi). Se vi trovate ad una risoluzione che permette il TRUE COLOR, provate a distinguere le sfumature in queste due immagini :
Se credete di aver trovato differenze, queste sono senz'altro imputabili a fattori esterni, come l'algoritmo usato per diminuire i colori, e comunque tenete presente che l'immagine di destra utilizza ben 192 colori in meno di quella sinistra.
Come potete vedere, le modificazioni nell'immagine sono molto più evidenti a destra che a sinistra, nonostante la differenza di componente sia la stessa.
CODIFICA WAVELET
E veniamo finalmente al primo dei due algoritmi di compressione esaminati in questo articolo. La codifica Wavelet sfrutta una filosofia simile al JPEG; infatti, anche durante la codifica Wavelet una particolare operazione matematica (la traformata Wavelet appunto) viene applicata all'immagine, generando grandi quantità di valori prossimi allo zero, che vengono poi approssimati e registrati con tecniche lossless. La differenza più grande rispetto al JPEG è che la trasformata Wavelet viene applicata sull'INTERA IMMAGINE, anzichè su sottoblocchi di quest'ultima.
Come vedete dal particolare in alto a destra, il degrado più grande nell'immagine è quello dovuto all'evidenziazione dei sottoblocchi di compressione. Infatti, quando un blocco viene compresso, non vengono tenuti in considerazione i pixel adiacenti a quelli dei bordi del blocco generando, a forti livelli di compressione, delle differenze molto marcate proprio in prossimità di questi ultimi.
Come vedete, il riquadro in alto a sinistra è l'immagine stessa a cui viene applicato una specie di media fra gruppi di quattro pixel (ovvero una sorta di resizing dell'immagine), mentre negli altri vengono messi in evidenza i dettagli relativi ai bordi orizzontali, verticali e diagonali. L'inseme di questi particolari, permette di ricostruire l'immagne originale. Come vedete, nei riquadri dei dettagli orizzontali, verticali e diagonali, abbiamo una gran quantità di pixel scuri, che in pratica rappresentano i pixel prossimi allo zero, che possono essere facilmente registrati. Ma la codifica Wavelet non si limita a questo. Infatti, la trasformata Wavelet viene riapplicata alla stessa immagine rimpicciolita, e così via finchè tale immagine non raggiunge le dimensioni di un pixel. A quel punto è presente una grossa quantità di pixel "quasi a zero" e l'immagine può essere efficacemente compressa.
Abbiamo parlato di trasformata Wavelet, ma in realtà sarebbe stato più corretto parlare di "famiglie" di trasformate, in quanto ne esistono numerosi tipi che rispondono a precise caratteristiche come la continuità, la smussatezza, la discretizzazione etc. La Wavelet primaria (la cosidetta "madre di tutte le Wavelet") è la Haar Wavelet, che però produce risultati scadenti con insiemi smussati come le immagini. Tutte le trasformate però hanno in comune una caratteristica : l'analisi multirisoluzione. Ma di questo parleremo nel prossimo paragrafo.
COMPRESSIONE FRATTALEIl secondo degli algoritmi che andremo ad esaminare in questo articolo riguarda un campo che ha sempre suscitato notevole interesse fra gli informatici : i frattali. E' noto che oltre ad essere belli da guardare sono estremamente interessanti sotto numerosi punti di vista. Ad esempio essi vengono impiegati in Computer Grafica per creare oggetti molto complicati come gli alberi, oppure per simulare cose come il fumo o il fuoco. Ma la caratteristica che più ci interessa in questo articolo è l'autosimilarità. In pratica, se guardate un frattale, noterete che alcuni dettagli nascondono una forma che è estremamente simile a quella dell'intero frattale. Guardate ad esempio questo che è il frattale per eccellenza, il frattale di Mandelbrot :
Come potete vedere, la forma della zona ingrandita è estremamente simile al riquadro bianco. Ma se potessimo continuare ad ingrandire, anche all'infinito, potremmo sempre trovare particolari che assomigliano al totale dell'immagine. In questo caso si parla di somiglianza a diverse risoluzioni, ed in effetti, questa caratteristica ha molto a che vedere con l'analisi multirisoluzione della compressione Wavelet. Vediamo di spiegare cosa significa.
Ovviamente voi potete scegliere dove posizionare le copie rimpicciolite dell'immagine. Se però ora noi rifotocopiassimo il foglio appena ottenuto, e poi lo rifotocopiassimo etc. etc. alla fine otterremmo un'immagine totalmente diversa, frutto della posizione assunta da ciascuna delle copie rimpicciolite. Vediamo :
Ecco, la fotocopiatrice e l'insieme delle posizioni assunte dalle immagini da fotocopiare (le cosidette "trasformazioni affini") rappresentano un IFS. Come potete vedere l'IFS possiede alcune caratteristiche molto positive : esso genera dettagli a tutte le risoluzioni, virtualmente anche ad una risoluzione infinita, poichè il procedimento può essere ripetuto infinite volte ed ogni volta l'immagine più grande arricchisce di particolari anche i più piccoli dettagli. Praticamente ogni volta che si applica l'IFS la risoluzione raddoppia, quindi è possibile raggiungere risoluzioni stratosferiche (dell'ordine del miliardo di pixel) in poche decine di applicazioni; la seconda caratteristica è quella di essere in grado di partire da qualsiasi immagine iniziale, con l'ovvio vantaggio di non doverla di volta in volta memorizzare. L'immagine finale quindi può essere descritta in termini di se stessa, memorizzando solo le trasformazioni che sono necessarie per giungervi. Se credete che tale metodo possa risultare poco flessibile, osservate che grado di complessità si raggiunge con poche trasformazioni :
Il fatto di dover registrare poche trasformazioni per memorizzare un'intera immagine è estremamente proficuo, se solo si pensa che una trasformazione occupa poche decine di byte e che per realizzare la felce di cui sopra bastano quattro trasformazioni; questo fa balzare il rapporto di compressione, raggiungendo vette insperate (dell'ordine di 10000:1 ed oltre). A questo punto però vi chiederete come sia possibile applicare l'IFS alle immagini che vediamo tutti i giorni sul Web.
Come vedete un gran numero di dettagli si ripetono all'interno dell'immagine, persino a scale differenti. Un algoritmo di compressione frattale non fà altro quindi che determinare le parti autosimili all'interno di una immagine, memorizzando ogni zona possibile in termini dell'immagine stessa e attraverso trasformazioni "contrattive" (che, come nell'analogia della fotocopiatrice, riducono qualcosa dell'immagine, siano queste le dimensioni, o lo spazio dei colori etc.). Poi, al momento della decompressione, partendo da una qualsiasi immagine, si applicano le trasformazioni registrate numerose volte e si ricostruisce l'immagine finale. Una cosa molto interessante è che è possibile utilizzare questa descrizione frattale dell'immagine per ottenere uno zoom molto accurato dell'immagine stessa, poichè, come abbiamo visto, gli IFS generano dettagli a tutte le risoluzioni. Tuttavia, anche in questo non si potrà procedere all'infinito, visto che ogni zoomata rappresenta comunque un'approssimazione dell'immagine dipendente dalla particolare serie di trasformazioni utilizzate. Tale limitazione è dovuta, come abbiamo detto, al fatto che l'immagine viene digitalizzata ad una data risoluzione che limita l'analisi multirisoluzione dell'algoritmo.
EFFICIENZA
Tutti gli algoritmi qui presentati surclassano considerevolmente il JPEG. Attualmente la compressione Wavelet sembra godere del primato di miglior algoritmo di compressione, con rapporti cha vanno dai 50:1 a 150:1, mentre le versioni più comuni della compressione frattale raggiungono solitamente vette di 78-80:1. La perdita di dettagli è in entrambi i casi comunque minima rispetto ad una eventuale perdita di dettagli del JPEG a rapporti di compressione simili. Tuttavia, anche questi due algoritmi presentano degli inconvenienti.
I PRODOTTI DISPONIBILI
Vediamo allora quali sono i prodotti commerciali disponibili per chi volesse intraprendere la strada della compressione Frattale o della compressione Wavelet. Per quest'ultima, una società americana, produce una gamma di prodotti, indirizzati all'utente medio. Essa è la Summus Ltd. che ha introdotto sul mercato un nuovo tipo di formato, il WI (Wavelet Image), che racchiude in se la codifica Wavelet delle immagini.
Per quanto riguarda invece la compressione Frattale, la società che opera nel settore è la Iterated Systems inc. dello stesso M. Barnsley. Anche questa società produce un Plug-in per Netscape (anche se sarà a breve disponibile un Plug-in anche per Microsoft Internet Explorer) per le piattaforme Windows e Macintosh (beta). ATTENZIONE ! Il Plug-in è abbastanza corposo (720Kb per la versione Windows, e 671Kb per quella Mac), e il sito è piuttosto lento. Il formato introdotto è il FIF (Fractal Image Format), impiegato, pensate un pò, persino dal browser proprietario di Video On Line, sin dalle primissime versioni. Come la Summus, anche la Iterated Systems fornisce una galleria di immagini FIF precompresse che possono essere visualizzate tramite il Plug-In. A dispetto della Summus però, la Iterated Systems fornisce un programma, il Fractal Imager, in versione Shareware, che permette di creare immagini FIF. Il prezzo di registrazione di questo programma è di appena $39 (60 con i manuali stampati), ma è disponibile, in ogni suo funzionalità, per ben 30 giorni. Dopo una mattinata di prove con Fractal Imager, posso affermare che si tratta di un buon programma per la compressione di immagini in maniera frattale. Vengono accettati tutti i formati grafici più comuni, e al momento della compressione è possibile scegliere la qualità finale dell'immagine, che, tra le altre cose, influenzerà anche il tempo di compressione, che, come abbiamo detto precedentemente, è molto alto. Per comprimere un'immagine di 860x1024 in TRUE COLOR con qualità "excellent" sono occorsi circa 7 minuti su un 486 a 100Mhz. L'efficienza della compressione non è comunque comparabile con il rispettivo della Summus, e in particolare, il Fractal Imager archivia immagini solitamente con rapporti di compressione che sono circa la metà del rispettivo Wavelet. Per quanto riguarda il Plug-In invece, esso permette una manipolazione on-line delle immagini molto più complessa del Plug-In della Summus, oltre a visualizzare le immagini in maniera più veloce. Sulla stessa pagina Web è possibile infatti zoomare, ruotare, cambiare colori, rendere a tonalità di grigi etc. Inoltre, i parametri di Embed (ovvero del tag HTML che permette di includere le immagini all'interno della pagina) sono molto più numerosi e flessibili, ed è possibile determinare sotto-aree che possono essere visualizzate separatamente all'interno di una stessa pagina. Questa flessibilità è espressamente orientata verso il Web. Potete fare delle prove su un'immagine frattale allegata a questo articolo, ovviamente solo dopo aver scaricato il Plug-In.
GETTING IN TOUCH
|
Copyright © 1996 Beta. Tutti i diritti riservati.