processamento digital de imagens prof. dr. edison oliveira de jesus instituto de ciências exatas...
TRANSCRIPT
PROCESSAMENTO DIGITAL DE IMAGENS
Prof. Dr. Edison Oliveira de Jesus
Instituto de Ciências ExatasDepartamento de Matemática e
Computação
Assuntos a serem abordados nesta aula
• Compressão de Imagens– Método de Huffman
Método de Huffman
• A idéia é usar caracteres (símbolos) com um núme-ro variável de bits
• Caracteres mais freqüentes na mensagem são codi-ficados com menos bits e caracteres menos fre-qüentes são codificados com mais bits ;
Codificação dos Símbolos
•Considere um alfabeto composto de quatro símbolos: A, B, C, D
•a cada um dos símbolos foi atribuído o código como indicado na tabela a seguir:
Símbolo CódigoA 00
B 01
C 10
D 11
Freqüência dos Símbolos
•A mensagem ABCADCA seria codificada com comprimento de 14 bits e ficaria: 00011000111000
•A Tabela a seguir mostra a freqüência de cada símbolo na mensagem
Símbolo FreqüênciaA 3
B 1
C 2
D 1
Algoritmo de Huffman
• O objetivo do algoritmo é criar um código que minimize o comprimento da mensagem
• Para criar este código leva-se em conta a fre-qüência de cada símbolo na mensagem
Nova Codificação dos Símbolos•Desta tabela, verifica-se que se for atribuído ao símbolo A um código binário mais curto que os atribuídos aos símbolos B e D tem-se uma mensagem menor.
•Isto provém do fato que o símbolo A aparece mais vezes do que os símbolos B e D.
•Seja então, os seguintes códigos atribuídos aos símbolos, conforme mostra a tabela seguinte:
Símbolo CódigoA 0
B 110
C 10
D 111
Resultado da Codificação
• Usando este novo código para os símbolos, a mensagem, ABCADCA ficaria com 13 bits, e da seguinte forma: 0110100111100
• Em mensagens longas com mais símbolos menos freqüentes, o ganho pode ser maior;
• Um dos requerimentos deste código é que nenhum código seja prefixo de outro, pois a decodificação é feita da esquerda para direita;
Decodificação
• O processo para a decodificação da mensagem deve ser iniciado da esquerda para a direita;
• caso o primeiro bit seja 0, o código corresponde ao símbolo A.
• caso contrário deve-se continuar a examinar os bits restantes.
• se o segundo bit for 0 o símbolo é um C, caso contrário examina-se o terceiro bit, um 0 indica um B e D no outro caso.
Árvore de Huffman
• A árvore é iniciada com os dois símbolos que aparecem com menor freqüência no conjunto de dados; no exemplo: B e D;
• Atribuí-se o código 0 para B e o código 1 para D.;
• Combine estes dois símbolos em um único, formando a cadeia BD;
• Este novo símbolo terá freqüência igual a soma das freqüências dos símbolos que a formam, ou seja, B e D; no caso 2;
• Tem-se agora os seguintes símbolos A (3), C (2) e BD (2);
• os números entre parênteses indicam as freqüências dos dados no conjunto;
• Novamente deve-se escolher os símbolos de menor freqüência no novo conjunto de símbolos; no caso são C e BD;
• Atribuí-se o código 0 ao símbolo C e 1 ao BD;
• Isto significa adicionar 1 aos códigos de B e D, que passam a valer 10 e 11 respectivamente;
• Os dois símbolos são combinados originando o sím-bolo CBD, de freqüência 4;
• Tem-se agora dois símbolos A (3) e CBD (4);
• Atribuí-se 0 ao símbolo A e 1 ao símbolo CBD;
• O símbolo ACBD é o único símbolo restante e recebe o código NULL de comprimento 0. ;
• A figura a seguir mostra a árvore binária que pode ser construída a partir deste exemplo;
• Cada nó representa um símbolo e sua freqüência.
Árvore de Huffman Obtida
Outro Exemplo de Codificação de Huffman
A tabela ao lado mostra um conjunto de dados e suas respectivas freqüên-cias de ocorrências no total.
125Freq
9380767271
61554140
EChar
TAOIN
RHLD
3127
CX
65S
FreqChar
R S N I
E
H
C X
31 27
5571 7361 65
125
40
T
D L
41
93
A O
80 76
Exemplo de Codificação de Huffman
R S N I
E
H
C X
58
D L
A O T
31 27
5571 7361 65
125
40 41
9380 76
R S N I
E
H
C X
58
D L
81
A O T
31 27
5571 7361 65
125
40 41
9380 76
R S N I
E
H
C X
58
113
D L
81
A O T
31 27
5571 7361 65
125
40 41
9380 76
R S N I
E
H
C X
58
113126
D L
81
A O T
31 27
5571 7361 65
125
40 41
9380 76
R S N I
E
H
C X
58
113144126
D L
81
A O T
31 27
5571 7361 65
125
40 41
9380 76
R S N I
E
H
C X
58
113144126
D L
81
156
A O T
31 27
5571 7361 65
125
40 41
9380 76
R S N I
E
H
C X
58
113144126
D L
81
156 174
A O T
31 27
5571 7361 65
125
40 41
9380 76
R S N I
E
H
C X
58
113144126
238
T
D L
81
156 174
A O
31 27
5571 7361 65
125
40 41
9380 76
R S N I
E
H
C X
58
113144126
238270
T
D L
81
156 174
A O
31 27
5571 7361 65
125
40 41
9380 76
R S N I
E
H
C X
58
113144126
238270
330
T
D L
81
156 174
A O
31 27
5571 7361 65
125
40 41
9380 76
R S N I
E
H
C X
58
113144126
238270
330 508
T
D L
81
156 174
A O
31 27
5571 7361 65
125
40 41
9380 76
R S N I
E
H
C X
58
113144126
238270
330 508
838
T
D L
81
156 174
A O
31 27
5571 7361 65
125
40 41
9380 76
Codificação Final de Huffman
Exemplo de Codificação de Huffman
125Freq
9380767371
61554140
EChar
TAOIN
RHLD
3127
CX
65S
0000Fixo
00010010001101000101
011110001001101010111100
0110
110Huff
011000001
10111010
1000111101010100
1110011101
1001
838Total 4.00 3.62
A tabela ao lado mostra o resultado final da aplicação do método de Huffman para codificação.
Na penúltima coluna são mostrados os 4 bits que codificam os caracteres mostrados na primeira coluna.
Na última coluna, a codificação correspon-dente ao código de Huffman.
No total tem-se um alfabeto de 838 símbo-los;
Quando representados por 4 bits, o tama-nho médio da representação é 4 bits;
Na codificação por Huffman, tem-se um total de 3036 bits, os quais dão uma média de 3.62 bits ( 3036 / 838 ) para representar um símbolo, o que dá uma redução de 10 %
Implementação
Uma árvore binária pode ser utilizada para representar os dados na implementação do algoritmo de Huffman
Nó da árvore
• Cada nó desta árvore, contém:– o símbolo do conjunto;– a freqüência de ocorrência deste símbolo;– um ponteiro para o filho esquerdo do nó;– um ponteiro para o filho direito do nó;
Esquerdo Direito Valor
Freqüência
Algoritmo de Huffman
• PASSO 1:
• Os valores a serem codificados devem ser inicial-mente armazenados numa lista ligada simples.
• Cada nó desta lista deverá conter as seguintes in-formações:– Símbolo – Freqüência do símbolo;– Endereço do próximo nó da lista;– Endereço da árvore de Huffman, correspondente àquele
nó;
Estrutura do nó da lista dos símbolos iniciais
Endereço da raiz da árvore de Huffman deste nó
Próximo nóValor
Freqüência
Algoritmo de Huffman
• Passo 2:
• Busca-se os 2 símbolos com as menores fre-qüências;– os nós destes símbolos são deletados da lista;– em seu lugar, apenas um novo nó é inserido:
• este nó não armazena símbolo;• no lugar da freqüência, é colocado a soma das fre-
qüências dos símbolos que ele está substituindo;• a árvore de Huffman é montada para os nós deletados
e seu endereço é colocado no nó substituto da lista principal.
Exemplo de Codificação de Huffman
R S N I E HC X
31 27 5571 7361 65 12540
TD L
41 93
A O
80 76
Seja a lista inicial formada pelos nós, dos símbolos mostrados no exemplo anterior:
Exemplo de Codificação de Huffman
R S N I E H
C X31 27
5571 7361 65 12540
TD L
41 93
A O
80 76
Busca dos 2 nós com os menores valores de freqüência::
58
58
Exemplo de Codificação de Huffman
R S N I E H
C X31 27
5571 7361 65 125
40
T
D L 41
93
A O
80 76
Busca dos 2 nós com os menores valores de freqüência::
58
58
81
81
Exemplo de Codificação de Huffman
R S N I E
H
C X31 27
55
71 7361 65 125
40
T
D L 41
93
A O
80 76
Busca dos 2 nós com os menores valores de freqüência::
58
113
81
81
113
Exemplo de Codificação de Huffman
R S
N I E
H
C X31 27
55
71 73
61 65
125
40
T
D L 41
93
A O
80 76
Busca dos 2 nós com os menores valores de freqüência::
58
113
81
81
113
126
126
Exemplo de Codificação de Huffman
R S N I
E
H
C X31 27
5571 7361 65
125
40
T
D L
41
93
A O
80 76
Busca dos 2 nós com os menores valores de freqüência::
58
113
81
81
113126
126
144
126
Exemplo de Codificação de Huffman
R S N I
E
H
C X31 27
5571 7361 65
125
40
T
D L
41
93
A O80 76
Busca dos 2 nós com os menores valores de freqüência::
58
113
81
81
113126
126
144
144
156
156
Exemplo de Codificação de Huffman
R S N I
E
H
C X31 27
5571 7361 65
125
40
T
D L41
93A O80 76
Busca dos 2 nós com os menores valores de freqüência::
58
238
81
113126
126
144
144
156
156
174
174
238
Exemplo de Codificação de Huffman
R S N I
E
H
C X31 27
55
71 7361 65
125
40
T
D L41
93A O80 76
Busca dos 2 nós com os menores valores de freqüência::
58
238
81
113
126 144
270
156
156
174
174
238
270
Exemplo de Codificação de Huffman
R S N I
E
H
C X31 27
55
71 7361 65
125
40
T
D L41
93
A O80 76
Busca dos 2 nós com os menores valores de freqüência::
58
238
81
113
126 144
270
156 174
330
238
270330
Exemplo de Codificação de Huffman
R S N I
E
H
C X31 27
55
71 7361 65
125
40
T
D L41
93
A O80 76
58
508
81
113
126 144
156 174
330
238
270330
508
Árvore final da
Codificação de Huffman
R S N I
E
H
C X
58
113144126
238270
330 508
838
T
D L
81
156 174
A O
31 27
5571 7361 65
125
40 41
9380 76
Endereço da lista inicial
Codificação dos símbolos
• O último passo é a busca das folhas da árvore;
• Como a árvore é binária, a partir de sua raiz, cada nó tem um filho esquerdo, codificado como 0, e um filho direito codificado como 1;
• Os símbolos originais estão como folhas desta árvo-re;
• A codificação de um símbolo corresponde aos digi-tos binários obtidos desde a raiz da árvore até a fo-lha onde o símbolo se encontra;
Árvore final da
Codificação de Huffman
R S N I
E
H
C X
58
113144126
238270
330 508
838
T
D L
81
156 174
A O
31 27
5571 7361 65
125
40 41
9380 76
Endereço da lista inicial
0
0
00
00
0
0
0
0
0
0
1
1
1
1
1
1 1
1
1 1
1
1
Códigos dos Símbolos
125Freq
9380767371
61554140
EChar
TAOIN
RHLD
3127
CX
65S
110Huff
01100000110111010
1000111101010100
1110011101
1001
Árvore de Huffman• Cada árvore criada com a junção de dois ou mais
nós da lista original com o objetivo de criar a árvore de Huffman é do tipo HEAP
• Nesta árvore, a cada nova informação adicionada a ela, deve fazê-lo de tal forma que os nós vão sendo completados em seqüência, ou seja, primeiro o filho esquerdo, depois o filho direito.
• Após uma informação ter sido adicionada à árvore, deve-se ajustar sua posição na mesma de tal forma que todos os filhos de um nó sejam menores que o seu pai;
Exemplo de árvore Heap
31 27 5571 7361 65 12540 41 9380 76
Seja um conjunto de valores, com os quais deseja-se montar a respectiva árvore Heap:
Valores iniciais: 80 76 40 41 93 61 65 71 73 125 31 27 55
Exemplo de árvore Heap80
Valores iniciais: 80 76 40 41 93 61 65 71 73 125 31 27 55
O primeiro valor é inserido na árvore;Como está vazia, este valor entra como a raiz da árvore
Exemplo de árvore Heap80
76
Valores iniciais: 80 76 40 41 93 61 65 71 73 125 31 27 55
todos nós estão ajustados
Exemplo de árvore Heap80
7640
Valores iniciais: 80 76 40 41 93 61 65 71 73 125 31 27 55
todos nós estão ajustados
Exemplo de árvore Heap80
7640
41
Valores iniciais: 80 76 40 41 93 61 65 71 73 125 31 27 55
todos nós estão ajustados
Exemplo de árvore Heap80
7640
41 93
Valores iniciais: 80 76 40 41 93 61 65 71 73 125 31 27 55
Ajustar nó 93 com nó 76
Exemplo de árvore Heap80
9340
41 76
Valores iniciais: 80 76 40 41 93 61 65 71 73 125 31 27 55
Ajustar nó 93 com nó 80
Exemplo de árvore Heap93
8040
41 76
Valores iniciais: 80 76 40 41 93 61 65 71 73 125 31 27 55
todos nós estão ajustados
Exemplo de árvore Heap93
8040
41 76 61
Valores iniciais: 80 76 40 41 93 61 65 71 73 125 31 27 55
Ajustar nó 61 com nó 40
Exemplo de árvore Heap93
8061
41 76 40
Valores iniciais: 80 76 40 41 93 61 65 71 73 125 31 27 55
todos nós estão ajustados
Exemplo de árvore Heap93
8061
41 76 6540
Valores iniciais: 80 76 40 41 93 61 65 71 73 125 31 27 55
Ajustar nó 65 com nó 61
Exemplo de árvore Heap93
8065
41 76 6140
Valores iniciais: 80 76 40 41 93 61 65 71 73 125 31 27 55
todos nós estão ajustados
Exemplo de árvore Heap93
8065
41 76 6140
71
Valores iniciais: 80 76 40 41 93 61 65 71 73 125 31 27 55
Ajustar nó 71 com nó 41
Exemplo de árvore Heap93
8065
71 76 6140
41
Valores iniciais: 80 76 40 41 93 61 65 71 73 125 31 27 55
todos nós estão ajustados
Exemplo de árvore Heap93
8065
71 76 6140
7341
Valores iniciais: 80 76 40 41 93 61 65 71 73 125 31 27 55
Ajustar nó 73 com nó 71
Exemplo de árvore Heap93
8065
73 76 6140
7141
Valores iniciais: 80 76 40 41 93 61 65 71 73 125 31 27 55
todos nós estão ajustados
Exemplo de árvore Heap93
8065
73 76 6140
1257141
Valores iniciais: 80 76 40 41 93 61 65 71 73 125 31 27 55
Ajustar nó 125 com nó 76
Exemplo de árvore Heap93
8065
73 125 6140
767141
Valores iniciais: 80 76 40 41 93 61 65 71 73 125 31 27 55
Ajustar nó 125 com nó 80
Exemplo de árvore Heap93
12565
73 80 6140
767141
Valores iniciais: 80 76 40 41 93 61 65 71 73 125 31 27 55
Ajustar nó 125 com nó 93
Exemplo de árvore Heap125
9365
73 80 6140
767141
Valores iniciais: 80 76 40 41 93 61 65 71 73 125 31 27 55
todos nós estão ajustados
Exemplo de árvore Heap125
9365
73 80 6140
76 317141
Valores iniciais: 80 76 40 41 93 61 65 71 73 125 31 27 55
todos nós estão ajustados
Exemplo de árvore Heap125
9365
73 80 6140
76 31 277141
Valores iniciais: 80 76 40 41 93 61 65 71 73 125 31 27 55
todos nós estão ajustados
Exemplo de árvore Heap125
9365
73 80 6140
76 31 27 557141
Valores iniciais: 80 76 40 41 93 61 65 71 73 125 31 27 55
Ajustar nó 55 com nó 40
Exemplo de árvore Heap125
9365
73 80 6155
76 31 27 407141
Valores iniciais: 80 76 40 41 93 61 65 71 73 125 31 27 55
Detalhes da Implementação
• São necessárias as seguintes rotinas para a implementação da lista original:
– rotina cria_nó – rotina insere_nó– rotina deleta_nó– rotina percorre_lista– rotina busca_menor_valor_lista
Detalhes da Implementação
• São necessárias as seguintes rotinas para a implementação da árvore Heap:
– rotina cria_nó – rotina insere_filho_esquerdo– rotina insere_filho_direito– rotina monta_heap– rotina ajusta_nó– rotina busca_folhas