Fractal image compression

Fractal image compression είναι μια συναρπαστική εφαρμογή της θεωρίας φράκταλ, ιδιαίτερα στη συμπίεση εικόνας

Περιγραφή

Με αυτή την εφαρμογή, μπορείτε να:

  • Συμπίεση εικόνων με αυτή τη μέθοδο fractal
  • Αποσυμπίεση προηγουμένως συμπιεσμένων εικόνων σε διαφορετική μορφή

Κάντε χρήση των βιβλιοθηκών της πλατφόρμας, οι οποίες περιλαμβάνουν τα ακόλουθα χαρακτηριστικά:

  • Πολυγλωσσικό
  • Διαμορφώσιμο ζουμ πολλαπλής ανάλυσης
  • Σκοτεινή επιλογή λειτουργίας
  • Ειδοποίηση νέας έκδοσης


Υπέρ:

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


Κατά:

  • Η διαδικασία συμπίεσης είναι εξαιρετικά αργή
  • Δεν πετυχαίνεις πολύ υψηλές αναλογίες συμπίεσης (τουλάχιστον με τις παραμέτρους που χρησιμοποίησα)

Περιγραφή κώδικα

Είναι μια υλοποίηση αυτού.fractal image compression αλγόριθμοςδημοσιεύτηκε στο IEEE κατά τις ημέρες του κολεγίου μου

Η εφαρμογή χρησιμοποιεί τη βιβλιοθήκη βαθμιαίου τριγωνισμού Delaunay, η οποία χρησιμοποιείται επίσης στοΕφαρμογή μορφοποίησης


Αλγόριθμος υψηλού επιπέδου:

  • Συμπίεση:
    • Η συμπίεση fractal εστιάζει στην αποθήκευση των σχέσεων μεταξύ των περιοχών εικόνας και όχι των πραγματικών τιμών εικονοστοιχείων, συγκεκριμένα μεταξύ των τριγώνων σε αυτή την περίπτωση.
    • Η εικόνα χωρίζεται σε ένα τριγωνικό πλέγμα που αποτελείται από πολλαπλά τρίγωνα, σχηματίζοντας έναν τριγωνικό τομέα.
    • Η εικόνα υποδιαιρείται σε ένα νέο σύνολο τριγωνισμών με μεγαλύτερα τρίγωνα που έχουν οριστεί για το codebook.
    • Οι τριγωνισμοί είναι δυναμικοί, και ο αλγόριθμος διάσπασης και συγχώνευσης εφαρμόζεται με βάση τη διακύμανση των εικονοστοιχείων του τριγώνου.
    • Μόλις καθοριστεί ο τριγωνισμός για το codebook, επιλέγονται τα πιο αντιπροσωπευτικά τρίγωνα 2n για να σχηματίσουν το codebook. Η τιμή του n επηρεάζει σημαντικά το χρόνο συμπίεσης ενώ έχει μικρή επίδραση στην αναλογία συμπίεσης και στην ποιότητα που επιτυγχάνεται.
    • Για κάθε τρίγωνο τομέα, η βέλτιστη αντιστοίχιση με ένα τρίγωνο από το codebook επιδιώκεται χρησιμοποιώντας ένα κριτήριο ελάχιστου μέσου τετραγωνικού σφάλματος (MSE)
    • Η βέλτιστη χαρτογράφηση μεταξύ των τριγώνων βρίσκεται κάνοντας συνδυασμούς των:
      • Μεταθέσεις των κορυφών (6 πιθανότητες)
      • Προσδιορισμός αντιστάθμισμα για τη μέση τιμή
      • Η εύρεση ενός συντελεστή κλίμακας μεταξύ 0 και 1, ο οποίος εφαρμόζεται στην απόκλιση από τη μέση τιμή. Αυτός ο συντελεστής κλίμακας πρέπει να παραμείνει μεταξύ 0 και 1 για να αποφευχθεί η απόκλιση κατά τη διάρκεια της επαναληπτικής διαδικασίας αποσυμπίεσης.
      Επιπλέον, αυτές οι παράμετροι θα πρέπει να ποσοτικοποιούνται χρησιμοποιώντας περιορισμένο αριθμό bit για να διασφαλιστεί ότι τόσο ο χρόνος συμπίεσης όσο και ο λόγος είναι λογικός και σύμφωνος με την επιθυμητή ποιότητα.
  • Οι αποθηκευμένες πληροφορίες στο συμπιεσμένο αρχείο για κάθε κανάλι:
    • Οι πληροφορίες για την αναπαραγωγή των δύο τριγωνισμών:
      • Τρίγωνα που χωρίζονται σε κάθε επανάληψη
      • Στίχοι που αφαιρέθηκαν ως αποτέλεσμα της συγχώνευσης (μετά την ολοκλήρωση των διασπασμένων επαναλήψεων)
    • Η επιλογή των 2n τριγώνων του κωδικοδείκτη
    • Η βέλτιστη χαρτογράφηση κάθε τριγώνου τομέα:
      • Ποιο τρίγωνο codebook χρησιμοποιεί για να χαρτογραφήσει (n bits)
      • Η βέλτιστη μετάθεση κορυφών (6 συνδυασμοί, 3 bit)
      • όφσετ (οι συγγραφείς δείχνουν ότι το όφσετ αντιπροσωπεύεται αποτελεσματικά με 6 bit)
      • Κλίμακα (οι συγγραφείς δείχνουν ότι η κλίμακα αντιπροσωπεύεται αποτελεσματικά με 6 bit)
  • Αποσυμπίεση (για κάθε κανάλι):
    • Τα τρίγωνα των δύο τριγωνισμών λαμβάνονται.
    • Τα τρίγωνα του κωδικοδείκτη λαμβάνονται.
    • Η διαδικασία αυτή επαναλαμβάνεται μέχρι να επιτευχθεί σύγκλιση:
      • Η χαρτογράφηση όλων των τριγώνων τομέα στις βέλτιστες αλληλογραφίες τους με τα τρίγωνα κωδικοδείκτη


