Este projeto é uma implementação de um compressor e descompressor de imagens que utiliza o algoritmo de Huffman para compactar imagens nos formatos BMP ou PNG, aplicando compressão nos três canais de cor (R, G, B), sendo capaz também de descompactar a imagem a partir de um arquivo de texto comprimido, restaurando-a para o formato original. O projeto agora inclui cálculo de entropia e análise de desempenho, proporcionando uma compreensão mais aprofundada do processo de compressão.
- Introdução
- Funcionamento
- Estrutura do Projeto
- Requisitos
- Uso
- Exemplos de Compressão e Descompressão
- Limitações
- Licença
Este projeto tem como objetivo explorar a aplicação do algoritmo de Huffman para compressão e descompressão de imagens, uma técnica eficaz que reduz o espaço de armazenamento ao representar os valores RGB de cada pixel com códigos binários de tamanhos variáveis. Ao utilizar codificação de comprimento variável, a ferramenta reduz o tamanho do arquivo sem perda de qualidade. O projeto também inclui análise de entropia para avaliar o limite teórico de compressão, métricas de desempenho para medir a eficiência e ferramentas de visualização para ilustrar o processo de compressão em detalhes.
O projeto consiste em quatro fases principais:
- Compressão: A imagem é analisada e, para cada canal de cor (R, G e B), calcula-se a frequência de cada valor (0-255). Essas frequências são usadas para criar três árvores de Huffman independentes. O arquivo de saída inclui as dimensões da imagem, as frequências de cada canal e os dados comprimidos em uma sequência de bits.
- Descompressão: O programa lê o arquivo compactado, reconstrói as árvores de Huffman com base nas frequências e decodifica os dados binários para restaurar a imagem original.
- Cálculo de Entropia:
- Entropia total e média da imagem
- Entropia de cada canal separadamente
- Comparações práticas entre a imagem original e pós procedimento de descompressão
- Análise de Desempenho: Testes com múltiplas imagens de diferentes resoluções e tipos de conteúdo, avaliando:
- Taxa de compressão
- Tempo de compressão e descompressão
- Entropia e sua relação com a eficiência da compressão
- HuffmanNode: Classe para os nós da árvore de Huffman, contendo valor e frequência.
- Compressor: Classe responsável pela compressão da imagem. Extrai as frequências RGB, constrói as árvores de Huffman e gera o arquivo compactado.
- Decompressor: Classe responsável pela descompressão. Lê o arquivo comprimido, reconstrói as árvores e recupera os dados da imagem.
- EntropyCalculator: Calcula a entropia média, total e a entropia por canal.
- Java 8 ou superior
Execute o método compressImage
da classe Compressor
passando a imagem que deseja compactar. O programa gerará um arquivo de texto com as dimensões, frequências e dados comprimidos da imagem.
Execute o método decompressImage
da classe Decompressor
, passando o arquivo comprimido gerado anteriormente. A imagem restaurada será salva no local especificado.
O que é 'Entropia'?
A entropia é uma medida estatística que indica a quantidade média de "incerteza" ou "surpresa" de um conjunto de dados, e é útil para avaliar a eficiência de um algoritmo de compressão. Em compressão de imagens, a entropia nos dá uma ideia do limite teórico de compressão: quanto menor a entropia, mais facilmente os dados podem ser comprimidos.
- Entropia Total: Calcula a entropia considerando o RGB como um símbolo combinado para cada pixel. Isso captura a "interdependência" entre os canais, ou seja, como as cores estão relacionadas entre si. Este valor tende a ser mais preciso para imagens coloridas.
- Entropia por Canal: Calcula a entropia separadamente para Vermelho, Verde e Azul, fornecendo uma métrica comparativa em relação à entropia total. Esse método fornece uma estimativa, mas subestima a entropia real, já que cada canal é tratado como um conjunto isolado. Uma aproximação mais rápida, mas que subestima a complexidade dos dados
Para obter uma medida precisa da entropia e do limite teórico de compressão da imagem como um todo, é necessário calcular a entropia considerando cada (R, G, B) como uma unidade única. Isso reflete melhor a quantidade real de informação na imagem e dá uma estimativa mais fiel do potencial de compressão.
- Uma entropia baixa indica que a distribuição dos valores é menos complexa e há maior potencial de compressão.
- Uma entropia alta indica uma distribuição mais uniforme dos valores, com menos potencial para compressão.
- Taxa de Compressão: Razão entre o tamanho do arquivo comprimido e o tamanho do arquivo original.
- Tempo de Execução: Mede o tempo das fases de compressão e descompressão.
- Avaliação de qualidade: Garante que não há perda de qualidade visual após a descompressão.
- O programa lida apenas com imagens BMP e PNG.
- A eficiência da compressão depende da redundância de cores na imagem.
- Imagens com muita variação de cor podem não ser significativamente comprimidas.
Este projeto é licenciado sob a MIT License.