Fractal image compression

Fractal image compression ist eine spannende Anwendung der fraktalen Theorie, vor allem in der Bildkompression

Warenbezeichnung

Mit dieser Anwendung können Sie:

  • Komprimieren Sie Bilder mit dieser fraktalen Methode
  • Vormals komprimierte Bilder in ein anderes Format dekomprimieren

Nutzen Sie die Bibliotheken der Plattform, die folgende Funktionen beinhalten:

  • Mehrsprachig
  • Konfigurierbarer Mehrauflösungszoom
  • Option Dunkler Modus
  • Benachrichtigung über die neue Version


Vors.:

  • Bei richtiger Programmierung funktioniert es unabhängig von der Bildauflösung
  • Es ist eine unverwechselbare Kompressionsmethode
  • Ermöglicht es Ihnen zu lernen, während Sie gehen


Nachteile:

  • Der Kompressionsprozess ist extrem langsam
  • Sie erreichen keine sehr hohen Kompressionsverhältnisse (zumindest mit den Parametern, die ich benutzt habe)

Code-Beschreibung

Es ist eine Umsetzung dieserfractal image compression Algorithmusveröffentlicht in IEEE während meiner College-Tage

Die Anwendung nutzt die Delaunay inkrementelle Triangulation Bibliothek, die auch in derAntrag auf Morphing


High-Level-Algorithmus:

  • Kompression:
    • Die Fractal-Kompression konzentriert sich auf das Speichern von Beziehungen zwischen Bildregionen und nicht auf die tatsächlichen Pixelwerte, insbesondere zwischen Dreiecken in diesem Fall.
    • Das Bild ist in ein dreieckiges Gitter unterteilt, das aus mehreren Dreiecken besteht und eine dreieckige Domäne bildet.
    • Das Bild ist in einen neuen Satz von Triangulationen mit größeren Dreiecken für das Codebook unterteilt.
    • Die Triangulationen sind dynamisch, und der Split- und Merge-Algorithmus wird basierend auf der Varianz der Dreieckspixel angewendet.
    • Sobald die Triangulation für das Codebook ermittelt ist, werden die repräsentativsten 2^n Dreiecke ausgewählt, um das Codebook zu bilden. Der Wert von n beeinflusst die Kompressionszeit signifikant, während er einen geringen Einfluss auf das Kompressionsverhältnis und die erreichte Qualität hat.
    • Für jedes Domänendreieck wird das optimale Mapping mit einem Dreieck aus dem Codebook unter Verwendung eines minimalen mittleren Quadratfehlers (MSE)-Kriteriums gesucht.
    • Das optimale Mapping zwischen Dreiecken wird durch Kombinationen von:
      • Permutationen der Eckpunkte (6 Möglichkeiten)
      • Bestimmung eines Kompensationsbetrags für den Mittelwert
      • Die Suche nach einem Skalierungsfaktor zwischen 0 und 1, der auf die Abweichung vom Mittelwert angewendet wird. Dieser Skalierungsfaktor sollte zwischen 0 und 1 bleiben, um Divergenzen während des iterativen Dekompressionsvorgangs zu vermeiden.
      Darüber hinaus sollten diese Parameter mit einer begrenzten Anzahl von Bits quantifiziert werden, um sicherzustellen, dass sowohl die Kompressionszeit als auch das Verhältnis angemessen und in Übereinstimmung mit der gewünschten Qualität sind.
  • Die gespeicherten Informationen in der komprimierten Datei für jeden Kanal:
    • Die Informationen, um die beiden Triangulationen zu reproduzieren:
      • Dreiecke, die sich in jeder Iteration teilen
      • Vertices, die infolge der Zusammenführung entfernt wurden (nach Abschluss der Split-Iterationen)
    • Die Auswahl der 2^n Dreiecke des Codebooks
    • Das optimale Mapping jedes Domänendreiecks:
      • Welches Codebook-Dreieck es verwendet, um zu kartieren (n Bits)
      • Die optimale Vertex-Permutation (6 Kombinationen, 3 Bit)
      • Offset (die Autoren weisen darauf hin, dass der Offset effektiv mit 6 Bit dargestellt wird)
      • Skala (die Autoren weisen darauf hin, dass die Skala mit 6 Bit effektiv dargestellt wird)
  • Dekompression (für jeden Kanal):
    • Die Dreiecke der beiden Triangulationen werden erhalten.
    • Die Codebook Dreiecke werden erhalten.
    • Dieser Prozess wird bis zum Erreichen der Konvergenz wiederholt:
      • Das Mapping aller Domänendreiecke zu ihren optimalen Korrespondenzen mit den Codebook-Dreiecken


Nachdem ich einen Master-Abschluss in Künstlicher Intelligenz erworben habe, stelle ich mir vor, wie man durch die Anwendung von K-Medoiden die wichtigsten Dreiecke für das Codebook ableitet.