Αφού κέρδισα ένα μεταπτυχιακό δίπλωμα στην Τεχνητή Νοημοσύνη, οραματίζομαι να καινοτομήσω στο πώς να αντλήσω τα πιο σημαντικά τρίγωνα για το codebook εφαρμόζοντας K-medoids.

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


Η επεξεργασία εικόνας χωρίζεται σε κανάλια, τυπικά RGB.

Χρησιμοποιεί πολυεπεξεργασία, με ένα νήμα αφιερωμένο σε κάθε κανάλι.


Με την έκδοση v1.1, έχει προστεθεί ένας αναγνώστης συμβατός με το πρότυπο ImageIO.

Επομένως, μπορείτε να ανοίξετε μια συμπιεσμένη εικόνα (.dfc) με την εφαρμογή απλά κάνοντας:

BufferedImage image = ImageIO.read("image.dfc");

Παράθυρα

Fractal image compression v1.0 (2022-2024)

Watch vdeo (στα Αγγλικά)
Λήψη

Fractal image compression v1.1 (2026)

Λήψη

Εκδόσεις

image

Η εφαρμογή υλοποιεί έναν αλγόριθμο fractal image compression που περιγράφεται σε ένα έγγραφο IEEE από τις ημέρες του πανεπιστημίου μου. Βασίζεται στον τριγωνισμό Delaunay και την κωδικοποίηση μπλοκ.

Συνεργάστηκα με συμμαθητή του πανεπιστημίου για να αναπτύξω την αρχική έκδοση αυτού του αλγορίθμου κατά τη διάρκεια πρακτικής άσκησης για την τελευταία σειρά μαθημάτων της Teleco Television (σχέδιο 64 της Βαρκελώνης).

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

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

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

