É uma implementação destefractal image compression algoritmopublicado no IEEE durante os meus dias de faculdade
O aplicativo utiliza a biblioteca de triangulação incremental Delaunay, que também é usada naAplicação morphing
Algoritmo de alto nível:
- Compressão:
- A compressão fractal concentra-se no armazenamento de relações entre regiões de imagem, em vez dos valores reais de pixels, especificamente entre triângulos, neste caso.
- A imagem é dividida em uma grade triangular composta por múltiplos triângulos, formando um domínio triangulado.
- A imagem é subdividida em um novo conjunto de triangulações com triângulos maiores designados para o livro de códigos.
- As triangulações são dinâmicas, e o algoritmo de divisão e fusão é aplicado com base na variância dos pixels do triângulo.
- Uma vez determinada a triangulação do livro de códigos, os triângulos 2n mais representativos são selecionados para formar o livro de códigos. O valor de n afeta significativamente o tempo de compressão, tendo um efeito menor na taxa de compressão e na qualidade alcançada.
- Para cada triângulo de domínio, o mapeamento ideal com um triângulo do livro de códigos é procurado usando um critério mínimo de erro quadrado médio (MSE).
- O mapeamento ideal entre triângulos é encontrado fazendo combinações de:
- Permutações dos vértices (6 possibilidades)
- Determinar um deslocamento para a média
- Encontrar um fator de escala entre 0 e 1, que é aplicado ao desvio da média. Este fator de escala deve permanecer entre 0 e 1 para evitar divergências durante o processo de descompressão iterativa
Além disso, esses parâmetros devem ser quantizados usando um número limitado de bits para garantir que tanto o tempo de compressão quanto a relação sejam razoáveis e de acordo com a qualidade desejada.
- As informações armazenadas no arquivo compactado para cada canal:
- A informação para reproduzir as duas triangulações:
- Triângulos que se dividem em cada iteração
- vértices que foram removidos como resultado da fusão (após completar as iterações divididas)
- A seleção dos triângulos 2n do livro de códigos
- O mapeamento ideal de cada triângulo de domínio:
- Qual triângulo de livro de código ele usa para mapear (n bits)
- A permutação de vértice ideal (6 combinações, 3 bits)
- Offset (os autores indicam que o deslocamento é efetivamente representado com 6 bits)
- Escala (os autores indicam que a escala é efetivamente representada com 6 bits)
- Descompressão (para cada canal):
- Os triângulos das duas triangulações são obtidos.
- Os triângulos do livro de códigos são obtidos.
- Este processo é repetido até que a convergência seja alcançada:
- O mapeamento de todos os triângulos de domínio para suas correspondências ideais com os triângulos do livro de código
Depois de ganhar um mestrado em Inteligência Artificial, eu imagino inovar como derivar os triângulos mais significativos para o livro de código aplicando K-medoids.
Não tenho certeza se a inovação vai melhorar ou dificultar o algoritmo, mas isso me salva da necessidade de programá-lo eu mesmo, o que inicialmente parecia complicado.
O processamento de imagem é dividido em canais, tipicamente RGB.
Ele utiliza multiprocessamento, com um fio dedicado a cada canal.
Com a versão v1.1, um leitor compatível com o padrão ImageIO foi adicionado.
Portanto, você pode abrir uma imagem compactada (.dfc) com o aplicativo simplesmente fazendo:
BufferedImage image = ImageIO.read("image.dfc");