Πώς λειτουργεί η μορφή JPEG

Οι εικόνες JPEG είναι πανταχού παρούσες στην ψηφιακή μας ζωή, αλλά πίσω από αυτόν τον μανδύα συνειδητοποίησης κρύβονται αλγόριθμοι που αφαιρούν λεπτομέρειες που δεν μπορεί να δει το ανθρώπινο μάτι. Το αποτέλεσμα είναι η υψηλότερη οπτική ποιότητα στο μικρότερο μέγεθος αρχείου - αλλά πώς ακριβώς λειτουργούν όλα; Ας δούμε τι ακριβώς δεν βλέπουν τα μάτια μας!

Πώς λειτουργεί η μορφή JPEG

Είναι εύκολο να θεωρήσετε δεδομένη τη δυνατότητα αποστολής μιας φωτογραφίας σε έναν φίλο και να μην ανησυχείτε για τη συσκευή, το πρόγραμμα περιήγησης ή το λειτουργικό σύστημα που χρησιμοποιούν - αλλά αυτό δεν ίσχυε πάντα. Στις αρχές της δεκαετίας του 1980, οι υπολογιστές μπορούσαν να αποθηκεύουν και να εμφανίζουν ψηφιακές εικόνες, αλλά υπήρχαν πολλές ανταγωνιστικές ιδέες σχετικά με τον καλύτερο τρόπο για να γίνει αυτό. Δεν θα μπορούσατε απλώς να στείλετε μια εικόνα από τον έναν υπολογιστή στον άλλο και να ελπίζετε ότι θα λειτουργούσε.

Για να λυθεί αυτό το πρόβλημα, μια επιτροπή ειδικών από όλο τον κόσμο συγκεντρώθηκε το 1986 με το όνομα "Ένωση Επαγγελματιών Φωτογράφων” (Joint Photographic Experts Group, JPEG), που ιδρύθηκε ως μέρος της κοινής εργασίας του Διεθνούς Οργανισμού Τυποποίησης (ISO) και της Διεθνούς Ηλεκτροτεχνικής Επιτροπής (IEC), δύο διεθνών οργανισμών προτύπων με έδρα τη Γενεύη (Ελβετία).

Μια ομάδα ανθρώπων που ονομάζεται JPEG δημιούργησε το πρότυπο συμπίεσης ψηφιακής εικόνας JPEG το 1992. Όποιος έχει χρησιμοποιήσει το Διαδίκτυο πιθανότατα έχει συναντήσει εικόνες με κωδικοποίηση JPEG. Αυτός είναι ο πιο συνηθισμένος τρόπος κωδικοποίησης, αποστολής και αποθήκευσης εικόνων. Από ιστοσελίδες έως email έως μέσα κοινωνικής δικτύωσης, το JPEG χρησιμοποιείται δισεκατομμύρια φορές την ημέρα - σχεδόν κάθε φορά που προβάλλουμε ή στέλνουμε μια εικόνα στο διαδίκτυο. Χωρίς JPEG, ο ιστός θα ήταν λιγότερο φωτεινός, πιο αργός και πιθανώς θα είχε λιγότερες φωτογραφίες γάτας!

Αυτό το άρθρο αφορά τον τρόπο αποκωδικοποίησης μιας εικόνας JPEG. Με άλλα λόγια, σχετικά με το τι απαιτείται για τη μετατροπή συμπιεσμένων δεδομένων που είναι αποθηκευμένα σε έναν υπολογιστή σε εικόνα που εμφανίζεται στην οθόνη. Αυτό αξίζει να το γνωρίζουμε, όχι μόνο επειδή είναι σημαντικό για την κατανόηση της τεχνολογίας που χρησιμοποιούμε σε καθημερινή βάση, αλλά και επειδή αποκαλύπτοντας τα επίπεδα συμπίεσης, θα γνωρίζουμε καλύτερα την αντίληψη και την όραση, καθώς και ποιες λεπτομέρειες είναι τα μάτια μας ευαίσθητος σε.

Εξάλλου, είναι πολύ ενδιαφέρον να παίζεις με τις εικόνες με αυτόν τον τρόπο.

Πώς λειτουργεί η μορφή JPEG

Κοιτάζοντας μέσα σε ένα JPEG

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

Αν κατεβάσετε αυτό το χαριτωμένο φωτογραφία μιας γάτας και ανοίξτε το σε ένα πρόγραμμα επεξεργασίας κειμένου, θα δείτε ένα σωρό μπερδεμένους χαρακτήρες.

