Algoritmos de Compressão sem Perdas (continuação) Aula 08 Diogo Pinheiro Fernandes Pedrosa Universidade Federal Rural do Semiárido Departamento de Ciências Exatas e Naturais Curso de Ciência da Computação 13 de outubro de 2009
Na aula anterior... Compressão redução do volume de bits necessários para representar uma informação; Compressão sem perdas (lossless compression); Compressão com perdas (loss compression) Razão de compressão: razão = B 0 B 1 onde B 0 é número de bits antes da compressão e B 1 é o número de bits após a compressão.
Conceitos da Teoria da Informação Entropia: η = n i=1 p i log 2 1 p i onde p i é a probabilidade de ocorrência de um símbolo s i (de um alfabeto S) na informação. Entropia desordem! Indica a quantidade média de bits para representar uma informação; Quanto maior a entropia, menor será a compressão. Com base na entropia, há uma família de métodos de codificação que é conhecida como Codificação de Comprimento Variável.
Algoritmos de Compressão sem Perdas Algoritmo de Shannon Fano; Algoritmo de Huffman; Ambos os algoritmos montam seus códigos através da criação de uma árvore binária; O código é mínimo; Se um símbolo si tem grande frequência de ocorrência na informação, então o comprimento do seu código será menor. Caso contrário, será maior; O número médio de bits será o menor inteiro maior que a entropia η; η l O algoritmo de Huffman tem, usualmente, melhores resultados que o algoritmo de Shannon Fano;
Algoritmo de Shannon Fano Exemplo Considere uma informação que contem o alfabeto S = {A, B, C, D, E} com as seguintes ocorrências: A = 15 B = 7 C = 6 D = 6 E = 5
Algoritmo de Shannon Fano Exemplo As probabilidades são: p A = 15 39 p D = 6 39 p B = 7 39 p E = 5 39 p C = 6 39 Calculando a entropia tem-se: η = 2, 19 3 bits
Algoritmo de Shannon Fano Exemplo
Algoritmo de Shannon Fano Exemplo Símbolo Ocorrência Código Tamanho do Código N o de bits A 15 00 2 30 B 7 01 2 14 C 6 10 2 12 D 6 110 3 18 E 5 111 3 15 Total de bits 89 Média de bits por símbolo 2,28
Algoritmo de Huffman Exemplo
Algoritmo de Huffman Exemplo Símbolo Ocorrência Código Tamanho do Código N o de bits A 15 1 1 15 B 7 000 3 21 C 6 001 3 18 D 6 010 3 18 E 5 011 3 15 Total de bits 87 Média de bits por símbolo 2,23
Codificação Adaptativa de Huffman O algoritmo de Huffman requer o conhecimento das frequências relativas dos símbolos utilizados na informação; Problema real esse tipo de informação não é frequentemente disponibilizada; Exemplo: streaming de áudio ou vídeo; Solução utilizar um algoritmo adaptativo, onde as informações estatísticas são obtidas e uma atualização dinâmica do código ocorre enquanto a informação está sendo recebida;
Codificação Adaptativa de Huffman Procedimento para o codificador: 1: Obter código inicial; 2: Enquanto não chegar fim de arquivo fazer 3: Obter símbolo s; 4: Codificar símbolo s; 5: Atualizar árvore binária; 6: Fim Enquanto
Codificação Adaptativa de Huffman Procedimento para o decodificador: 1: Obter código inicial; 2: Enquanto não chegar fim de arquivo fazer 3: Decodificar o código c; 4: Exibir o símbolo associado ao código c; 5: Atualizar árvore binária; 6: Fim Enquanto
Codificação Adaptativa de Huffman Observações Código inicial: Utiliza um código sem estar baseado na frequência de ocorrência dos símbolos; Exemplo: o código ASCII pode ser usado como código inicial para fluxo de caracteres. Atualização da árvore binária: Basicamente consiste no incremento da frequência de ocorrência para os símbolos, seguido da atualização da árvore. Ambos o codificador e o decodificador tem que usar os mesmos código inicial e algoritmo de atualização da árvore.
Codificação Baseada em Dicionário Tipo de codificação que utiliza códigos de comprimento fixo, contudo eles não representam apenas os símbolos de um alfabeto mas também strings formador desses símbolos; O algoritmo mais comum é o LZW (Lempel Ziv Welch) variações dessa técnica é usada em imagens GIF, por exemplo; A codificação/decodificação inicia-se a partir de uma tabela simples que relaciona símbolos com códigos (dicionário). Essa tabela é enriquecida com a leitura dos símbolos em avanço.
Algoritmo LZW Compressão 1: s próximo caractere de entrada; 2: Enquanto não chegar no fim do arquivo fazer 3: c próximo caractere de entrada; 4: Se a string s + c existe no dicionário então 5: s s + c; 6: Senão 7: Apresentar código para s; 8: Adicionar s + c ao dicionário com um novo código; 9: s c; 10: Fim Se 11: Fim Enquanto 12: Apresentar código para s;
Exemplo Exemplo: compressão de ABABBABCABABBA. Dicionário inicial: código string --------------- 1 A 2 B 3 C
Exemplo s c saída código string ------------------------------------------- 1 A 2 B 3 C ------------------------------------------- A B 1 4 AB B A 2 5 BA A B * * * AB B 4 6 ABB B A * * * BA B 5 7 BAB B C 2 8 BC C A 3 9 CA A B * * * AB A 4 10 ABA A B * * * AB B * * * ABB A 6 11 ABBA A EOF 1 * * Código de saída: 1 2 4 5 2 3 4 6 1 Relação de Compressão = 14 9 = 1, 56
OBSERVAÇÕES Como, para este algoritmo apresentado, não há critério de otimização, a tabela de strings cresce rapidamente; Implementações LZW típicas para informações textuais usam código com comprimento de 12 bits os primeiros 256 códigos do dicionário correspondem ao código ASCII. Relação de Compressão = 14 8 bits = 1, 04 9 12 bits
Algoritmo de Descompressão 1: s NULL; 2: Enquanto não chegar fim do arquivo fazer 3: k próximo código da entrada; 4: entry símbolo associado ao código k; 5: Exibir entry; 6: Se s NULL então 7: Adicione a string s + entry[0] no dicionário com um novo código; 8: Fim Se 9: s entry 10: Fim Enquanto
Exemplo O algoritmo de descompressão constrói o dicionário a partir de uma tabela simplificada; EXEMPLO: realizar a descompressão do código 124523461. s k entry código string ------------------------------------------- 1 A 2 B 3 C ------------------------------------------- NULL 1 A * * A 2 B 4 AB B 4 AB 5 BA AB 5 BA 6 ABB BA 2 B 7 BAB B 3 C 8 BC C 4 AB 9 CA AB 6 ABB 10 ABA ABB 1 A 11 ABBA A EOF * * * Informação: ABABBABCABABBA
PROBLEMA Durante a construção do dicionário pelo compressor, pode ocorrer a criação de uma string para um código que, na construção da tabela pelo descompressor, este código/string ainda não aparece definido ou seja, um código lido do arquivo ainda não tem correspondência na tabela do descompressor; Tratamento da exceção:. entry símbolo associado ao código k; Se entry == NULL então entry s + s[0]; Fim Se Exibir entry;.
Compressão de Imagens sem Perdas Codificação Diferencial A codificação diferencial é utilizada em sinais de áudio porque eles são sinais unidimensionais; Uma abordagem similar pode ser aplicada às imagens (sinais bidimensionais). Operador diferencial: (x, y) (x 1, y)
Compressão de Imagens sem Perdas Codificação Diferencial Operador diferencial: d(x, y) = I (x, y) I (x 1, y) d(x, y) = 4I (x, y) I (x, y 1) I (x, y+1) I (x 1, y) I (x+1, y) Com uma imagem de diferenças, a codificação de Huffman poderia ser facilmente aplicada e uma compressão eficiente seria obtida redução do histograma da imagem aumento na quantidade de símbolos com maior frequência relativa.