És una implementació d'aquest article algoritme de compressió fractal d'imatges publicat a l'IEEE a la meva època universitària
Es fa ús de la llibrería de triangulació incremental de Delaunay utilitzada a l'aplicació de Morphing
Algoritme a alt nivell:
- Compressió:
- La compressió fractal es caracteritza per què no es guarden valors de píxels, si no relacions entre regions de la imatge (entre triangles, en aquest cas).
- Es divideix la imatge en una triangulació, amb els triangles de domini.
- Es divideix la imatge en una altra triangulació, amb els triangles (més grans) per al codebook.
- Les triangulacions són dinàmiques, es fa ús de l'algoritme split and merge en funció de la variança dels pixels dels triangles.
- Un cop s'ha obtingut la triangulació per al codebook, d'escullen els 2^n triangles més representatius, que seràn el codebook, on el valor de n incidirà dràsticament en el temps de compressió, y una mica en al rati de compressió i en la qualitat obtinguda.
- Després, per a cada triangle del domini, es busca el mapeig òptim amb un triangle del codebook (amb un criteri de mínim error quadratic mig (MSE))
- El mapeig óptim de triangles es busca fent combinacions de:
- Permutacions dels vèrtex (6 posibilidades)
- Buscant un offset per a la mitjana
- Buscant un factor d'escala entre 0 i 1 per a aplicar-lo a la desviació de la mitja (entre 0 y 1, per a evitar la divergencia al procés iteratiu de descompressió)
Aquests paràmetres hauran de quantitzar-se amb pocs bits, per a que el temps i el rati de compressió siguin raonables, en compromís amb la qualitat obtinguda
- Informació guardada a l'arxiu comprimit per a cada un dels canals:
- Informació per a reproduir les dues triangulacions:
- Triangles que fan split a cada iteració
- Vèrtex extrets pel procediment de merge (al final de les iteracions de split)
- L'elecció dels 2^n triangles del codebook
- El mapeig óptim de cada triangle de domini:
- Amb quin triangle del codebook mapeja (n bits)
- La permutación de vèrtex óptima (6 combinaciones, 3 bits)
- Offset (els autors indiquen que 6 bits és un bon compromís)
- Escala (els autors indiquen que 6 bits és un bon compromís)
- Descompressió (per a cada canal):
- S'obtenen els triangles de les dues triangulacions.
- S'obtenen els triangles del codebook.
- S'itera fins a que hi hagi convergència:
- El mapeig de tots els triangles de domini, des de els seus mapejos optims amb els triangles del codebook
Després de fer el màster d'I.A., em veig en condicoins d'innovar en l'obtenció dels triángles més representatius per al codebook, aplicant ni més ni menys que un K-medoids.
La innovació no se si millora o si empitjora l'algoritme, però evita que tingui que programar-lo jo (que a simple vista semblava difícil de programar).
Es divideix el processament en els diferents canals de la imatge (normalmente RGB).
Es fa ús de multiprocès (un fil per a cada canal).
Amb la versió v1.1, s'afegeix un reader compatible amb l' ImageIO estàndar.
Així doncs, podràs obrir una imatge comprimida amb l'aplicació (.dfc) simplement fent:
BufferedImage image = ImageIO.read("image.dfc");