Πώς λειτουργεί η μορφή JPEG
Εδώ χρησιμοποιώ το Notepad++ για να επιθεωρήσω τα περιεχόμενα του αρχείου, επειδή οι συνήθεις επεξεργαστές κειμένου όπως το Σημειωματάριο από τα Windows θα ανακατέψουν το δυαδικό αρχείο μετά την αποθήκευση και δεν θα ταιριάζει στη μορφή JPEG.

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

Αυτά τα σημεία που βλέπετε είναι γνωστά ως φωσφαίνια, και δεν είναι αποτέλεσμα έκθεσης σε ελαφρύ ερέθισμα ή παραισθήσεις που δημιουργούνται από το μυαλό. Εμφανίζονται επειδή ο εγκέφαλός σας πιστεύει ότι τυχόν ηλεκτρικά σήματα στα οπτικά νεύρα μεταφέρουν πληροφορίες για το φως. Ο εγκέφαλος χρειάζεται να κάνει τέτοιες υποθέσεις, γιατί δεν υπάρχει τρόπος να γνωρίζουμε αν το σήμα είναι ήχος, όραμα ή κάτι άλλο. Όλα τα νεύρα του σώματος μεταδίδουν ακριβώς τις ίδιες ηλεκτρικές ώσεις. Όταν ασκείτε πίεση στα μάτια σας, στέλνετε σήματα που δεν είναι οπτικά, αλλά ενεργοποιούν υποδοχείς στο μάτι, τους οποίους ο εγκέφαλός σας ερμηνεύει —σε αυτή την περίπτωση, εσφαλμένα— ως κάτι οπτικό. Μπορείτε να δείτε κυριολεκτικά την πίεση!

Είναι αστείο να σκεφτόμαστε πόσο όμοιοι είναι οι υπολογιστές με τον εγκέφαλο, αλλά είναι επίσης μια χρήσιμη αναλογία, που δείχνει πόσο πολύ η σημασία των δεδομένων -είτε μεταφέρονται μέσω του σώματος από νεύρα είτε αποθηκεύονται σε έναν υπολογιστή- εξαρτάται από τον τρόπο ερμηνείας τους. Όλα τα δυαδικά δεδομένα αποτελούνται από XNUMX και XNUMX, βασικά στοιχεία ικανά να μεταφέρουν κάθε είδους πληροφορία. Ο υπολογιστής σας συχνά μαντεύει πώς να τα ερμηνεύσει χρησιμοποιώντας ενδείξεις όπως οι επεκτάσεις αρχείων. Τώρα το κάνουμε να τα ερμηνεύσει ως κείμενο, γιατί αυτό περιμένει ο επεξεργαστής κειμένου.

Για να κατανοήσουμε πώς να αποκωδικοποιήσουμε ένα JPEG, πρέπει να δούμε τα ίδια τα αρχικά σήματα - τα δυαδικά δεδομένα. Αυτό μπορεί να γίνει με ένα hex editor ή απευθείας ιστοσελίδα του αρχικού άρθρου! Υπάρχει μια εικόνα, δίπλα στην οποία στο πεδίο κειμένου εμφανίζονται όλα τα byte της (εκτός από την κεφαλίδα) σε δεκαδική μορφή. Μπορείτε να τα αλλάξετε και το σενάριο θα επανακωδικοποιηθεί και θα παράγει μια νέα εικόνα εν κινήσει.

Πώς λειτουργεί η μορφή JPEG

Μπορείτε να μάθετε πολλά απλά παίζοντας με αυτόν τον επεξεργαστή. Για παράδειγμα, μπορείτε να πείτε με ποια σειρά αποθηκεύονται τα pixel;

Σε αυτό το παράδειγμα, το περίεργο είναι ότι η αλλαγή κάποιων αριθμών δεν επηρεάζει καθόλου την εικόνα και, για παράδειγμα, αν αντικαταστήσετε τον αριθμό 17 με το 0 στην πρώτη γραμμή, τότε η φωτογραφία θα καταστραφεί εντελώς!

Πώς λειτουργεί η μορφή JPEG

Άλλες αλλαγές, όπως η αλλαγή του 7 στη γραμμή 1988 σε 254, αλλάζουν το χρώμα, αλλά μόνο τα επόμενα pixel.

Πώς λειτουργεί η μορφή JPEG

