Un piccolo confronto tra i formati Jpeg e Jpeg2000 (lossy)

Di leonardo maffi

Versione 0.3 del 31 Dicembre 2002.


Ecco un piccolo confronto tra la qualità delle immagini compresse con Jpeg (utilizzato al meglio delle sue possibilità, e il nuovo formato Jpeg2000. Ovviamente questo solo un test indicativo, ed è basato soprattutto su un confronto visuale dei risultati (la compressione delle immagini è in parte una scienza matematica basata su misurazioni oggettive semplici come il PSNR, in parte su risultati oggettivi ottenuti dagli studi sulla percezione umana, e in parte è anche basata sulle preferenze estetiche delle singole persone).

Le immagini compresse in Jpeg2000 (lossy) le ottengo (e le decomprimo per mostrarle qui) usando software di prova Kakadu V. 3.4:
http://www.ee.unsw.edu.au/~taubman/kakadusoftware/index.html


Per ottenere le immagini in formato Jpeg sfruttato al meglio ho utilizzato vari programmi:
- Jpeg Optimizer 3.01 XATech per la compressione delle immagini Jpeg con la funzionalità "Magic Compress" che ottimizza i vari punti dell'immagine Jpeg in modo differenziale.
- Minerva Sample Application V.1.00.44 for PIC V. 1.03 libraries, della Pegasus Imaging Corporation.
È stata utilizzata per la decompressione delle immagini Jpeg, dato che quando il tasso di compressione è molto alto è capace di interpolare meglio le blochettature (interpola le componenti continue DC tra blocchi DCT vicini, in pratica fa un rozza interpolazione di spettro estesa a blocchi vicini).
Questo programma è disponibile gratuitamente per prove sul sito della Pegasus Imaging Corporation.
- Paint Shop Pro 7, per la funzione "Jpeg artifact removal" sulle immagini decompresse col Minerva, utile per rimuovere vari tipi di errori prodotti dalla compressione a blocchi Jpeg.
- Jpegtran, utility per la compressione aritmetica delle immagini Jpeg: http://jpegclub.org/
(http://jpegclub.org/jpegtran.zip), <guido@jpegclub.org>.
(Originariamente il Jpeg fu inteso con compressione entropica Huffman e aritmetica. La seconda è un po' più lenta, un po' più complessa da implementare, ma produce file un poco più piccoli a parità di qualità. Sulla questione della compressione aritmetica in Jpeg ci sarebbero anche altre questioni citare).
- PSNR 1.0  di <CBO6OgA@i.am> (freeware) per il calcolo del PSNR: psnr10.zip
ftp://ftp.externet.hu/pub/mirror/sac/graph/psnr10.rar


Il primo test l'ho effettuato con la superclassica immagine "Lena", tratta dal Waterloo Bragzone Colourset:
Lena 512x512x24 (786,568 bytes): http://links.uwaterloo.ca/ColorSet/Lena/lena.tif


Qui è codifcata in Jpeg NLP. ("Near Lossless Percettivo", cioè quasi indistinguibile dall'originale, PSNR = 32.506695).



L'ho compressa in Jpeg2000 col comando:
kdu_compress -i lena.bmp -o lena0.2.j2c -rate 0.2
Che effettua una compressione lossy percettiva (cioè non minimizza il PSNR ma massimizza la qualità visibile).
Questo è il file ottenuto (6543 byte): lena0.2.j2c
L'ho decompressa con:
kdu_expand -i lena0.2.j2c -o lena0.2_j2c_dec.bmp
Poi ho utilizzato JpegOptimizer per codificarla in Jpeg NLP. ("Near Lossless Percettivo", cioè quasi indistinguibile dall'originale):

"Lena" compressa a 0.2 bit/pixel in Jpeg2000 (PSNR = 29.819113) (qui è in Jpg NLP).


Ho compresso lena in Jpeg con Jpeg Optimizer (7443 byte), codificata con codifica (lossless) aritmetica con Jpegtran diventa 6.652 byte, il che è molto vicino ai 6543 byte della Jpeg2000 (si noti che per decompimere questa speciale Jpeg serve il Jpegtran): lena0.2_jpg_arith.jpg

(PSNR = 27.467623)

Poi l'ho decompressa con Jpegtran e con Minerva, qui è in Jpeg NLP:

(PSNR = 27.253565)


E infine l'ho filtrata con la funzione Jpeg artifact removal del PaintShopPro (Strength = Normal, Restore crispness = 25), qui è in Jpeg NLP:

(PSNR = 27.569794)



Così si può fare un confronto visuale tra l'immagine Jpeg e la Jpeg2000:
Jpeg (PSNR = 27.569794)
Jpeg2000 (PSNR = 29.819113)

Il confronto credo sia lecito dato che tutti passaggi che ho fatto per la Jpeg (compressione adattativa spaziale, compressione aritmetica, decompressione di buona qualità con interpolatura dei blocchi e filtratura per la correzione degli errori) possono essere effettuati più o meno automaticamente da un singolo programma.
Il risultato del confronto direi che è a favore della Jpeg2000, ma la differenza non è enorme. Si noti che a questi data rate molto bassi il Jpeg dovrebbe essere svantaggiato rispetto alla compressione con wavelet del Jpeg2000 (mentre a data rate più alti la differenza è meno percettibile) Il Jpeg mantiene una blocchettatura, che comunque potrebbe essere in parte eliminata con una migliore estrapolazione di spettro tra blocchi vicini. Il Jpeg2000 mostra comunque qualche dettaglio extra (nella fascia chiara che compre il cappello in alto) e forse una migliore resa del colore.

Il PNSR da' risultati peggiori per l'immagine decompressa con Minerva rispetto a quella decompressa a blocchi, anche se la seconda è visivamente migliore.



Il secondo test l'ho effettuato con una immagine diversa, "araca" (qui è un po' ricompressa in Jpeg. Le prove le ho effettuate su una immagine Jpeg originale di circa 226KB):

Araca (Jpeg, circa 146 KB).


L'ho compressa in Jpeg2000 col comando:
kdu_compress -i araca.bmp -o araca0.192.j2c -rate 0.192
(ho usato 0.192 per avvicinarla meglio alle dimensioni della immagine compressa in Jpeg) Questo è il file ottenuto (8212 byte): araca0.192.j2c
L'ho decompressa con:
kdu_expand -i araca0.192.j2c -o araca0.192_j2c_dec.bmp
Poi ho utilizzato JpegOptimizer per codificarla in Jpeg NLP:

"Araca" compressa a 0.192 bit/pixel in Jpeg2000 (PSNR = 18.174516) (qui è in Jpg NLP).

Ho compresso Araca in Jpeg con Jpeg Optimizer (8856 byte), codificata con codifica (lossless) aritmetica con Jpegtran diventa 7718 byte, il che è molto vicino ai 7517 byte della Jpeg2000 (si noti che per decompimere questa speciale Jpeg serve il Jpegtran): araca0.192_jpg_arith.jpg

Questa è l'immagine Jpeg comressa con Optimizer e decompressa dal browser:

(PSNR = 17.242053)


Così si può fare un confronto visuale tra l'immagine Jpeg (decompressa con Minverva, filtrta con PSP7 e poi ricompressa in NLP) e la Jpeg2000 (NLP):
Jpeg (Minerva + PSP7) (PSNR = 17.158776)
Jpeg2000 (PSNR = 18.174516)


Stavolta direi che il confronto è più indeciso. Nella Jpeg rimangono ovviamente i blocchi, ed è possibile che il JpegOptimizer abbia compresso leggermente troppo le aree uniformi, ma nelle anse del fiume sottile e in altri dettagli noto chiaramente che l'immagine Jpeg ha dettagli a risoluzione significativamente superiore. Varie persone potrebbero apprezzare di più la seconda immagine, ma io apprezzo di più la prima. Nel complesso quindi a questi data rate minimi il sofisticato Jpeg2000 non mi pare significativamente migliore (in lossless) del Jpeg. Il formato Jpeg2000 è molto più elastico del Jpeg, ma ha anche lo svantaggio di essere molto complicato (le possibilità da gestire sono innumerevoli), e il comune Jpeg ha ancora spazio per miglioramento.

Questo confronto è stao quasi puramente accademico, in quanto:
- È improbabile che si affermi la versione del Jpeg con compressione aritmetica;
- Il test è relativo ad una singola implementazione del Jpeg2000, che è ancora piuttosto giovane, a differenza delle implementazioni del Jpeg che hanno avuto moltissimo tempo per raffinarsi. Di solito serve sempre molto tempo affinché questi standard vengano sfruttati al meglio (lo stesso è stato vero ad esempio anche per l'Mp3);
- Vanno tenute di conto anche considerazioni di tempo di calcolo. La decompressione della Jpeg2000 è molto veloce, mentre il filtraggio del PaintShopPro è lentissimo. Per cui aumentndo molto il tempo dedicato alla Jpeg2000 anche essa potrebbe probabilmente essere migliorata.

[Torna all'indice]