Προφανώς, κάτι θα βελτιωθεί 25 χρόνια αργότερα. Επιπλέον, αυτή τη φορά με πρόσθετη υποστήριξη λειτουργίας για να χειριστώ τρίγωνα, τα οποία είχα ήδη προγραμματίσει για την εφαρμογή Morphing effect.

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

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


Βίντεο επίδειξης

image

Το νέο χαρακτηριστικό στην έκδοση v1.1 είναι η προσθήκη ενός fractal-συμπιεσμένου αναγνώστη εικόνας μέσα στην εφαρμογή που είναι συμβατό με το ImageIO.

Επομένως, μπορείτε να διαβάσετε μια συμπιεσμένη εικόνα (.dfc) με την εφαρμογή ως εξής:


BufferedImage image = ImageIO.read("image.dfc");


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

Αλλά το αποτέλεσμα δεν είναι καθόλου κακό.

Ωστόσο, δεδομένου του μεγάλου χρόνου επεξεργασίας που απαιτείται για τη συμπίεση, αυτός ο τύπος συμπίεσης και η εφαρμογή του στην εφαρμογή είναι μόνο ακαδημαϊκού ενδιαφέροντος.


04/05/2026 - 04/12/2026 (στα Αγγλικά) . Αφού ανακτήσω την εξέλιξη αυτής της εφαρμογής, προτείνω να κάνω δοκιμές με πραγματικές εικόνες, και το δοκιμάζω με ένα από τα εικονοστοιχεία "4000 x 3000".

Αντιμετωπίζω πολλά προβλήματα:

  • Η διαδικασία διαρκεί για πάντα στις διαιρούμενες επαναλήψεις (λόγω των εκτεταμένων τριγωνισμών έως και 400.000 τριγώνων, και ότι ο έλεγχος διαιρούμενης κατάστασης επαναλήφθηκε για όλα τα τρίγωνα σε κάθε επανάληψη)
  • Η μνήμη τελειώνει αφού φτάσω το όριο των 23 GB που είχα στο σύστημά μου.
    • Το αποτέλεσμα των επαναλήψεων διάσπασης και συγχώνευσης αποθηκεύτηκαν σε μια λίστα boolean (περίπου 16 επαναλήψεις x 2 τύποι τριγωνισμού x 3 κανάλια x 400.000 στοιχεία!!!). Αυτό κάνει ένα σύνολο περίπου 40.000.000 στοιχείων, το οποίο εξακολουθεί να είναι αποδεκτό)
    • Επιπλέον, η επιλογή του βιβλίου των πιο αντιπροσωπευτικών τριγώνων (που έχει οριστεί σε 256) πραγματοποιήθηκε με ένα K-medoids (πάνω από 400.000 στοιχεία) (Νομίζω ότι η μνήμη που χρησιμοποιείται από αυτόν τον αλγόριθμο είναι O(n2). Τώρα βγαίνει εκτός ελέγχου...)
    • Και, για περισσότερα INRI, οι υπολογισμοί αυτοί έγιναν παράλληλα και για τα τρία κανάλια (rgb)!!
  • Μόλις λυθούν αυτά τα προβλήματα, καταφέρνω να συμπιέσω την (4000 x 3000) εικόνα, αλλά βλέπω ότι χρειάζονται 6 με 8 ώρες για να ολοκληρωθεί το έργο.

