JPEG. Αλγόριθμος συμπίεσης

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

Μια πρέζα ιστορίας

Μια κουταλιά της σούπας άρθρο της Wikipedia:

Το JPEG (Joint Photographic Experts Group) είναι μια από τις δημοφιλείς μορφές γραφικών ράστερ που χρησιμοποιούνται για την αποθήκευση φωτογραφιών και παρόμοιων εικόνων.

Αυτό το πρότυπο αναπτύχθηκε από την Joint Photographic Experts Group το 1991 για αποτελεσματική συμπίεση εικόνας.

Πώς μετατρέπονται οι εικόνες από ακατέργαστες σε JPEG;

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

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

Το πρώτο πράγμα που έχει να κάνει με την εικόνα είναι "αραίωμα" (υποδειγματοληψία). Είναι εύκολο να γίνει κατανοητό: λαμβάνεται μια συστοιχία εικονοστοιχείων 2x2, στη συνέχεια λαμβάνονται Cb και Cr - οι μέσες τιμές καθενός από τα στοιχεία YCbCr αυτών των 4 pixel. Ετσι, κερδίσαμε 6 byte, αντί για 4 Y, 4 Cb, 4 Cr πήραμε 4 Y και τα ίδια Cb και Cr για καθένα από αυτά (4 + 4 + 4 = 12; 4 + 1 + 1 = 6; 12 - 6 = 6). Σε ομοιόμορφη κλίμακα 2x2, η συμπίεση με απώλειες με αναλογία συμπίεσης 2:1 ακούγεται σταθερή. Αυτό ισχύει για ολόκληρη την εικόνα. Και έτσι - έπεσαν μισό μέγεθος. Και μπορούμε να χρησιμοποιήσουμε αυτή την τεχνική χάρη στη χρωματική μας αντίληψη. Ένα άτομο θα παρατηρήσει εύκολα μια διαφορά στη φωτεινότητα, αλλά όχι στο χρώμα, εάν υπολογίζεται κατά μέσο όρο σε ένα μικρό μπλοκ pixel. Η αραίωση μπορεί να γίνει και σε μια γραμμή, 4 pixel οριζόντια και κάθετα. Η πρώτη επιλογή χρησιμοποιείται πιο συχνά. Εάν η ποιότητα της εικόνας είναι σημαντική, τότε ο αποδεκατισμός δεν πραγματοποιείται καθόλου.
Μια οπτική απεικόνιση της αραίωσης (ο Habr δεν μου επέτρεψε να εισάγω ένα gif) - https://i.ibb.co/Rg5Th9H/150953010617579181.gif

Το κύριο μέρος της προετοιμασίας

DCM

Τώρα έρχεται το πιο δύσκολο και απαραίτητο κομμάτι. Ολόκληρη η εικόνα χωρίζεται σε μπλοκ 8x8 (η πλήρωση χρησιμοποιείται εάν η ανάλυση δεν είναι πολλαπλάσιο της πλευράς του μπλοκ).

Τώρα εφαρμόστε σε κάθε μπλοκ DCT (Διακεκριμένος μετασχηματισμός συνημιτόνου). Σε αυτό το μέρος, όλα τα περιττά βγαίνουν από την εικόνα. Χρησιμοποιώντας το DCT, πρέπει να κατανοήσετε εάν ένα δεδομένο μπλοκ (8×8) περιγράφει οποιοδήποτε μονότονο μέρος της εικόνας: τον ουρανό, τον τοίχο. ή περιέχει πολύπλοκη δομή (μαλλιά, σύμβολα κ.λπ.). Είναι λογικό ότι 64 εικονοστοιχεία παρόμοιου χρώματος μπορούν να περιγραφούν μόνο με 1, γιατί το μέγεθος του μπλοκ είναι ήδη γνωστό. Τόσο πολύ για τη συμπίεση: 64 προς 1.

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

Κβαντισμός

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

Η κβαντοποίηση γίνεται για να δημιουργηθεί η δυνατότητα ακόμη μεγαλύτερης συμπίεσης. Δείτε πώς φαίνεται χρησιμοποιώντας το παράδειγμα κβαντισμού του γραφήματος y = sin(x):

JPEG. Αλγόριθμος συμπίεσης

Συμπίεση

Πρώτα περνάμε από τη μήτρα σε ένα μοτίβο ζιγκ-ζαγκ:

JPEG. Αλγόριθμος συμπίεσης

Παίρνουμε έναν μονοδιάστατο πίνακα με αριθμούς. Βλέπουμε ότι υπάρχουν πολλά μηδενικά σε αυτό, μπορούν να αφαιρεθούν. Για να γίνει αυτό, αντί για μια ακολουθία πολλών μηδενικών, εισάγουμε 1 μηδέν και μετά από αυτό έναν αριθμό που δείχνει τον αριθμό τους στην ακολουθία. Με αυτόν τον τρόπο μπορείτε να επαναφέρετε το 1/3 του μεγέθους ολόκληρου του πίνακα. Και, στη συνέχεια, απλώς συμπιέζουμε αυτόν τον πίνακα χρησιμοποιώντας τη μέθοδο Huffman και τον γράφουμε στο ίδιο το αρχείο.

Πού να χρησιμοποιήσετε

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

Παραγωγή

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

πηγές

Άρθρο σχετικά με το YCbCr στη Wikipedia
Άρθρο της Wikipedia για JPEG
Λίγα λόγια για το PrEP από την ανάρτηση του Pikabu
Άρθρο της Wikipedia για το PrEP

Πηγή: www.habr.com

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