Ίσως το πιο περίεργο είναι ότι κάποιοι αριθμοί αλλάζουν όχι μόνο το χρώμα, αλλά και το σχήμα της εικόνας. Αλλάξτε το 70 στη γραμμή 12 σε 2 και κοιτάξτε την επάνω σειρά της εικόνας για να δείτε τι εννοώ.

Πώς λειτουργεί η μορφή JPEG

Και ανεξάρτητα από την εικόνα JPEG που χρησιμοποιείτε, θα βρίσκετε πάντα αυτά τα κρυπτικά μοτίβα σκακιού όταν επεξεργάζεστε byte.

Παίζοντας με το πρόγραμμα επεξεργασίας, είναι δύσκολο να καταλάβουμε πώς να αναδημιουργήσετε μια φωτογραφία από αυτά τα byte, καθώς η συμπίεση JPEG αποτελείται από τρεις διαφορετικές τεχνολογίες που εφαρμόζονται διαδοχικά σε επίπεδα. Θα μελετήσουμε το καθένα ξεχωριστά για να αποκαλύψουμε τη μυστηριώδη συμπεριφορά που παρατηρούμε.

Τρία επίπεδα συμπίεσης JPEG:

  1. Έγχρωμη υποδειγματοληψία.
  2. Διακριτός μετασχηματισμός συνημιτονίου και διακριτοποίηση.
  3. Κωδικοποίηση μήκους εκτέλεσης, δέλτα и Huffman

Για να σας δώσουμε μια ιδέα για την κλίμακα της συμπίεσης, σημειώστε ότι η παραπάνω εικόνα αντιπροσωπεύει 79 αριθμούς, που είναι περίπου 819 KB. Αν το αποθηκεύαμε χωρίς συμπίεση, θα χρειαζόμασταν τρεις αριθμούς για κάθε pixel - για τα κόκκινα, πράσινα και μπλε στοιχεία. Αυτό θα ανερχόταν σε 79 αριθμούς ή περίπου. 917 Kb. Ως αποτέλεσμα της συμπίεσης JPEG, το τελικό αρχείο έχει μειωθεί πάνω από 700 φορές!

Στην πραγματικότητα, αυτή η εικόνα μπορεί να συμπιεστεί πολύ περισσότερο. Παρακάτω υπάρχουν δύο εικόνες δίπλα-δίπλα - η φωτογραφία στα δεξιά συμπιέστηκε στα 16 KB, δηλαδή 57 φορές λιγότερο από την ασυμπίεστη έκδοση!

Πώς λειτουργεί η μορφή JPEG

Αν κοιτάξετε προσεκτικά, θα δείτε ότι αυτές οι εικόνες δεν είναι πανομοιότυπες. Και οι δύο είναι εικόνες με συμπίεση JPEG, αλλά η σωστή είναι πολύ μικρότερη σε όγκο. Φαίνεται επίσης λίγο χειρότερο (δείτε τα τετράγωνα χρώματος φόντου). Επομένως, το JPEG ονομάζεται επίσης συμπίεση με απώλειες. κατά τη διαδικασία συμπίεσης, η εικόνα αλλάζει και χάνει κάποιες λεπτομέρειες.

1. Έγχρωμη υποδειγματοληψία

Ακολουθεί μια εικόνα στην οποία εφαρμόζεται μόνο το πρώτο επίπεδο συμπίεσης.

Πώς λειτουργεί η μορφή JPEG
(Διαδραστική έκδοση σε πρωτότυπο άρθρα). Η αφαίρεση ενός αριθμού καταστρέφει όλα τα χρώματα. Ωστόσο, εάν αφαιρεθούν ακριβώς έξι αριθμοί, αυτό έχει ελάχιστη έως καθόλου επίδραση στην εικόνα.

Τώρα οι αριθμοί είναι λίγο πιο εύκολο να αποκρυπτογραφηθούν. Αυτή είναι σχεδόν μια απλή λίστα χρωμάτων, κάθε byte αλλάζει ακριβώς ένα pixel, αλλά έχει ήδη το μισό μέγεθος μιας ασυμπίεστης εικόνας (η οποία θα χρειαζόταν περίπου 300 KB σε τόσο μειωμένο μέγεθος). Μάντεψε γιατί?

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

Πώς λειτουργεί η μορφή JPEG

Αυτό συμβαίνει επειδή αυτά τα byte αντιπροσωπεύουν Y (φωτεινότητα),

Πώς λειτουργεί η μορφή JPEG

