Fractal image compression

Fractal image compression est une application passionnante de la théorie fractale, en particulier dans la compression d'image

Désignation

Avec cette application, vous pouvez :

  • Compresser des images avec cette méthode fractale
  • Décompresser des images précédemment compressées dans un format différent

Utilisez les bibliothèques de la plate-forme, qui incluent les fonctionnalités suivantes:

  • Multi-langue
  • Zoom multi-résolution configurable
  • Mode sombre
  • Notification de nouvelle version


Points positifs:

  • Lorsqu'il est correctement programmé, il fonctionne indépendamment de la résolution de l'image
  • C'est une méthode de compression distinctive
  • Vous permet d'apprendre au fur et à mesure


Inconvénients :

  • Le processus de compression est extrêmement lent
  • Vous n'atteignez pas des taux de compression très élevés (au moins avec les paramètres que j'ai utilisés)

Description du code

C'est une implémentation de cefractal image compression Algorithmepublié dans IEEE pendant mes études collégiales

L'application utilise la bibliothèque de triangulation incrémentielle Delaunay, qui est également utilisée dans leApplication de morphing


Algorithme de haut niveau :

  • Compression :
    • La compression fractale se concentre sur le stockage des relations entre les régions de l'image plutôt que les valeurs réelles des pixels, en particulier entre les triangles dans ce cas.
    • L'image est divisée en une grille triangulaire composée de plusieurs triangles, formant un domaine triangulé.
    • L'image est subdivisée en un nouvel ensemble de triangulations comportant des triangles plus grands désignés pour le livre de codes.
    • Les triangulations sont dynamiques et l'algorithme de division et de fusion est appliqué en fonction de la variance des pixels du triangle.
    • Une fois la triangulation du codebook déterminée, on sélectionne les triangles 2n les plus représentatifs pour former le codebook, la valeur de n ayant un impact significatif sur le temps de compression tout en ayant un effet mineur sur le taux de compression et la qualité atteinte.
    • Pour chaque triangle de domaine, la correspondance optimale avec un triangle du livre de codes est recherchée à l'aide d'un critère d'erreur quadratique moyenne minimale (MSE).
    • La correspondance optimale entre les triangles se trouve en faisant des combinaisons de :
      • Permutations des sommets (6 possibilités)
      • Détermination d'un décalage pour la moyenne
      • Trouver un facteur d'échelle entre 0 et 1, qui est appliqué à l'écart par rapport à la moyenne. Ce facteur d'échelle doit rester entre 0 et 1 pour éviter la divergence pendant le processus de décompression itératif
      En outre, ces paramètres doivent être quantifiés en utilisant un nombre limité de bits pour s'assurer que le temps de compression et le rapport sont raisonnables et conformes à la qualité souhaitée.
  • Les informations stockées dans le fichier compressé pour chaque canal :
    • Les informations pour reproduire les deux triangulations :
      • Triangles qui se divisent à chaque itération
      • Vertices qui ont été supprimés à la suite de la fusion (après avoir terminé les itérations fractionnées)
    • La sélection des triangles 2n du livre de codes
    • La cartographie optimale de chaque triangle de domaine :
      • Quel triangle de livre de code il utilise pour cartographier (n bits)
      • La permutation optimale des sommets (6 combinaisons, 3 bits)
      • Offset (les auteurs indiquent que le décalage est effectivement représenté avec 6 bits)
      • Échelle (les auteurs indiquent que l'échelle est effectivement représentée avec 6 bits)
  • Décompression (pour chaque canal) :
    • On obtient les triangles des deux triangulations.
    • Les triangles du livre de codes sont obtenus.
    • Ce processus est répété jusqu'à ce que la convergence soit atteinte:
      • Le mappage de tous les triangles de domaine à leurs correspondances optimales avec les triangles du livre de codes


Après avoir obtenu une maîtrise en intelligence artificielle, j'envisage d'innover pour obtenir les triangles les plus significatifs du livre de codes en appliquant K-medoids.

Je ne sais pas si l'innovation améliorera ou entravera l'algorithme, mais cela m'évite de devoir le programmer moi-même, ce qui semblait initialement compliqué.


Le traitement de l'image est divisé en canaux, généralement RGB.

Il utilise le multitraitement, avec un thread dédié à chaque canal.


Avec la version v1.1, un lecteur compatible avec la norme ImageIO a été ajouté.

Par conséquent, vous pouvez ouvrir une image compressée (.dfc) avec l'application simplement en faisant:

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

Windows

Fractal image compression v1.0 (2022-2024)

Regarder vdeo
Télécharger

Fractal image compression v1.1 (2026)

Télécharger

Versions

image

L'application met en oeuvre un algorithme fractal image compression décrit dans un article de l'IEEE de mon temps universitaire. Il est basé sur la triangulation de Delaunay et le codage par blocs.

J'ai collaboré avec un camarade de classe universitaire pour développer la version initiale de cet algorithme lors d'un stage pour le dernier cours de Teleco Television (plan 64 de Barcelone).

Internet en était encore à ses débuts, et tout progrès reposait presque entièrement sur des efforts individuels et des documents physiques.

Je me souviens que nous avons développé une assez bonne triangulation Delaunay et mis en œuvre avec succès l’approche split and merge. Cela impliquait de calculer les triangles les plus représentatifs et de trouver les cartographies optimales pendant le processus de codage. Cependant, malgré trois mois de développement intensif, nous n’avons jamais terminé l'application.

Maintenant, 25 ans plus tard, je vous présente cette nouvelle implémentation de l’algorithme, entièrement développée et complétée en un temps record de deux semaines.

Évidemment, quelque chose sera amélioré 25 ans plus tard. De plus, cette fois-ci, avec un support de fonction supplémentaire pour gérer les triangles, que j'avais déjà programmés pour l'application d'effet Morphing.

Cette fois en utilisant une bibliothèque de triangulation Delaunay programmée par des professionnels.

Il est évident que lorsque vous n'avez pas à faire les briques vous-même, plus vite vous pouvez construire les murs...


Vidéo de démonstration

image

La nouvelle fonctionnalité de la version 1.1 est l'ajout d'un lecteur d'image compressé par fractale au sein de l'application qui est compatible avec ImageIO.

Par conséquent, vous pouvez lire une image compressée (.dfc) avec l'application comme suit:


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


En comparant l'image au format.jpg et au format.dfc de l'application, vous pouvez voir que la qualité est un peu pire que dans.jpg et qu'il prend un fichier légèrement plus grand (comme prévu).

Mais le résultat n'est pas mauvais du tout.

Cependant, compte tenu du temps de traitement long nécessaire à la compression, ce type de compression et sa mise en oeuvre dans l'application n'ont qu'un intérêt académique.


04/05/2026 – 04/12/2026 . Après avoir récupéré l'évolution de cette application, je propose de faire des tests avec des images réelles, et je l'essaie avec un des pixels "4000 x 3000".

Je rencontre de nombreux problèmes :

  • Le processus prend une éternité dans les itérations fractionnées (en raison des triangulations étendues de jusqu'à 400 000 triangles, et que la vérification de condition fractionnée a été répétée pour tous les triangles de chaque itération)
  • La mémoire s'épuise après avoir atteint la limite de 23 Go que j'avais sur mon système. Parce que:
    • Le résultat des itérations fractionnées et fusionnées a été stocké dans une liste booléenne (environ 16 itérations x 2 types de triangulation x 3 canaux x 400 000 éléments!!!). Cela fait un total d'environ 40 000 000 éléments, ce qui est toujours acceptable)
    • De plus, la sélection du livre des triangles les plus représentatifs (fixé à 256) a été effectuée avec un K-médoïde (plus de 400 000 éléments) (je pense que la mémoire utilisée par cet algorithme est O(n2).
    • Et, pour plus d'INRI, ces calculs ont été effectués en parallèle pour les trois canaux (rgb)!!
  • Une fois ces problèmes résolus, je parviens à compresser l'image (4000 x 3000), mais je vois qu'il faut entre 6 et 8 heures pour terminer le travail.

Et je propose de les résoudre :

  • Pour l'éternité des splits. Solution :
    • J'augmente la taille minimale des triangles à diviser, d'une manière proportionnelle au nombre de pixels dans l'image. Il en résulte une réduction du nombre de triangles dans les triangulations. Dans l'image utilisée de (4000 x 3000) le nombre de triangles est divisé par plus de 4 (nous sommes passés d'environ 400 000 triangles à environ 100 000 triangles).
    • En outre, je crée un ensemble avec les triangles qui ne répondent pas au critère de division (par rapport à la variance des valeurs de leurs pixels), afin de ne pas les répéter à chaque itération. Maintenant, volez!!
  • Le système est à court de mémoire. Solution :
    • Résultat des scissions et fusions enregistrées dans les listes booléennes. Solution :
      • Au fur et à mesure que les itérations fractionnées progressent, le nombre de triangles qui se divisent est radicalement plus petit, la mémoire utilisée est sauvegardée en stockant les indices des triangles qui se divisent dans un ensemble.
    • Mémoire des K-médoïdes (probablement O(n2)). Solution:
      • Comme nous avons divisé le nombre de triangles par 4..., la mémoire nécessaire pour cet algorithme, cette réduction des triangles implique de diviser la mémoire utilisée par un facteur d'environ 16.
      • Trois K-médoïdes en parallèle (un pour chaque canal). Solution :
        • Nous séquençons les calculs des triangulations et la sélection des triangles les plus représentatifs pour le code-livre (avec K-medoids).
      • Nous avons divisé la mémoire nécessaire pour les K-Medoids de 48!!
  • Le temps de traitement avec des images "réelles" prend une éternité (la compression de l'exemple d'image prend entre 6 et 8 heures) avec 3 threads, un pour chaque canal.
    • Rendre le nombre de threads configurable (en le configurant à 23 threads (mon système a 24 cœurs), le temps de traitement est réduit à trois heures et demie).
  • Effets de la solution :
    • L'effet de diviser le nombre de triangles par 4 entraîne évidemment une perte notable de la qualité de l'image compressée. Mais avec tant de résolution, ce n'est pas si important.
    • En divisant le nombre de triangles par 4, il provoque également la taille du fichier compressé à diviser, soi-disant aussi de l'ordre de 4.

Je vise également à essayer de minimiser la taille du fichier compressé, en réorganisant les informations à stocker.

L'idée est d'indiquer avant tout dans le codage des listes d'index des triangles qui se sont scindés dans chacune des itérations, dont le codage trivial original était d'utiliser un bit par triangle, indiquant s'il s'est scindé ou non.

Je conçois un algorithme pour essayer de minimiser la taille nécessaire pour stocker chacun de ces ensembles d'index.

Je pense que ce n'est pas gaspillé... si vous êtes curieux Sur ce site, je dis les points clés sur lesquels je me suis appuyé.

Bien qu'il aurait peut-être été plus intéressant de chercher un compresseur sans perte général comme zip ou 7z et de l'appliquer à la globalité du fichier compressé... Peut-être pour la prochaine fois.


Dans la dernière version de la livraison, une application d'interface de commande est incluse, qui traduit une archive créée avec des versions moins optimisées du codeur, vers la dernière version du codeur, qui prend probablement moins de place.

En utilisant cette petite nouvelle application sur une paire de fichiers avec l'encodage d'origine (un de 143x143 et un autre de 4000x3000), c'est que la taille du fichier compressé est réduite d'environ 4% en eux.

Vidéos

Téléchargements