Ich bin mir nicht sicher, ob die Innovation den Algorithmus verbessern oder behindern wird, aber es erspart mir, dass ich ihn selbst programmieren muss, was anfangs kompliziert schien.


Die Bildverarbeitung ist in Kanäle unterteilt, typischerweise RGB.

Es nutzt Multiprocessing, mit einem Thread, der jedem Kanal gewidmet ist.


Mit der Version v1.1 wurde ein mit dem ImageIO-Standard kompatibler Reader hinzugefügt.

Daher können Sie ein komprimiertes Bild (.dfc) mit der Anwendung einfach öffnen, indem Sie:

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

Fenster

Fractal image compression v1.0 (2022-2024)

Uhr vídeo
Herunterladen

Fractal image compression v1.1 (2026)

Herunterladen

Fassungen

image

Die Anwendung implementiert einen fractal image compression Algorithmus, der in einem IEEE-Papier aus meinen Universitätstagen beschrieben wird. Es basiert auf Delaunay-Triangulation und Blockcodierung.

Ich arbeitete mit einem Studentenkollegen zusammen, um die erste Version dieses Algorithmus während eines Praktikums für den letzten Kurs des Teleco Television (Plan 64 von Barcelona) zu entwickeln.

Das Internet befand sich noch in seiner Anfangsphase, und jeder Fortschritt stützte sich fast ausschließlich auf individuelle Bemühungen und physische Dokumente.

Ich erinnere mich, dass wir eine ziemlich gute Delaunay-Triangulation entwickelt und erfolgreich den Split- und Merge-Ansatz umgesetzt haben. Dazu gehörten die Berechnung der repräsentativsten Dreiecke und das Finden der optimalen Mappings während des Codierungsprozesses. Trotz dreimonatiger intensiver Entwicklung haben wir die Anwendung jedoch nie abgeschlossen.

Jetzt, 25 Jahre später, stelle ich Ihnen diese neue Implementierung des Algorithmus vor, die in einer Rekordzeit von zwei Wochen vollständig entwickelt und abgeschlossen wurde.

Offensichtlich wird 25 Jahre später etwas verbessert werden. Zusätzlich dieses Mal mit zusätzlicher Funktionsunterstützung zum Umgang mit Dreiecken, die ich bereits für die Morphing-Effekt-Anwendung programmiert hatte.

Dieses Mal mit einer Delaunay Triangulation Bibliothek von Profis programmiert.

Es ist offensichtlich, dass, wenn Sie nicht die Steine selbst machen müssen, desto schneller können Sie die Wände bauen...


Demonstrationsvideo

image

Das neue Feature in der Version v1.1 ist der Zusatz eines fraktalkomprimierten Bildlesers innerhalb der Anwendung, der mit ImageIO kompatibel ist.

Daher können Sie ein komprimiertes Bild (.dfc) mit der Anwendung wie folgt lesen:


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


Vergleicht man das Bild im.jpg-Format und im.dfc-Format der Anwendung, sieht man, dass die Qualität etwas schlechter ist als in.jpg und dass es eine etwas größere Datei aufnimmt (wie erwartet).

Aber das Ergebnis ist überhaupt nicht schlecht.

Angesichts der langen Bearbeitungszeit, die für die Komprimierung benötigt wird, sind diese Art der Komprimierung und ihre Umsetzung in der Anwendung jedoch nur von akademischem Interesse.


04/05/2026 - 04/12/2026 . Nachdem ich die Entwicklung dieser Anwendung wiederhergestellt habe, schlage ich vor, Tests mit realen Bildern durchzuführen, und versuche es mit einem von "4000 x 3000" Pixeln.

Ich habe viele Probleme:

  • Der Prozess dauert für immer in den geteilten Iterationen (durch die umfangreichen Triangulationen von bis zu 400.000 Dreiecken, und dass die geteilte Bedingungsprüfung für alle Dreiecke in jeder Iteration wiederholt wurde)
  • Der Speicher läuft aus, nachdem ich die Grenze von 23 GB erreicht habe, die ich auf meinem System hatte.
    • Das Ergebnis der Split- und Merge-Iterationen wurde in einer booleschen Liste gespeichert (ca. 16 Iterationen x 2 Triangulationstypen x 3 Kanäle x 400.000 Elemente!!!!). Das macht insgesamt rund 40.000.000 Elemente, die noch akzeptabel sind)
    • Darüber hinaus wurde die Auswahl des Buches der repräsentativsten Dreiecke (auf 256 gesetzt) mit einem K-Medoiden durchgeführt (über 400.000 Elemente) (Ich denke, der Speicher, den dieser Algorithmus verwendet, ist O(n^2). Jetzt kommt es aus der Hand...)
    • Und, für mehr INRI, diese Berechnungen wurden parallel für die drei Kanäle durchgeführt (rgb)!!
  • Sobald diese Probleme gelöst sind, schaffe ich es, das (4000 x 3000) Bild zu komprimieren, aber ich sehe, dass es zwischen 6 und 8 Stunden dauert, um die Arbeit abzuschließen.