Και προτείνω να τα λύσω:

  • Για την αιωνιοποίηση των διασπάσεων. Λύση:
    • Αυξάνω το ελάχιστο μέγεθος των τριγώνων σε διάσπαση, με τρόπο βήμα ανάλογο με τον αριθμό των εικονοστοιχείων στην εικόνα. Καταλήγοντας σε μείωση του αριθμού των τριγώνων στους τριγωνισμούς. Στη χρησιμοποιούμενη εικόνα (4000 x 3000) ο αριθμός των τριγώνων διαιρείται με περισσότερα από 4 (πήγαμε από περίπου 400.000 τρίγωνα σε περίπου 100.000 τρίγωνα).
    • Επιπλέον, δημιουργώ ένα Σύνολο με τα τρίγωνα που δεν πληρούν το κριτήριο της διάσπασης (σε σχέση με τη διακύμανση των τιμών των εικονοστοιχείων τους), ώστε να μην τα επαναλαμβάνω σε κάθε επανάληψη. Τώρα πετάω!!
  • Το σύστημα ξεμένει από μνήμη.
    • Αποτέλεσμα διασπάσεων και συγχωνεύσεων που έχουν αποθηκευτεί σε λίστες boolean. Λύση:
      • Καθώς οι διασπασμένες επαναλήψεις προχωρούν, ο αριθμός των τριγώνων που χωρίζονται είναι ριζικά μικρότερος, η μνήμη που χρησιμοποιείται αποθηκεύεται αποθηκεύοντας τους δείκτες των τριγώνων που χωρίζονται σε ένα Σύνολο.
    • Μνήμη των K-medoids (πιθανόν O(n2)). Λύση:
      • Καθώς έχουμε διαιρέσει τον αριθμό των τριγώνων με το 4..., τη μνήμη που απαιτείται για αυτόν τον αλγόριθμο, αυτή η μείωση των τριγώνων περιλαμβάνει τη διαίρεση της μνήμης που χρησιμοποιείται από έναν παράγοντα γύρω στο 16.
      • Τρία K-medoids παράλληλα (ένα για κάθε κανάλι). Λύση:
        • Ακολουθούμε τους υπολογισμούς των τριγωνισμών και την επιλογή των πιο αντιπροσωπευτικών τριγώνων για το βιβλίο κώδικα (με K-medoids).
      • Έχουμε μοιράσει τη μνήμη που απαιτείται για τα K-medoids του 48!!
  • Ο χρόνος επεξεργασίας με "πραγματικές" εικόνες διαρκεί για πάντα (η συμπίεση της εικόνας παραδείγματος διαρκεί μεταξύ 6 και 8 ωρών) με 3 νήματα, ένα για κάθε κανάλι. Λύση:
    • Κάντε τον αριθμό των νημάτων διαμορφώσιμο. (Διαμορφώνοντάς το σε 23 νήματα (το σύστημά μου έχει 24 πυρήνες), ο χρόνος επεξεργασίας μειώνεται σε τρεισήμισι ώρες).
  • Επιπτώσεις της λύσης:
    • Η επίδραση της διαίρεσης του αριθμού των τριγώνων με το 4 προφανώς έχει ως αποτέλεσμα μια αξιοσημείωτη απώλεια της ποιότητας της συμπιεσμένης εικόνας.
    • Κατά τη διαίρεση του αριθμού των τριγώνων με το 4, προκαλεί επίσης τη διαίρεση του μεγέθους του συμπιεσμένου αρχείου, υποτίθεται επίσης της τάξης του 4.

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

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

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

Νομίζω ότι δεν είναι σπατάλη... αν είστε περίεργοι σε αυτή την ιστοσελίδα λέω τα βασικά σημεία στα οποία έχω βασιστεί.

Αν και ίσως θα άξιζε τον κόπο να ψάξουμε για ένα γενικό συμπιεστή χωρίς απώλειες όπως το zip ή το 7z και να το εφαρμόσουμε στην παγκοσμιότητα του συμπιεσμένου αρχείου... ίσως για την επόμενη φορά.


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

Χρησιμοποιώντας αυτή τη μικρή νέα εφαρμογή σε ένα ζεύγος αρχείων με την αρχική κωδικοποίηση (ένα από 143x143 και ένα άλλο από 4000x3000), είναι ότι το μέγεθος του συμπιεσμένου αρχείου μειώνεται κατά περίπου 4% σε αυτά.

Βίντεο

Λήψεις