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");