Cb (σχετικό μπλε),

Πώς λειτουργεί η μορφή JPEG

και εικόνες Cr (σχετική ερυθρότητα).

Πώς λειτουργεί η μορφή JPEG

Γιατί να μην χρησιμοποιήσετε το RGB; Άλλωστε έτσι λειτουργούν οι περισσότερες σύγχρονες οθόνες. Η οθόνη σας μπορεί να εμφανίζει οποιοδήποτε χρώμα, συμπεριλαμβανομένου του κόκκινου, του πράσινου και του μπλε σε διαφορετικές εντάσεις για κάθε pixel. Το λευκό αποκτάται ενεργοποιώντας και τα τρία σε πλήρη φωτεινότητα και το μαύρο τα απενεργοποιεί.

Πώς λειτουργεί η μορφή JPEG

Μοιάζει επίσης πολύ με το πώς λειτουργεί το ανθρώπινο μάτι. Οι χρωματικοί υποδοχείς στα μάτια μας ονομάζονται "κώνοι", και χωρίζονται σε τρεις τύπους, καθένας από τους οποίους είναι πιο ευαίσθητος είτε σε κόκκινο, είτε σε πράσινο, είτε σε μπλε χρώματα [Οι κώνοι τύπου S είναι ευαίσθητοι στο ιώδες-μπλε (S από τα αγγλικά. Σύντομο - φάσμα μικρού μήκους κύματος), Τύπου M - σε πράσινο-κίτρινο (Μ από τα αγγλικά. Μεσαίο - μεσαίο κύμα), και τύπου L - σε κίτρινο-κόκκινο (L από τα αγγλικά. Long - μακρού κύματος) μέρη του φάσματος. Η παρουσία αυτών των τριών τύπων κώνων (και ράβδων ευαίσθητων στο σμαραγδένιο πράσινο τμήμα του φάσματος) δίνει σε ένα άτομο έγχρωμη όραση. / περ. μετάφρ.]. Ράβδοι, ο άλλος τύπος φωτοϋποδοχέα στα μάτια μας, είναι σε θέση να ανιχνεύσει αλλαγές στη φωτεινότητα αλλά είναι πολύ πιο ευαίσθητος στο χρώμα. Τα μάτια μας έχουν περίπου 120 εκατομμύρια ράβδους και μόνο 6 εκατομμύρια κώνους.

Επομένως, τα μάτια μας παρατηρούν αλλαγές στη φωτεινότητα πολύ καλύτερα από τις αλλαγές στο χρώμα. Εάν διαχωρίσετε το χρώμα από τη φωτεινότητα, μπορείτε να αφαιρέσετε λίγο χρώμα και κανείς δεν θα παρατηρήσει τίποτα. Η υποδειγματοληψία χρώματος είναι η διαδικασία αναπαράστασης των χρωματικών στοιχείων μιας εικόνας σε χαμηλότερη ανάλυση από τα στοιχεία φωτεινότητας. Στο παραπάνω παράδειγμα, κάθε εικονοστοιχείο έχει ακριβώς ένα στοιχείο Υ και κάθε μεμονωμένη ομάδα τεσσάρων εικονοστοιχείων έχει ακριβώς ένα στοιχείο Cb και ένα Cr. Επομένως, η εικόνα περιέχει τέσσερις φορές λιγότερες πληροφορίες χρώματος από την αρχική.

Ο χρωματικός χώρος YCbCr δεν χρησιμοποιείται μόνο σε JPEG. Αρχικά εφευρέθηκε το 1938 για τηλεοπτικές εκπομπές. Δεν έχουν όλοι έγχρωμη τηλεόραση, επομένως ο διαχωρισμός χρώματος και φωτεινότητας επέτρεψε σε όλους να λάβουν το ίδιο σήμα και οι τηλεοράσεις χωρίς χρώμα απλώς χρησιμοποιούσαν μόνο το στοιχείο φωτεινότητας.

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

Η προδιαγραφή JPEG δεν απαιτεί τη χρήση YCbCr. Όμως στα περισσότερα αρχεία χρησιμοποιείται γιατί δίνει καλύτερης ποιότητας εικόνες μετά από υποδειγματοληψία σε σύγκριση με το RGB. Αλλά δεν χρειάζεται να δεχθείτε τον λόγο μου. Δείτε μόνοι σας στον παρακάτω πίνακα πώς θα ήταν η υποδειγματοληψία κάθε μεμονωμένου στοιχείου τόσο στο RGB όσο και στο YCbCr.

