Si tratta di un'implementazione di questofractal image compression Algoritmopubblicato in IEEE durante i miei giorni di college
L'applicazione utilizza la libreria di triangolazione incrementale Delaunay, che viene utilizzata anche nelDomanda di Morphing
Algoritmo di alto livello:
- Compressione:
- La compressione frattale si concentra sull'archiviazione delle relazioni tra le regioni dell'immagine piuttosto che sui valori reali dei pixel, in particolare tra i triangoli in questo caso.
- L'immagine è divisa in una griglia triangolare composta da triangoli multipli, formando un dominio triangolare.
- L'immagine è suddivisa in un nuovo insieme di triangolazioni con triangoli più grandi designati per il libro di codice.
- Le triangolazioni sono dinamiche e l'algoritmo di divisione e fusione viene applicato in base alla varianza dei pixel del triangolo.
- Una volta determinata la triangolazione per il codebook, vengono selezionati i triangoli 2n più rappresentativi per formare il codebook. Il valore di n influisce in modo significativo sul tempo di compressione pur avendo un effetto minore sul rapporto di compressione e sulla qualità raggiunta.
- Per ogni triangolo di dominio, la mappatura ottimale con un triangolo dal codebook viene ricercata utilizzando un criterio minimo di errore quadrato medio (MSE).
- La mappatura ottimale tra i triangoli si trova creando combinazioni di:
- Permutazioni dei vertici (6 possibilità)
- Determinazione di un offset per la media
- Trovare un fattore di scala tra 0 e 1, che viene applicato alla deviazione dalla media. Questo fattore di scala dovrebbe rimanere tra 0 e 1 per prevenire la divergenza durante il processo di decompressione iterativa
Inoltre, questi parametri dovrebbero essere quantificati utilizzando un numero limitato di bit per garantire che sia il tempo di compressione che il rapporto siano ragionevoli e in linea con la qualità desiderata.
- Le informazioni memorizzate nel file compresso per ogni canale:
- Le informazioni per riprodurre le due triangolazioni:
- Triangoli che si dividono in ogni iterazione
- Vertici che sono stati rimossi a seguito della fusione (dopo aver completato le iterazioni di divisione)
- La selezione dei triangoli 2n del codebook
- La mappatura ottimale di ogni triangolo di dominio:
- Quale triangolo di codebook utilizza per mappare (n bit)
- La permutazione ottimale del vertice (6 combinazioni, 3 bit)
- Offset (gli autori indicano che l'offset è effettivamente rappresentato con 6 bit)
- Scala (gli autori indicano che la scala è effettivamente rappresentata con 6 bit)
- Decompressione (per ogni canale):
- I triangoli delle due triangolazioni sono ottenuti.
- I triangoli del codebook sono ottenuti.
- Questo processo viene ripetuto fino al raggiungimento della convergenza:
- La mappatura di tutti i triangoli di dominio per le loro corrispondenze ottimali con i triangoli di codebook
Dopo aver conseguito un Master in Intelligenza Artificiale, prevedo di innovare come ricavare i triangoli più significativi per il codebook applicando i K-medoidi.
Non sono sicuro se l’innovazione migliorerà o impedirà l’algoritmo, ma mi impedisce di dover programmarlo da solo, il che inizialmente sembrava complicato.
L'elaborazione delle immagini è divisa in canali, tipicamente RGB.
Utilizza il multiprocessing, con un filo dedicato a ciascun canale.
Con la versione v1.1 è stato aggiunto un lettore compatibile con lo standard ImageIO.
Pertanto, è possibile aprire un'immagine compressa (.dfc) con l'applicazione semplicemente facendo:
BufferedImage image = ImageIO.read("image.dfc");