Άσκηση 5: Image compression Methods
gif | png | jpeg | jpeg2000


ΗΥ474 - Τεχνολογία Πολυμέσων

Διδάσκων: Γ. Τζιρίτας
Άνοιξη 2018

Ον/μο: Κωνσταντίνος Ψαρουλάκης
ΑΜ: 1082



Τμήμα Επιστήμης Υπολογιστών
Πανεπιστήμιου Κρήτης



Περιεχόμενα

Περίληψη και script (χωρίς εικόνες/αποτελέσματα).

PNG και GIF Compression.

JPEG και JPEG2000 Compression.

Σύγκριση βάσει της εντροπίας.

Σύγκριση βάσει της αναλογίας σήματος σφάλματος.

Συμπεράσματα.

Κώδικας και αποτελέσματα (αναλυτικά).



Περίληψη και script (χωρίς εικόνες/αποτελέσματα)

Σκοπός της εργασίας αυτής είναι η συμπίεση εικόνων σε διάφορες μορφές συμπίεσης (png, gif, jpeg, jpeg2000) κι έπειτα να συγκριθούν οι μορφές αυτές ως προς το λόγο σήματος προς σφάλμα, και ώς προς την εντροπία τους. Ο λόγος σήματος προς σφάλμα δίδεται από τη σχέση 20 log10255e, όπου e είναι η τετραγωνική ρίζα του μέσου τετραγωνικού σφάλματος.

Για το σκοπό αυτό, έφτιαξα το παρακάτω script, το οποίο χρησιμοποίησα για να εξάγω τα αποτελέσματα που θα παρουσιάσω παρακάτω.

Στο τέλος της αναφοράς, επισυνάπτω ξανά τον κώδικα, μαζί με διαγράμματα και εικόνες που προκύπτουν κατά το «τρέξιμο» του script, για να μπορεί κανείς να ανατρέξει σε αυτά για επαλήθευση των δεδομένων που παρουσιάζω παρακάτω.





PNG και GIF Compression


Για να κάνω την συμπίεση σε PNG και GIF, βρίσκω τη βέλτιστη παλέτα χρωμάτων (64 χρωμάτων και 256 χρωμάτων), με τη χρήση της συνάρτησης rgb2ind() του MATLAB, που βρίσκει τη βέλτιστη παλέτα με τη μέθοδο του διανυσματικού κβαντισμού με ελαχιστοποίηση της διασποράς (default επιλογή), και επιστρέφει δύο arrays: Τα indeces της εικόνας και την παλέτα χρωμάτων.

Στις μεθόδους συμπίεσης αυτές, η απώλεια πληροφορίας έγκειται στον κβαντισμό της παλέτας χρωμάτων κι όχι στην κωδικοποίηση της εικόνας αυτή καθ αυτή. Όσο μικρότερο το εύρος της παλέτας, τόσο μεγαλύτερο το σφάλμα σε σχέση με την αρχική. Επομένως για να φτάσουμε σε ένα μικρό μέγεθος αρχείου, πρέπει να μικρύνουμε κατά πολύ την παλέτα χρωμάτων. Επειδή όπως προείπα δεν υπάρχει περαιτέρω απώλεια πληροφορίας μετά την εύρεση της παλέτας χρωμάτων, και οι δύο μέθοδοι έχουν ίδιο αποτέλεσμα όσον αφορά το τι βλέπουμε, ωστόσο η png κωδικοποίηση είναι πιο αποτελεσματική όσον αφορά το μέγεθος της εικόνας (μικρότερο μέγεθος περίπου κατά 5% έως 15%). Οι παλέτες 64 και 256 χρωμάτων οδηγούν σε ένα compress ratio ανάμεσα στο διάστημα [2.5, 7] (παλέτα 64 χρ.) και [4,8] (παλέτα 256 χρ.)αντίστοιχα. Σε όλες τις περιπτώσεις, όπως μπορούμε να δούμε και από τα διαγράμματα παρακάτω, με την συμπίεση σε gif, έχουμε μεγαλύτερα dBs στο signal to error ratio, σε αντίστοιχο compression ratio, οπότε το αποτέλεσμα σε σχέση με την αρχική εικόνα μοιάζει καλύτερο, αν και το μέγεθος του αρχείου είναι καλύτερο στην PNG κωδικοποίηση. Ωστόσο αυτή η αναλογία συμπίεσης είναι πολύ μικρή σε σχέση με αυτή που προσφέρουν τα πρότυπα JPEG/JPEG2000 ακόμη και με λιγότερες απώλειες.