Πώς λειτουργεί η μορφή JPEG
(Διαδραστική έκδοση σε πρωτότυπο άρθρα).

Η αφαίρεση του μπλε δεν είναι τόσο αισθητή όσο το κόκκινο ή το πράσινο. Αυτό οφείλεται στους έξι εκατομμύρια κώνους στα μάτια σας, περίπου το 64% είναι ευαίσθητο στο κόκκινο, το 32% στο πράσινο και το 2% στο μπλε.

Η υποδειγματοληψία του στοιχείου Υ (κάτω αριστερά) φαίνεται καλύτερα. Ακόμη και μια μικρή αλλαγή είναι αισθητή.

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

2. Διακριτός συνημιτονικός μετασχηματισμός και διακριτοποίηση

Αυτό το επίπεδο συμπίεσης, ως επί το πλείστον, ορίζει την ουσία του JPEG. Μετά τη μετατροπή των χρωμάτων σε YCbCr, τα στοιχεία συμπιέζονται μεμονωμένα, επομένως μπορούμε να επικεντρωθούμε μόνο στο στοιχείο Y από εδώ και στο εξής. Και εδώ είναι πώς φαίνονται τα byte του στοιχείου Y μετά την εφαρμογή αυτού του επιπέδου.

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

Με την πρώτη ματιά, φαίνεται πολύ κακή συμπίεση. Υπάρχουν 100 εικονοστοιχεία σε μια εικόνα και χρειάζονται 000 αριθμοί για να υποδείξουν τη φωτεινότητά τους (στοιχεία Υ) - αυτό είναι χειρότερο από το να μην συμπιέζετε τίποτα!

Ωστόσο, σημειώστε ότι οι περισσότεροι από αυτούς τους αριθμούς είναι μηδέν. Επιπλέον, όλα αυτά τα μηδενικά στο τέλος των γραμμών μπορούν να αφαιρεθούν χωρίς αλλαγή της εικόνας. Απομένουν περίπου 26 αριθμοί, δηλαδή σχεδόν 000 φορές λιγότεροι!

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

Αυτά τα μοτίβα σχηματίζονται με βάση την γραφική παράσταση συνημιτόνου. Δείτε πώς μοιάζουν μερικά από αυτά:

Πώς λειτουργεί η μορφή JPEG
8 στις 64 πιθανότητες

Παρακάτω είναι μια εικόνα που δείχνει και τα 64 μοτίβα.

Πώς λειτουργεί η μορφή JPEG
(Διαδραστική έκδοση σε πρωτότυπο άρθρα).

Αυτά τα μοτίβα έχουν ιδιαίτερη σημασία καθώς αποτελούν τη βάση των εικόνων 8x8. Εάν δεν είστε εξοικειωμένοι με τη γραμμική άλγεβρα, τότε αυτό σημαίνει ότι οποιαδήποτε εικόνα 8x8 μπορεί να ληφθεί από αυτά τα 64 μοτίβα. Το DCT είναι η διαδικασία διάσπασης των εικόνων σε μπλοκ 8x8 και μετατροπής κάθε μπλοκ σε συνδυασμό αυτών των 64 συντελεστών.

Το γεγονός ότι οποιαδήποτε εικόνα μπορεί να αποτελείται από 64 συγκεκριμένα μοτίβα μοιάζει μαγικό. Ωστόσο, αυτό είναι το ίδιο με το να λέμε ότι οποιοδήποτε μέρος στη Γη μπορεί να περιγραφεί με δύο αριθμούς - γεωγραφικό πλάτος και μήκος [που υποδεικνύει τα ημισφαίρια / περίπου. μετάφρ.]. Συχνά σκεφτόμαστε την επιφάνεια της Γης ως δισδιάστατη, επομένως χρειαζόμαστε μόνο δύο αριθμούς. Μια εικόνα 8x8 έχει 64 διαστάσεις, οπότε χρειαζόμαστε 64 αριθμούς.

Δεν είναι ακόμη σαφές πώς αυτό μας βοηθάει όσον αφορά τη συμπίεση. Εάν χρειαζόμαστε 64 αριθμούς για να αναπαραστήσουμε μια εικόνα 8x8, γιατί θα ήταν καλύτερο από την αποθήκευση 64 στοιχείων φωτεινότητας; Το κάνουμε αυτό για τον ίδιο λόγο που μετατρέψαμε τρεις αριθμούς RGB σε τρεις αριθμούς YCbCr: μας επιτρέπει να αφαιρούμε λεπτές λεπτομέρειες.

