Άσκηση 2: Gif, Mp4 with MATLAB


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

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

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



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



Περιεχόμενα

Δημιουργία GIF - Παρεμβολή νέων εικόνων.

Σύγκριση των δύο τρόπων για τον περιορισμό της
παλέτας χρωμάτων (Δεν ζητείται στην εκφώνηση)
.

Μετατροπή GIF σε mp4.

Σύγκριση των δύο τρόπων προβολής (gif/mp4).

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



Δημιουργία GIF - Παρεμβολή νέων εικόνων

Για την γραμμική παρεμβολή 3 εικόνων ανάμεσα σε 2 των δεδομένων, χρησιμοποιώ ένα πολυώνυμο πρώτου βαθμού:
approx = (1-0.25*t)*Εικόνα1 + (0.25*t)*Εικόνα2, για t=0, 1, 2, 3, 4
Στα t=0, 4 αντιστοιχούν οι εικόνες από τα δεδομένα μας μεταξύ των οποίων θα παρεμβάλλω τις 3 νέες.
Στα t=1, 2, 3 αντιστοιχούν οι εικόνες που παρεμβάλλονται ανάμεσα στις δύο των δεδομένων.


Διατρέχω τον πίνακα με τα αρχικά δεδομένα και κάνω την παρεμβολή με τον τρόπο που περιέγραψα. Ως αποτέλεσμα, έχω τελικά έναν νέο πίνακα με 120 εικόνες, τις οποίες θα χρησιμοποιήσω για τη δημιουργία των ζητούμενων GIF, και mp4.

(Η ακριβής υλοποίηση και η επεξήγησή της θα συμπεριληφθεί λίγο παρακάτω αναλυτικά.)

Οι εικόνες που είχε το αρχικό δείγμα, έχουν pixel με τιμές που βρίσκονται στο διάστημα [0, 450] και είναι τύπου int16. Για να μπορέσουμε να δημιουργήσουμε ένα αρχείο GIF με αυτές τις εικόνες πρέπει να τις περιορίσουμε στο διάστημα [0, 255] (και να τις μετατρέψουμε τελικά σε uint8), ώστε να μπορεί να το υποστηρίξει ενα gif.