Τα πρότυπα PNG, GIF είναι χρήσιμα για απλές φωτογραφίες με μικρό εύρος χρωμάτων (για να μην έχουμε μεγάλες απώλειες λόγω κβαντισμού χρώματος). Το πρότυπο PNG εχει υπερισχύσει έναντι του GIF γιατί ουσιαστικά ώς μορφές εικόνων, το PNG έχει όλες τις ιδιότητες του GIF, έχοντας όμως επιπλέον μια δυνατότητα για διαφάνεια (σε ένα έξτρα κανάλι Alpha - RGBA ). Το PNG έχει δύο μορφές (απ τις οποίες μελετήσαμε μόνο την πρώτη):

  • PNG-8: 256 χρώματα και 1-bit για τη διαφάνεια, μοιάζει πολύ με το GIF ωστόσο το μέγεθος του είναι ακόμα μικρότερο
  • PNG-24: Μπορεί να περιέχει περισσότερα από 16 εκατομ. χρώματα, μοιάζει με το JPEG ωστόσο επειδή πρόκειται για lossless συμπίεση, το μέγεθος του τελικού αρχείου PNG-24 είναι μεγαλύτερο από το αντίστοιχο JPEG.
  • Το πρότυπο GIF ενώ έχει λιγότερες δυνατότητες όσον αφορά τις εικόνες, συνεχίζει να χρησιμοποιείται γιατί δίνει επίσης τη δυνατότητα για animation και επειδή υποστηρίζεται πλήρως από όλους τους browsers παλιούς και καινούριους (ενώ το PNG ορισμένες φορές παρουσίαζε προβλήματα συμβατότητας σε παλιούς περιηγητές λόγω του έξτρα καναλιού για το transparency).

    Οι δύο μέθοδοι αυτές, είναι για εικόνες απλές με περιορισμένο εύρος χρωμάτων, πχ για απλά γραφικά, logos κτλ. Στην προκειμένη περίπτωση βλέπουμε ότι στην προσπάθεια μας να συμπιέσουμε φωτογραφίες από τον πραγματικό κόσμο σε PNG, GIF, έχασαν πολλή πληροφορία, κάνοντάς τις θολές και σε ορισμένα σημεία να διακρίνονται pixels λόγω του κβαντισμού των χρωμάτων.





    JPEG και JPEG2000 compression

    Οι δύο αυτές μέθοδοι αποτελούν δύο από τις πιο διαδεδομένες μεθόδους συμπίεσης εικόνων. Είναι πρότυπα στα οποία έχουμε απώλεια πληροφορίας (lossy methods) επομένως είναι αναμενόμενο ότι θα εμφανίζονται ατέλειες μεταξύ της ασυμπίεστης και της συμπιεσμένης εικόνας. Ωστόσο ο τρόπος που κάνουν την συμπίεση κάνει τις «ατέλειες» να μην είναι εύκολα ορατές στο μάτι λόγω της φυσιολογίας του ίδιου του ανθρώπινου ματιού. Το μάτι δεν είναι τόσο ευαίσθητο σε χρωματικές διαφορές όσο στις διαφορές της φωτεινότητας, γι αυτό θυσιάζονται κάποια χρώματα για να εξασφαλισθεί ένα μικρότερο μέγεθος αρχείου, χωρίς αυτό να οδηγεί σε εύκολα αντιληπτά σφάλματα.

  • Στην περίπτωση του JPEG (ISO 10918-1, δημιουργήθηκε το 1992 και ονομάστηκε έτσι το 1994), μια ασυμπίεστη εικόνα, bitmap, μπορεί να καταλαμβάνει μέχρι και 40MB χώρου, ενώ σε μορφή jpeg, καταλαμβάνει περίπου 3MB. Χρησιμοποιεί ένα διακριτό μετασχηματισμό συνημιτόνου σε 8x8 blocks (κάτι το οποίο σε μεγάλες αναλογιες συμπίεσης δημιουργει αντιληπτές διαφορές μεταξύ συμπιεσμένης/ασυμπίεστης εικόνας).
  • Στην περίπτωση του JPEG2000 (ISO/IEC 15444, εμφανίστηκε το 2000), η κωδικοποίηση γίνεται με έναν νέο διακριτό κυματιδιακό μετασχηματισμό αντί του διακριτού μετασχηματισμού συνημιτόνου που χρησιμοποιείται στο JPEG. Στο JPEG2000 οι αλλοιώσεις στην εικόνα είναι σχεδόν αμελητέες, και δύσκολα ανιχνεύσιμες με το μάτι σε αντίθεση με το JPEG. Στο JPEG οι αλλοιώσεις εμφανίζονται τόσο ως blur όσο και σε μορφή δακτυλίων (ringing artifacts) σε ακμές της εικόνας, όσο και σε blocks, λόγω της κωδικοποίησης σε 8x8 block, ενώ στο JPEG2000 εμφανίζονται μόνο ringing artifacts. Το JPEG2000 λοιπόν προσφέρει κατα κάποιο τρόπο και μια κωδικοποίηση χωρίς απώλεια μέσω ενός αντιστρέψιμου ακέραιου κυματιδιακού μετασχηματισμού. Το μεγάλο πρόβλημα αυτού του πρότυπου είναι ότι είναι απαιτητικό στην απο/κωδικοποίηση και δεν υποστηρίζεται ευρέως από περιηγητές διαδικτύου, επομένως δε χρησιμοποιείται τόσο στο διαδίκτυο, όσο άλλες μορφές κωδικοποίησης.
  • Όπως μπορούμε να διακρίνουμε και από τα αποτελέσματα, τα καλύτερα αποτελέσματα τα έχουμε με το JPEG2000 έναντι του JPEG. Αυτό φαίνεται τόσο με το μάτι (καθώς για ίδιες αναλογίες συμπίεσης έχουμε λιγότερες αλλοιώσεις στην εικόνα με τη χρήση του JPEG2000) και όσο και με την μέτρηση της αναλογίας σήματος:σφάλματος, το οποίο έιναι μεγαλύτερο στην περίπτωση του JPEG2000.

    Όσον αφορά το μέγεθος των εικόνων, όπως περιμέναμε, το μέγεθος με τα πρότυπα συμπίεσης αυτά μειώνεται κατα πολύ σε αντίθεση με τα GIF, PNG.
    πχ μια εικόνα με την παλέτα 64 χρωμάτων (πολύ κακή ποιότητα) είναι ~29ΚΒ σε gif και ~27KB σε png, με την παλέτα των 256 χρωμάτων (κακή ποιότητα) είναι ~45ΚΒ σε gif και ~40ΚΒ σε png, ενώ με τη μικρότερη αναλογία συμπίεσης που εφαρμώσαμε (10) είναι ~19ΚΒ σε JPEG και σε JPEG2000, και με αναλογία συμπίεσης έως και 50, μπορεί να φτάσει το μέγεθος των 3KB. Για να μην μιλάμε μόνο με νούμερα, κοιτάζοντας και τις εικόνες που προκύπτουν, ενώ το μέγεθος μειώνεται κατα πολύ, δε γίνεται το ίδιο με την ανάλυση η οποία είναι καλύτερη μάλιστα από αυτήν των GIF, PNG.



    Σημ. Επειδή η συνάρτηση imwrite για το JPEG δεν περιέχει παράμετρο αναλογίας συμπίεσης, αλλά μια παράμετρο για την ποιότητα (0-100) της συμπιεσμένης εικόνας, δεν έγινε τελείως ομοιόμορφη κατανομή της αναλογίας συμπίεσης στο διάστημα [0,50] όπως έγινε στο JPEG2000, αλλά επειδή τα αποτελέσματα παρουσιάστηκαν σε ένα συνεχές διάγραμμα, μπορούμε να μελετήσουμε τα αποτελέσματα εξίσου καλά.




    Σύγκριση βάσει της εντροπίας

    Στις κωδικοποιήσεις JPEG, JPEG2000 σύγκρινα την εντροπία σε κάθε χρωματικό κανάλι χωριστά και παρουσίασα τα αποτελέσματα σε μορφή διαγράμματος, όπως μπορεί να δει κανείς παρακάτω. Η ανάλυση αυτή έγινε τόσο στο σύστημα RGB όσο και στο YCbCr.

    Στο RGB παρατηρώ ότι για μικρές αναλογίες συμπίεσης, η εντροπία αυξάνεται και στα 3 κανάλια χρωμάτων σε σχέση με την αρχική. Ωστόσο από ένα όριο και μετά η εντροπία της συμπιεσμένης εικόνας είναι χαμηλότερα από αυτή της αρχικής(σε ορισμένες εικόνες είναι η αναλογία συμπίεσης=10 σε άλλες μπορεί να είναι και το 50 όπως βλέπουμε παρακάτω).

    Στο YCbCr παρατηρώ ότι για κάθε αναλογία κωδικοποίησης μεταξύ 10 και 50 (που εξετάζω) μας οδηγεί σε μικρότερη εντροπία στη συμπιεσμένη εικόνα σε σχέση με την αρχική στα κανάλια Cb και Cr ενώ στο Y, κυμαίνεται περίπου στις ίδιες τιμές με το αρχική.

    Στην περίπτωση του JPEG έχουμε μεγάλη μείωση της εντροπίας σε όλα τα κανάλια και στα 2 συστήματα (ίσως με μικρότερες μεταβολές στο Y κανάλι του YCbCr) μετά από μια αναλογία συμπίεσης κοντά στο 40. Ωστόσο εκτός αυτού έχουμε και μεγάλη μείωση της αναλογίας σήμα:θόρυβος, κάτι το οποίο δε θα θέλαμε να συμβαίνει.

    Αντίθετα, στο JPEG2000 έχουμε μικρότερες μεταβολές σε αντίστοιχες αναλογίες συμπίεσης, με καλύτερα αποτελέσματα τόσο οπτικά, όσο και με τον υπολογισμό του σφάλματος μεταξύ συμπιεσμένης και ασυμπίεστης εικόνας. Στην περίπτωση του JPEG2000 μεγάλη μείωση στην εντροπία παρατηρώ στα κανάλια Cb, Cr στο σύστσημα YCbCr, ενώ όχι στο Υ. Αυτό μπορεί να υποδεικνύει ότι με κάποιο τρόπο γίνεται μια συμπίεση στα κανάλια Cb, Cr που αφορούν τις χρωματικές διαφορές (τις οποίες το ανθρώπινο μάτι δεν αντιλαμβάνεται τόσο καλά όσο τη φωτεινότητα), και κρατάει σταθερό το κανάλι Y, που αφορά την φωτεινότητα/αντίθεση. Έτσι, στα αποτελέσματα που βλέπουμε με το μάτι, τα σφάλματα είναι ανεπαίσθητα.




    Σύγκριση βάσει της αναλογίας σήματος σφάλματος

    Σε αυτή τη σύγκριση συμπεριέλαβα όλες τις μεθόδους που μελέτησα (PNG, GIF, JPEG, JPEG2000). Υπολόγισα την αναλογία σήματος:σφάλματος, σύμφωνα με τη σχέση 20 log10255e, όπου e είναι η τετραγωνική ρίζα του μέσου τετραγωνικού σφάλματος. Ο υπολογισμός αυτός έγινε τόσο σε μια μια εικόνα και παρουσιάσα τα αποτελέσματα σε διαγράμματα (μπορεί κανείς να τα δεί παρακάτω στα αναλυτικά αποτελέσματα του script για όλες τις εικόνες), και υπολόγισα και το άθροισμα όλων αυτών των αναλογιών για να συγκρίνω συνολικά τις μεθόδους κωδικοποίησης ως προς το σφάλμα τους.

    Όπως μπορούμε να δούμε στο τέλος του προγράμματος, το signal:error ratio για όλες τις εικόνες αθροιστικά έχει τιμές:

  • Συμπίεση σε PNG: 1248.456833 dB
  • Συμπίεση σε GIF: 1248.456833 dB
  • Συμπίεση σε JPEG: 4948.596497 dB
  • Συμπίεση σε JPEG2000: 5125.201181 dB
  • Κοιτώντας την συμπίεση σε PNG, και GIF βλέπουμε ότι οι αναλογίες είναι ίδιες. Αυτό προφανώς συμβαίνει γιατί και οι δύο συμπιέσεις «φτιάχνονται» από ίδιες παλέτες χρωμάτων, και το σφάλμα που προκύπτει είναι από την εύρεση της βέλτιστης παλέτας. Επομένως από τις συμπιέσεις αυτές καθ αυτές δεν έχουμε κάποια απώλεια πληροφορίας.

    Συγκρίνοντας τα πρότυπα JPEG, JPEG2000 παρατηρούμε ότι το JPEG2000 έχει καλύτερα αποτελέσματα όσον αφορά το σφάλμα. Συνολικά, η καλύτερη μέθοδος συμπίεσης αυτής όσον αφορά την διατήρηση της πληροφορίας είναι το πρότυπο JPEG2000. Δεύτερο σε σειρά έρχεται το πρότυπο JPEG, κι έπειτα οι lossless μεθοδοι PNG, GIF, λόγω του περιορισμένου εύρους χρωμάτων, και κατ επέκταση του μεγαλύτερου σφάλματος που έχουν σε σχέση με την ασυμπίεστη εικόνα.





    Συμπεράσματα

    Όλα τα παραπάνω πρότυπα είναι εξίσου χρήσιμα αναλόγως το πώς/που θέλουμε να τα χρησιμοποιήσουμε. Σε περίπτωση που θέλουμε να μειώσουμε σημαντικά το μέγεθος μιας φωτογραφίας (ακόμα και μέχρι 10-15%) χωρίς απώλεια στην ποιότητα, το JPEG και το JPEG2000 είναι πολύ χρήσιμα πρότυπα, με κυρίαρχο το JPEG στο διαδίκτυο αφού το δεύτερο δεν έχει διαδοθεί σε μεγάλο βαθμό. Ιδιαίτερα για συμπίεση έγχρωμων εικόνων τα πρότυπα αυτά είναι ίσως η καλύτερη επιλογή από τις 4.

    Επιγραμματικά, μπορούμε να πούμε ότι τα πρότυπα GIF, PNG χρησιμοποιούνται κυρίως για απλές εικόνες, απλά γραφικά, με λίγες λεπτομέρειες, logos, ή για animation (gif), ενώ τα πρότυπα JPEG, JPEG2000 για εικόνες με πολλή πληροφορία και πολλά χρώματα στις οποίες ενδιαφερόμαστε περισσότερο στο να μειώσουμε το μέγεθος από το να τις έχουμε σε πλήρη ανάλυση. Μπορούμε να τα χρησιμοποιήσουμε για φωτογραφίες (το JPEG είναι η πιο διαδεδομένη μορφή αποθήκευσης φωτογραφιών στις ψηφιακές κάμερες), για εικόνες με πολύπλοκες χρωματικές διαφορές, για την όσο το δυνατό καλύτερη αναπαράσταση του φωτός/σκιάς σε εικόνες. Ωστόσο για εκτυπώσεις μεγάλων διαστάσεων ή για «σημαντικές» εργασίες με φωτογραφίες η χρήση του JPEG αποφεύγεται, γιατί σε μεγάλες διαστάσεις, η απώλεια πληροφορίας που προκύπτει είναι αντιληπτή στο μάτι. Επομένως είναι πολύ καλή επιλογή κυρίως για μικρές διαστάσεις φωτογραφιών και για ιστοσελίδες.





    Κώδικας και αποτελέσματα (αναλυτικά)

    Ο κώδικας που χρησιμοποιήθηκε μαζί με όλα τα αποτελέσματα που εξήχθησαν φαίνονται στο παρακάτω πλαίσιο:




    Εικόνα 1: What’s the Difference Between Codecs & Containers?, By Matt Laufer