Είναι δύσκολο να δούμε ποιες ακριβώς λεπτομέρειες αφαιρούνται σε αυτό το στάδιο, επειδή το JPEG εφαρμόζει DCT σε μπλοκ 8x8. Ωστόσο, κανείς δεν μας απαγορεύει να το εφαρμόσουμε σε ολόκληρη την εικόνα. Δείτε πώς φαίνεται το DCT για το στοιχείο Y όταν εφαρμόζεται σε ολόκληρη την εικόνα:

Πώς λειτουργεί η μορφή JPEG

Περισσότεροι από 60 αριθμοί μπορούν να αφαιρεθούν από το τέλος χωρίς ουσιαστικά καμία αξιοσημείωτη αλλαγή στη φωτογραφία.

Πώς λειτουργεί η μορφή JPEG

Σημειώστε, ωστόσο, ότι αν μηδενίσουμε τους πρώτους πέντε αριθμούς, η διαφορά θα είναι εμφανής.

Πώς λειτουργεί η μορφή JPEG

Οι αριθμοί στην αρχή αντιπροσωπεύουν αλλαγές χαμηλής συχνότητας στην εικόνα και το βλέμμα μας τις διακρίνει καλύτερα. Οι αριθμοί προς το τέλος υποδεικνύουν αλλαγές υψηλής συχνότητας που είναι πιο δύσκολο να παρατηρηθούν. Για να "δούμε αυτό που δεν μπορεί να δει το μάτι" μπορούμε να απομονώσουμε αυτές τις λεπτομέρειες υψηλής συχνότητας μηδενίζοντας τους πρώτους 5000 αριθμούς.

Πώς λειτουργεί η μορφή JPEG

Βλέπουμε όλες τις περιοχές της εικόνας όπου συμβαίνει η μεγαλύτερη αλλαγή από pixel σε pixel. Ξεχωρίζουν τα μάτια του γάτου, τα μουστάκια του, η κουβέρτα και οι σκιές στην κάτω αριστερή γωνία. Μπορείτε να προχωρήσετε παραπέρα μηδενίζοντας τους πρώτους 10 αριθμούς:

Πώς λειτουργεί η μορφή JPEG

20 000:

Πώς λειτουργεί η μορφή JPEG

40 000:

Πώς λειτουργεί η μορφή JPEG

60 000:

Πώς λειτουργεί η μορφή JPEG

Αυτές οι λεπτομέρειες υψηλής συχνότητας αφαιρούνται με JPEG κατά τη διάρκεια του σταδίου συμπίεσης. Η μετατροπή χρωμάτων σε συντελεστές DCT είναι χωρίς απώλειες. Οι απώλειες σχηματίζονται στο βήμα δειγματοληψίας, όπου αφαιρούνται τιμές υψηλής συχνότητας ή κοντά στο μηδέν. Όταν μειώνετε την ποιότητα της αποθήκευσης JPEG, το πρόγραμμα αυξάνει το όριο για τον αριθμό των τιμών που πρέπει να αφαιρεθούν, γεγονός που μειώνει το μέγεθος του αρχείου, αλλά κάνει την εικόνα πιο pixel. Έτσι η εικόνα στην πρώτη ενότητα, η οποία ήταν 57 φορές μικρότερη, έμοιαζε κάπως έτσι. Κάθε μπλοκ 8x8 αντιπροσώπευε πολύ μικρότερο αριθμό συντελεστών DCT σε σύγκριση με την έκδοση υψηλότερης ποιότητας.

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

Εδώ, για πλάκα, τι συμβαίνει όταν χρησιμοποιείτε μόνο 24 αριθμούς:

Πώς λειτουργεί η μορφή JPEG

Ή μόνο 5000:

Πώς λειτουργεί η μορφή JPEG

Πολύ θολό αλλά αναγνωρίσιμο!

3. Κωδικοποίηση μηκών εκτέλεσης, δέλτα και Huffman

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

Πώς μπορείτε να συμπιέσετε κάτι χωρίς να απορρίψετε πληροφορίες; Φανταστείτε πώς θα περιγράφαμε ένα απλό μαύρο ορθογώνιο 700 x 437.