Έχω χρησιμοποιήσει δύο μεθόδους για το σκοπό αυτό:

  • 1ος τρόπος (Γραμμικός μετασχηματισμός):
    Θα περιορίσω τις τιμές από το διάστημα [0, 450], στο διάστημα [0, 255] "στριμώχνοντας" τις με ένα scaling *255/maxVal, όπου maxVal η μέγιστη τιμή από τα pixel. (Πιο σωστός/ακριβής τρόπος)
    Επεξήγηση: Διαιρώ όλες τις τιμές των pixel με τη μέγιστη τιμή (450) ώστε να πάρουν τιμές στο διάστημα [0, 1]. Έπειτα τις πολλαπλασιάζω με το 255, "απλώνοντάς" τις στο διάστημα [0, 255].

  • 2ος τρόπος (Προσαρμογή εξωτερικών τιμών στα άκρα του [0, 255]):
    Αυτός ο τρόπος αποτελεί έναν μετασχηματισμό (μη γραμμικό) που ουσιαστικά, διατηρεί τις τιμές των pixel που βρίσκονται στο διάστημα [0, 255], και όσες βρίσκονται στο [255, 450], τις κάνει ίσες με 255.
    Αυτό θα δημιουργήσει κάποιο είδος παραμόρφωσης στην αρχική εικόνα αφού θα "αυξήσει" τον αριθμό των φωτεινών pixels, χωρίς να αλλάξει τις τιμές των pixel με χαμηλότερη φωτεινότητα.
  • Εάν έπρεπε να διαλέξω μεταξύ αυτών των δύο τρόπων θα διάλεγα τον πρώτο, καθώς όπως θα δούμε παρακάτω, με τον δεύτερο τρόπο αφενός "πετάμε" δεδομένα, και αφετέρου δεν κρατιούνται οι σχέσεις μεταξύ των τιμών των pixel, δημιουργώντας τελικά μια πιο φωτεινή εικόνα.
    [Παρακάτω θα παρουσιάσω μια αναλυτικότερη σύγκριση μεταξύ των δύο μεθόδων.]


    Για την υλοποίηση των παραπάνω στο MATLAB έφτιαξα το παρακάτω script:

    Οι εικόνες GIF που προκύπτουν με καθέναν από τους δύο τρόπους είναι οι παρακάτω:
    (Η αριστερή εικόνα είναι το ζητούμενο της εκφώνησης)




    Σύγκριση των δύο τρόπων (Δεν ζητείται στην εκφώνηση)


    (Ίσως να μη χρειαζόταν καν να μπούμε στην διαδικασία για μια τέτοια ανάλυση/μελέτη, αλλά την έκανα για προσωπικούς λόγους, και σκέφτηκα να την συμπεριλάβω στην αναφορά αυτή.)


    Η ανάλυση/σύγκριση των δύο μεθόδων έγινε με το παρακάτω script που δημιούργησα:


    Με το παραπάνω script, αναλύω στατιστικά το κάθε σύνολο τιμών των pixel. Για τις αρχικές τιμές, για τις τιμές μετά τον 1ο τρόπο, για τις τιμές μετά τον 2ο τρόπο.

    Αυτό που μπορούμε να παρατηρήσουμε, είναι ότι οι τιμές έξω από το διάστημα [0, 255] στο αρχικό δείγμα καταλαμβάνουν ένα ποσοστό 2.42%, επομένως αυτά τα pixel δεν επηρεάζουν σε μεγάλο βαθμό τις συνολικές εικόνες. Ωστόσο εάν δεν τα λάβουμε καθόλου υπ όψιν και προχωρήσουμε σε αποκοπή τους, ή στην προσαρμογή τους στην τιμή 255 στο άκρο δηλαδή του [0, 255], αυτό θα αλλάξει την κατανομή των pixel αλλάζοντας τελικά και τις αντιθέσεις που υπάρχουν στις εικόνες.

    Κάποιες παραπάνω μετρήσεις που έλαβα υπ όψιν είναι ο μέσος όρος των τιμών για το κάθε δείγμα, και η διάμεσος των τιμών αυτών.

  • Με τον 1ο τρόπο:
    Η μέση τιμή γίνεται 53.42 από 94.24 που ήταν αρχικά και η διάμεσος γίνεται 37 από 66.
  • Με τον 2ο τρόπο:
    Η μέση τιμή γίνεται 93.74 από 94.24 που ήταν αρχικά και η διάμεσος παρέμεινε 66 όπως και στο αρχικό δείγμα. Όμως στο διάστημα [0, 255], το 93.74 "πέφτει" σχεδόν στο 1/3 του ενώ στο [0, 450] το 94.24 "πέφτει" σχεδόν στο 1/5 του. Οπότε τελικά η εικόνα που θα προκύψει θα είναι πιο φωτεινή από την αρχική, έχοντας περισσότερες υψηλές τιμές, κοντά στο 255.
  • Με μια πρώτη σκέψη θα σκεφτεί κανείς ότι με μια τόσο μεγάλη μεταβολή στις τιμές αυτές που χαρακτηρίζουν τις τιμές των pixel με τον πρώτο τρόπο, οι τελικές εικόνες θα έχουν υποστεί μεγάλη παραμόρφωση. Ωστόσο μην ξεχνάμε ότι οι τιμές αυτές περιγράφουν ένα επίπεδο φωτεινότητας κι όχι κάποιο χρώμα αυτό καθεαυτό. Επομένως είναι λογικό, προσπαθώντας να περιορίσουμε το δείγμα σε μικρότερο εύρος αντιθέσεων όσον αφορά τη φωτεινότητα, να χαμηλώνουν με ανάλογο τρόπο όλες οι τιμές (και προφανώς και η μέση τιμή και η διάμεσος).

    Για να το κατανοήσουμε και με έναν πιο διαισθητικό τρόπο, μπορούμε να παρατηρήσουμε τα ιστογράμματα για τις τιμές του κάθε δείγματος, συγκρίνοντας το αρχικό δείγμα, με το αποτέλεσμα μετά από την πρώτη και τη δεύτερη επεξεργασία αντίστοιχα. Το κάθε ιστόγραμμα, παρατηρούμε ότι είναι σχεδόν ένα άθροισμα δύο κανονικών κατανομών, από τις οποίες η αριστερή αντιστοιχεί στα πιο "σκοτεινά" pixels, και η δεξιά στα πιο "φωτεινά".

    Βλέπουμε ότι με τον πρώτο τρόπο, η κατανομή των τιμών μένει σχεδόν ανεπηρέαστη, κρατώντας τις αναλογίες μεταξύ φωτεινών/σκοτεινών pixel, ενώ στον δεύτερο τρόπο, οι δύο κατανομές έχουν μετακινηθεί δεξιότερα και έχουν μεγαλύτερη διασπορά. Επομένως οι τιμές στο σύνολό τους έχουν υποστεί μεγάλη αλλαγή.

    Άρα ο καλύτερος τρόπος με πιο ακριβή αποτελέσματα είναι ο πρώτος αφού κρατάει όσο το δυνατόν ανεπηρέαστες τις τονικές διαφορές μεταξύ των pixels, ενώ στον δεύτερο χάνουμε δεδομένα.





    Μετατροπή GIF σε mp4

    Για τη μετατροπή των gif σε mp4, φόρτωσα τα gif που είχα ήδη φτιάξει στο MATLAB και με τη βοήθεια συναρτήσεων της MATLAB έκανα την μετατροπή ως εξής:

    Όπως παρατηρείτε και στον κώδικα παραπάνω (αλλά και στα αποτελέσματα παρακάτω), κράτησα ίδιο frame rate και στα mp4, για να είναι πιο αντικειμενική η σύγκριση.

    Τα βίντεο mp4 που προκύπτουν από το 1ο και από το 2o gif αντίστοιχα είναι τα παρακάτω:



    Σύγκριση των δύο τρόπων προβολής

    Αυτό που περιμένουμε να δούμε, είναι κάποιες απώλειες στο mp4 σε σύγκριση με το mp4 αφού είναι διαφορετικός ο τρόπος κωδικοποίησης/συμπίεσης. Το gif πρόκειται για μια ακολουθία εικόνων χωρίς απώλειες. Διατηρείται η αρχική πληροφορία της εικόνας.
    Αντίθετα, στο mp4, η κωδικοποίηση γίνεται συμπιέζοντας τις εικόνες και με βάση τις ομοιότητές τους, και προσαρμόζοντας ορισμένες φορές τα επόμενα frames με μετασχηματισμούς στηριζόμενους στα προηγούμενα frames.

    Φυσικό μέγεθος των gif, mp4

    Στο φυσικό τους μέγεθος, δε φαίνονται να έχουν διαφορές οι δύο προβολές. Φαίνονται ελάχιστα κάποιες παραμορφώσεις ανάμεσα στις αλλαγές εικόνων στο mp4, σαν να έχουμε απώλειες πληροφορίας (όπως ήταν αναμενόμενο), αλλά θέλει πολύ προσεκτική παρατήρηση για να τις δεί κανείς.







    Σε μεγέθυνση

    Στις μεγενθυμένες προβολές είναι προφανές ότι η ποιότητα της προβολής είναι χαμηλότερη, αλλά θα επικεντρωθούμε στις διαφορές μεταξύ των προβολών, κι όχι στις προβολές αυτές καθ αυτές.
    Εδώ φαίνονται σε μεγαλύτερο βαθμό οι απώλειες που έχουμε στο mp4 σε σχέση με το gif, τόσο στα σημεία που υπάρχουν ακμές, όπου από εικόνα σε εικόνα γίνονται καμιά φορά θολά και απροσδιόριστα τα περιγράμματα, αλλά και στα σημεία του μαύρου "φόντου" που σε ορισμένες αλλαγές μεταξύ εικόνων παρεμβάλλονται κάποια "παράσιτα", ασπρίζοντας σημειακά το μαύρο φόντο. Όλα αυτά φαίνονται προφανώς συγκρίνοντας με τα αντίστοιχα gif, στα οποία η ποιότητα των εικόνων δεν έχει αλλάξει καθώς είναι τέτοια η φύση της κωδικοποίησης.





    Σύγκριση μεγέθους αρχείων

    Η σημαντικότερη διαφορά ανάμεσα σε αυτές τις δύο διαφορετικές προβολές, κρύβεται πίσω από αυτό που βλέπει το μάτι. Έγκειται στο μέγεθος αυτών των αρχείων.
    Το πρώτο gif έχει μέγεθος 1,49 MB, ενώ το αντίστοιχο mp4 έχει μέγεθος 86,9 ΚΒ, και το δεύτερο gif έχει μέγεθος 1,73 ΜB, ενώ το αντίστοιχο mp4 έχει μέγεθος 90,7 KB. Παρατηρούμε λοιπόν μια τεράστια μείωση της τάξης του 95% του αρχικού μεγέθους. Γιατί γίνεται αυτό;
    Το gif ουσιαστικά περιέχει μια διαδοχή εικόνων, κρατώντας το μέγεθός τους, χωρίς καμία επεξεργασία. Αντίθετα, το mp4 κωδικοποιεί τις αντίστοιχες εικόνες, και τις συμπιέζει βρίσκοντας ομοιότητες τόσο στους άξονες χ, ψ, της εικόνας, όσο και ως προς το χρόνο. Πχ εάν μια εικόνα μοιάζει με την επόμενή της (όπως στην περίπτωσή μας), ο αλγόριθμος που χρησιμοποιείται για την mp4 κωδικοποίηση, μειώνει κατά πολύ το μέγεθος των εικόνων που μοιάζουν, χρησιμοποιώντας διάφορους μετασχηματισμούς, οι οποίοι μπορούν έχoντας μια εικόνα, να διαμορφώσουν την επόμενη σχεδόν όπως είναι, και τελικά μειώνεται κατά πολύ το μέγεθος του αρχείου σε σχέση με το gif.

    Προφανώς υπάρχουν κάποιες απώλειες στο mp4 στην ποιότητα σε σχέση με το gif, αλλά αναλόγως τη χρήση που θέλουμε να κάνουμε, πολλές φορές "αξίζει" να θυσιάσουμε αυτές τις μικρές απώλειες για να γλιτώσουμε το 95% του χώρου που δεσμεύει η προβολή που θέλουμε, ειδικά εάν πρόκειται για εικόνες/βίντεο μικρού μεγέθους, που οι απώλειες για τις οποίες συζητάμε δε θα είναι εμφανείς στο μάτι.

    Η διαφορά μεγέθους αυτή, είναι πολύ σημαντική όταν τελικός μας στόχος είναι το ανέβασμα του αρχείου μας σε κάποια ιστοσελίδα. Όπως είναι προφανές, μειώνοντας τόσο το μέγεθος των εικόνων που χρησιμοποιούμε σε μια ιστοσελίδα, μειώνεται το μέγεθος των δεδομένων που πρέπει να σταλούν από τον server στο χρήστη. (Κάτι το οποίο είναι πολύ σημαντικό αφού συνήθως το bandwidth είναι περιορισμένο από τους host providers, οπότε το να γλιτώνεις bandwidth εκ κατασκευής της ιστοσελίδας σου είναι ιδανικό.)



    Σημείωση: Θα βλέπαμε μεγαλύτερες διαφορές ανάμεσα στις δύο προβολές εάν μελετούσαμε διαδοχή εικόνων με πιο διευρυμένη παλέτα χρωμάτων. Γιατί στο gif η παλέτα χρωμάτων είναι περιορισμένη, ενώ στο mp4 δίνονται περισσότερες δυνατότητες όσον αφορά αυτό το κομμάτι. Στο παράδειγμα που μελετήσαμε όμως δεν φάνηκε αυτή η διαφορά, γιατί έγινε μετατροπή από gif σε mp4 οπότε η παλέτα χρωμάτων των εικόνων ήταν ήδη περιορισμένη σε 256 αποχρώσεις.




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

    Και οι δύο προβολές είναι χρήσιμες σε διαφορετικές περιπτώσεις.

    Το gif θα ήταν χρήσιμο σε περιπτώσεις που έχουμε:

  • Διαδοχές ενός περιορισμένου συνόλου εικόνων
  • Με περιορισμένη παλέτα χρωμάτων,
  • Δε μας ενδιαφέρει το τελικό μέγεθος του αρχείου
  • Θέλουμε συμβατότητα με την πλειοψηφία των εφαρμογών και των συσκευών.
  • Σε αυτή την περίπτωση, με το gif θα είχαμε όσο το δυνατόν λιγότερες απώλειες.

    Το mp4 θα ήταν χρήσιμο σε περιπτώσεις που:

  • Θέλουμε να ενσωματώσουμε τη διαδοχή των εικόνων σε κάποια ιστοσελίδα (Γλιτώνουμε bandwith)
  • Έχουμε μεγάλο πλήθος εικόνων (που διαδέχονται η μια την άλλη)
  • Έχουμε διευρυμένη παλέτα χρωμάτων
  • Θέλουμε τα τελικά αρχεία να έχουν περιορισμένο μέγεθος, πχ για να τα ενσωματώσουμε σε μια ιστοσελίδα χωρίς να καθυστερούν να φορτώσουν
  • Θέλουμε μεγαλύτερο frame rate





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