Compresión fractal de imágenes

La teoría de fractales es apasionante, y su aplicación a la compresión de imágenes, cuanto menos, interensante

Descripción

Con la aplicación podrás:

  • Comprimir imágenes con este método fractal
  • Descomprimir imágenes previamente comprimidas a otro formato de imagen

Hace uso de las librerías de plataforma, con las siguientes características:

  • Multi-idioma
  • Multi-resolución (zoom configurable)
  • Opción de modo oscuro
  • Notificación de nueva versión


Ventajas:

  • Si se programa bien, es independiente de la resolución de la imagen
  • Es un método de compresión muy exótico
  • Permite aprender en el camino


Desventajas:

  • El proceso de compresión es muy lentooo
  • No se consiguen ratios de compresión muy altos (por lo menos con los parámetros que he usado)

Descripción del código

Es una implementación de este algoritmo de compresión fractal de imágenes publicado en IEEE en mi época universitaria

Se hace uso de la librería de triangulación incremental de Delaunay usada en la aplicación de Morphing


Algoritmo a alto nivel:

  • Compresión:
    • La compresión fractal se caracteriza por que no se guardan valores de píxeles, sino relaciones entre regiones de la imagen (entre triángulos en este caso).
    • Se divide la imagen en una triangulación, con los triángulos de dominio.
    • Se divide la imagen en otra triangulación, con los triángulos (mayores) para el codebook.
    • Las triangulaciones son dinámicas, se usa el algoritmo split and merge en función de la varianza de los píxeles de los triángulos.
    • Una vez se tiene la triangulación para el codebook, se eligen los 2^n triángulos más representativos, que serán el codebook, donde el valor de n incidirá drásticamente en el tiempo de compresión, y un poco en el ratio de compresión y en la calidad obtenida.
    • Luego, para cada triángulo de dominio, se busca el mapeo óptimo con un triángulo del codebook (con un criterio de mínimo error cuadrático medio (MSE))
    • El mapeo óptimo entre triángulos se busca haciendo combinaciones de:
      • Permutaciones de los vértices (6 posibilidades)
      • Buscando un offset para la media
      • Buscando un factor de escala entre 0 y 1 para aplicarlo a la desviación de la media (entre 0 y 1, para evitar la divergencia del proceso iterativo de descompresión)
      Esos parámetros deberán cuantizarse con pocos bits, para que el tiempo y ratio de compresión sean razonables, en compromiso con la calidad obtenida.
  • Información almacenada en el archivo comprimido para cada uno de los canales:
    • La información para reproducir las dos triangulaciones:
      • Triángulos que hacen split en cada iteración
      • Vértices eliminados por el merge (al final de las iteraciones de split)
    • La elección de los 2^n triángulos del codebook
    • El mapeo óptimo de cada triángulo de dominio:
      • Con qué triángulo del codebook mapea (n bits)
      • La permutación de vértices óptima (6 combinaciones, 3 bits)
      • Offset (los autores indican que 6 bits es un buen compromiso)
      • Escala (los autores indican que 6 bits es un buen compromiso)
  • Descompresión (para cada canal):
    • Se obtienen los triángulos de las dos triangulaciones.
    • Se obtienen los triángulos del codebook.
    • Se itera hasta que converja:
      • El mapeo de todos los triángulos de dominio, desde sus mapeos óptimos con los triángulos del codebook


Tras cursar el máster de I.A., me veo en condiciones de innovar en la obtención de los triángulos más representativos para el codebook, aplicando nada más y nada menos que un K-medoids.

La innovación no sé si mejora o si empeora el algoritmo, pero evita que tenga que programarlo yo (que en principio parecía complicado de programar).


Se divide el procesamiento en los canales de la imagen (normalmente RGB).

Se hace uso de multiprocesamiento (un hilo para cada canal).

Pantallas

Compresión fractal de imágenes v1.0 (2022-2024)

Ver vídeo
Descargar

Versiones

image

La aplicación es la implementación de un algoritmo de compresión fractal de imágenes explicada en un artículo publicado en IEEE de mi época universitaria, basado en la triangulación de Delaunay y codificación por bloques

Mi primera versión de este algoritmo la programé conjuntamente con un compañero de Universidad en una práctica de la asignatura de último curso de Televisión de Teleco (plan 64 de Barcelona).

Internet todavía estaba en pañales y el desarrollo dependía casi únicamente de uno mismo y de los documentos físicos que pudieras conseguir.

Me acuerdo que programamos una triangulación de Delaunay que no estaba mal del todo, y que llegamos a programar el split and merge, el cálculo de los triángulos más representativos y también el cálculo de los mapeos óptimos durante la codificación, pero no llegamos a terminar la aplicación (después de haberle dedicado tres meses de desarrollo intensivo)

25 años después, llega una nueva implementación del algoritmo, esta vez completo, y en el tiempo récord de dos semanas

Está claro que algo se mejora en 25 años, y además, esta vez con el apoyo de funciones para el manejo de triángulos que ya había programado para la aplicación de efecto de Morphing

Usando esta vez una librería de triangulación de Delaunay programada por profesionales

Está claro que cuando no tienes que construirte los ladrillos, las paredes se levantan más rápido ...


Vídeo de demostración

Vídeos

Descargas