Το JPEG χρησιμοποιεί 5000 αριθμούς για αυτό, αλλά μπορούν να επιτευχθούν πολύ καλύτερα αποτελέσματα. Μπορείτε να φανταστείτε ένα σχήμα κωδικοποίησης που να περιγράφει μια τέτοια εικόνα σε όσο το δυνατόν λιγότερα byte;

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

Το μέγεθος ενός αρχείου JPEG με μαύρο ορθογώνιο είναι πολύ μεγαλύτερο από 4 byte - θυμηθείτε ότι σε επίπεδο DCT, η συμπίεση εφαρμόζεται σε μπλοκ 8x8 pixel. Επομένως, χρειαζόμαστε τουλάχιστον έναν συντελεστή DCT για κάθε 64 pixel. Χρειαζόμαστε ένα γιατί αντί να αποθηκεύουμε έναν μόνο συντελεστή DCT ακολουθούμενο από 63 μηδενικά, η κωδικοποίηση μήκους εκτέλεσης μας επιτρέπει να αποθηκεύουμε έναν μόνο αριθμό και να δηλώνουμε "όλοι οι άλλοι είναι μηδενικά".

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

12 13 14 14 14 13 13 14

Θα μπορούσαμε να ξεκινήσουμε με το 12 και στη συνέχεια απλώς να γράψουμε πόσα να προσθέσουμε ή να αφαιρέσουμε για να πάρουμε τον επόμενο αριθμό. Και αυτή η ακολουθία στην κωδικοποίηση δέλτα έχει τη μορφή:

12 1 1 0 0 -1 0 1

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

Η κωδικοποίηση Delta είναι μία από τις λίγες τεχνικές που χρησιμοποιούνται εκτός των μπλοκ 8x8. Από τους 64 συντελεστές DCT, ένας είναι απλώς μια σταθερή κυματοσυνάρτηση (μονόχρωμο). Αντιπροσωπεύει τη μέση φωτεινότητα κάθε μπλοκ για τα στοιχεία φωτεινότητας ή τη μέση μπλε χρώμα για τα στοιχεία Cb, και ούτω καθεξής. Η πρώτη τιμή κάθε μπλοκ DCT ονομάζεται τιμή DC και κάθε τιμή DC κωδικοποιείται ως δέλτα σε σχέση με τις προηγούμενες. Επομένως, η αλλαγή της φωτεινότητας του πρώτου μπλοκ θα επηρεάσει όλα τα μπλοκ.

Το τελευταίο μυστήριο παραμένει: πώς η αλλαγή του ενικού καταστρέφει εντελώς την όλη εικόνα; Μέχρι στιγμής, τα επίπεδα συμπίεσης δεν είχαν τέτοιες ιδιότητες. Η απάντηση βρίσκεται στην κεφαλίδα JPEG. Τα πρώτα 500 byte περιέχουν μεταδεδομένα για την εικόνα - πλάτος, ύψος κ.λπ., και μέχρι στιγμής δεν έχουμε δουλέψει με αυτά.

Χωρίς κεφαλίδα, είναι σχεδόν αδύνατο (καλά, πολύ δύσκολο) να αποκωδικοποιήσετε ένα JPEG. Θα μοιάζει σαν να προσπαθώ να σας περιγράψω μια εικόνα και αρχίζω να επινοώ λέξεις για να μεταφέρω την εντύπωσή μου. Η περιγραφή θα είναι μάλλον πολύ συνοπτική, αφού μπορώ να επινοήσω λέξεις με ακριβώς το νόημα που θέλω να μεταφέρω, αλλά για όλους τους άλλους δεν θα έχουν νόημα.

Ακούγεται ανόητο, αλλά αυτό ακριβώς συμβαίνει. Κάθε εικόνα JPEG συμπιέζεται με συγκεκριμένους κωδικούς. Το λεξικό κώδικα αποθηκεύεται στην κεφαλίδα. Αυτή η τεχνική ονομάζεται «κώδικας Huffman» και το λεξικό ονομάζεται πίνακας Huffman. Στην κεφαλίδα, ο πίνακας επισημαίνεται με δύο byte - 255 και μετά 196. Κάθε στοιχείο χρώματος μπορεί να έχει τον δικό του πίνακα.

Οι αλλαγές στον πίνακα θα επηρεάσουν δραστικά οποιαδήποτε εικόνα. Ένα καλό παράδειγμα είναι να αλλάξετε το 15 σε 1 στη 12η γραμμή.

Πώς λειτουργεί η μορφή JPEG