Und ich schlage vor, sie zu lösen:

  • Für die Verewigung von Splits. Lösung:
    • Ich erhöhe die minimale Größe der Dreiecke zu teilen, in einer schrittweisen Weise proportional zur Anzahl der Pixel im Bild. Das Ergebnis ist eine Verringerung der Anzahl der Dreiecke in den Dreiecken. Im verwendeten Bild von (4000 x 3000) wird die Anzahl der Dreiecke durch mehr als 4 geteilt (wir gingen von etwa 400.000 Dreiecken auf etwa 100.000 Dreiecke).
    • Außerdem erstelle ich ein Set mit den Dreiecken, die das Split-Kriterium nicht erfüllen (relativ zur Varianz der Werte ihrer Pixel), um sie nicht in jeder Iteration zu wiederholen.
  • Das System läuft aus dem Speicher. Lösung:
    • Ergebnis von Splits und Merges, die in booleschen Listen gespeichert sind. Lösung:
      • Während die geteilten Iterationen voranschreiten, ist die Anzahl der Dreiecke, die geteilt werden, radikal kleiner, der verwendete Speicher wird gespeichert, indem die Indizes der Dreiecke gespeichert werden, die sich in einem Satz teilen.
    • Speicher von K-Medoiden (vermutlich O(n^2)). Lösung:
      • Da wir die Anzahl der Dreiecke durch 4 geteilt haben..., den Speicher, der für diesen Algorithmus benötigt wird, beinhaltet diese Reduktion der Dreiecke die Teilung des Speichers, der durch einen Faktor von etwa 16 verwendet wird.
      • Drei K-Medoiden parallel (eine für jeden Kanal). Lösung:
        • Wir sequenzieren die Berechnungen der Triangulationen und die Auswahl der repräsentativsten Dreiecke für das Code-Buch (mit K-Medoiden).
      • Wir haben das Gedächtnis für K-Medoiden von 48 geteilt!!
  • Die Bearbeitungszeit mit "echten" Bildern dauert für immer (die Komprimierung des Beispielbildes dauert zwischen 6 und 8 Stunden) mit 3 Threads, einem für jeden Kanal. Lösung:
    • Stellen Sie die Anzahl der Threads konfigurierbar. (Durch die Konfiguration auf 23 Threads (mein System hat 24 Kerne) wird die Bearbeitungszeit auf dreieinhalb Stunden reduziert).
  • Auswirkungen der Lösung:
    • Der Effekt der Teilung der Anzahl der Dreiecke durch 4 führt offensichtlich zu einem bemerkenswerten Verlust der Qualität des komprimierten Bildes. Aber mit so viel Auflösung ist es nicht so wichtig.
    • Wenn die Anzahl der Dreiecke durch 4 geteilt wird, wird auch die Größe der komprimierten Datei geteilt, angeblich auch in der Reihenfolge 4.

Ich versuche auch, die Größe der komprimierten Datei zu minimieren, indem ich die zu speichernden Informationen neu organisiere.

Die Idee ist, vor allem in der Kodierung der Indexlisten der Dreiecke, die in jeder der Iterationen, deren ursprüngliche triviale Codierung war, verwenden ein Bit pro Dreieck, die Angabe, ob es sich aufgeteilt oder nicht.

Ich entwickle einen Algorithmus, um zu versuchen, die Größe zu minimieren, die benötigt wird, um jeden dieser Indexsätze zu speichern.

Ich denke, es ist nicht verschwendet... wenn Sie neugierig sind auf dieser Website erkläre ich die wichtigsten Punkte, auf die ich mich verlassen habe.

Obwohl es sich vielleicht mehr gelohnt hätte, nach einem allgemeinen verlustfreien Kompressor wie zip oder 7z zu suchen und ihn auf die Globalität der komprimierten Datei anzuwenden... Vielleicht für das nächste Mal.


In der letzten Version der Lieferung ist eine Befehlsschnittstellenanwendung enthalten, die ein Archiv, das mit weniger optimierten Versionen des Coders erstellt wurde, in die neueste Version des Coders übersetzt, die vermutlich weniger Platz benötigt.

Mit dieser kleinen neuen Anwendung auf einem Paar von Dateien mit der ursprünglichen Kodierung (eine von 143x143 und eine andere von 4000x3000), ist es, dass die Größe der komprimierten Datei um etwa 4% in ihnen reduziert wird.

Videos

Downloads