PROCESSAMENTO DIGITAL DE IMAGENS Prof. Dr. Edison Oliveira de Jesus Instituto de Ciências Exatas...

Post on 07-Apr-2016

214 views 1 download

Transcript of PROCESSAMENTO DIGITAL DE IMAGENS Prof. Dr. Edison Oliveira de Jesus Instituto de Ciências Exatas...

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