Αυτό συμβαίνει επειδή οι πίνακες καθορίζουν τον τρόπο ανάγνωσης μεμονωμένων bits. Μέχρι στιγμής, έχουμε δουλέψει μόνο με δυαδικούς αριθμούς σε δεκαδική μορφή. Αλλά αυτό μας κρύβει το γεγονός ότι αν θέλετε να αποθηκεύσετε τον αριθμό 1 σε ένα byte, τότε θα μοιάζει με 00000001, επειδή κάθε byte πρέπει να έχει ακριβώς οκτώ bit, ακόμα κι αν χρειάζεται μόνο ένα από αυτά.

Αυτό είναι δυνητικά μεγάλη σπατάλη χώρου εάν έχετε πολλούς μικρούς αριθμούς. Ο κώδικας Huffman είναι μια τεχνική που μας επιτρέπει να χαλαρώσουμε αυτή την απαίτηση ότι κάθε αριθμός πρέπει να καταλαμβάνει οκτώ bit. Αυτό σημαίνει ότι αν δείτε δύο byte:

234 115

Στη συνέχεια, ανάλογα με τον πίνακα Huffman, μπορεί να είναι τρεις αριθμοί. Για να τα εξαγάγετε, πρέπει πρώτα να τα χωρίσετε σε μεμονωμένα bits:

11101010 01110011

Στη συνέχεια γυρίζουμε στον πίνακα για να καταλάβουμε πώς να τα ομαδοποιήσουμε. Για παράδειγμα, θα μπορούσε να είναι τα πρώτα έξι bit, (111010) ή 58 σε δεκαδικά, ακολουθούμενα από πέντε bit (10011) ή 19 και τέλος τα τελευταία τέσσερα bit (0011) ή 3.

Επομένως, είναι πολύ δύσκολο να κατανοήσουμε τα bytes σε αυτό το στάδιο συμπίεσης. Τα byte δεν αντιπροσωπεύουν αυτό που φαίνονται. Δεν θα μπω στις λεπτομέρειες της εργασίας με τον πίνακα σε αυτό το άρθρο, αλλά υλικά για αυτό το θέμα στο διαδίκτυο αρκετά.

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

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

Συνοψίζοντας: τι χρειάζεται λοιπόν για την αποκωδικοποίηση ενός JPEG; Απαραίτητη:

  1. Εξαγάγετε τους πίνακες Huffman από την κεφαλίδα και αποκωδικοποιήστε τα bit.
  2. Εξάγετε τους διακριτούς συντελεστές μετασχηματισμού συνημιτόνου για κάθε στοιχείο χρώματος και φωτεινότητας για κάθε μπλοκ 8x8 μετατρέποντας αντιστρόφως την κωδικοποίηση μήκους εκτέλεσης και το δέλτα.
  3. Συνδυάστε συνημίτονα με βάση τους συντελεστές για να λάβετε τιμές pixel για κάθε μπλοκ 8x8.
  4. Κλιμακώστε τα στοιχεία χρώματος εάν πραγματοποιήθηκε υποδειγματοληψία (αυτές οι πληροφορίες βρίσκονται στην κεφαλίδα).
  5. Μετατρέψτε τις προκύπτουσες τιμές YCbCr για κάθε pixel σε RGB.
  6. Φέρτε την εικόνα στην οθόνη!

Σοβαρή δουλειά για απλή προβολή μιας φωτογραφίας με μια γάτα! Ωστόσο, αυτό που μου αρέσει σε αυτό είναι ότι δείχνει πόσο ανθρωποκεντρική είναι η τεχνολογία JPEG. Βασίζεται στα χαρακτηριστικά της αντίληψής μας, γεγονός που μας επιτρέπει να επιτύχουμε πολύ καλύτερη συμπίεση από τις συμβατικές τεχνολογίες. Και τώρα, κατανοώντας πώς λειτουργεί το JPEG, μπορείτε να φανταστείτε πώς αυτές οι τεχνολογίες μπορούν να μεταφερθούν σε άλλους τομείς. Για παράδειγμα, η κωδικοποίηση δέλτα στο βίντεο μπορεί να οδηγήσει σε σημαντική μείωση του μεγέθους του αρχείου, καθώς συχνά υπάρχουν ολόκληρες περιοχές που δεν αλλάζουν από καρέ σε καρέ (για παράδειγμα, το φόντο).

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

Πηγή: www.habr.com

Προσθέστε ένα σχόλιο