Você está na página 1de 46

UNIVERSIDADE DO OESTE PAULISTA

FACULDADE DE INFORMÁTICA DE PRESIDENTE PRUDENTE


BACHARELADO EM CIÊNCIA DA COMPUTAÇÃO

COMPRESSÃO DE IMAGENS UTILIZANDO A


TRANSFORMADA DISCRETA DO COSSENO

FRANCISCO ASSIS DA SILVA

Trabalho Monográfico apresentado no


curso de graduação, Bacharelado em
Ciência da Computação, como requisito
parcial para a sua conclusão.

Orientadores:
Prof. Ricardo Luis Barbosa
Unoeste – FIPP

Prof. Almir Olivette Artero


Unoeste – FIPP

Presidente Prudente – SP
1998
FRANCISCO ASSIS DA SILVA

Trabalho monográfico apresentado no curso de graduação, Bacharelado em


Ciência da Computação, como requisito parcial para sua conclusão e aprovado
pelos seguintes orientadores:

_________________________________
Prof. Ricardo Luis Barbosa
UNOESTE – FIPP / Orientador

_________________________________
Prof. Almir Olivette Artero
UNOESTE – FIPP / Co-Orientador

ii
Dedicatória

Dedico este trabalho em primeiro lugar


ao Senhor Deus, que meu deu graças
para realizá-lo. Aos meus pais pelo
apoio, carinho, tolerância e compreensão.

iii
Agradecimento

Agradeço a todos os professores da


Faculdade de Informática, que fizeram
parte da minha vida ao logo do curso e
que contribuíram para a minha formação
acadêmica e profissional, em especial aos
professores Ricardo Luis Barbosa e
Almir Olivette Artero, pelos
ensinamentos, orientação, amizade e por
toda a dedicação nos momentos em que
foi necessário. Aos amigos conquistados
durante os anos de faculdade, aos quais
pude ajudar e recebi ajuda nos momentos
difíceis.

iv
“São fúteis e cheias de erros as ciências
que não nasceram da experimentação,
mãe de todo conhecimento.”
Leonardo da Vinci

v
RESUMO

Atualmente, com a crescente demanda por imagens digitais nas mais diversas
áreas, tais como: entretenimento, medicina etc., são necessários dispositivos com grande
capacidade de armazenamento e meios rápidos de transmissão. Estes equipamentos e
materiais ainda apresentam altos custos; uma solução para este problema, são as técnicas
de compressão de imagens, para que se possa reduzir o espaço de armazenamento e o
tempo de transmissão.
A compressão de imagens usando a especificação JPEG (Joint Photographic
Experts Group) apresenta altas taxas de compressão. Este padrão tem como base a
Transformada Discreta do Cosseno, que aplicada a blocos 8x8, descorrelaciona os dados
e muitos coeficientes são desprezados (quantização), por serem desnecessários, o que
garante a alta taxa de compressão.

vi
ABSTRACT

Nowadays, with the growing demand for digital images in the most several
areas, such as: entertainment, medicine etc., it’s necessary devices with great storage
capacity and fast means of transmission. These equipments and materials still present
high costs; a solution for this problem, are the techniques of image compression, to
reduce the storage space and the time of transmission.
The compression of images using the specification JPEG (Joint Photographic
Experts Group) presents high compression rates. This pattern has is based on the
Discrete Cosine Transform, that applied to blocks 8x8, makes a uncorrelation of the data
and many coefficients are despised (quantization), for being unnecessary, what
guarantees the high compression rate.

vii
ÍNDICE

Lista de Abreviaturas e Siglas .................................................................. ix


Lista de Figuras e Tabelas ......................................................................... x
INTRODUÇÃO........................................................................................ 1
Capítulo 1 – TRANSFORMADA DISCRETA DO COSSENO (TDC) ..... 4
1.1 – Quantização ............................................................................... 14
Capítulo 2 – CODIFICAÇÃO ................................................................. 18
2.1 – Run-Length Coding .................................................................... 18
2.2 - Codificação por Huffman ............................................................ 20
Capítulo 3 – O PADRÃO JPEG.............................................................. 24
3.1 – Tabelas Padrão para a Codificação de Huffman.......................... 27
3.2 – A Seqüência Zig-Zag.................................................................. 31
CONCLUSÃO........................................................................................ 33
REFERÊNCIAS BIBLIOGRÁFICAS..................................................... 34

viii
LISTA DE ABREVIATURAS E SIGLAS

CCITT – Consultive Committee International of Telegraph e Telephones


DCPM – Differential Pulse Code Modulation
FFT – Fast Fourier Transform
GIF – Graphics Interchange Format
IEC – International Electrotechnical Commission
ISO – International Standard Organization
ITDC – Transformada Inversa do Cosseno
JPEG – Joint Photographic Experts Group
LZW – Lempel Ziv Welch
PCX – PC Paintbrush File Format
RLC – Run-Length Coding
TDC – Transformada Discreta do Cosseno
TIF – Target Interchange File
TKL – Transformada de Karhunen-Loève
VGA – Video Graphics Array

ix
LISTA DE FIGURAS E TABELAS

Figuras

Figura 01 – Bloco de entrada [apud NELSON] ......................................


7
Figura 02 – Bloco de saída [apud NELSON] ......................................... 7
Figura 03 – Uma representação da imagem f(x) como sinal contínuo... 8
Figura 04 – Representação das básicas no caso contínuo ...................... 9
Figura 05 – Representação das básicas multiplicadas pelos coeficientes
α e C ....................................................................................
9
Figura 06 – Soma acumulativa das básicas ............................................ 10
Figura 07 – Representação das básicas – caso discreto b0 .................... 12
Figura 08 – Representação das básicas – caso discreto b1 .................... 12
Figura 09 – Representação das básicas – caso discreto b2 .................... 12
Figura 10 – Representação das básicas – caso discreto b3 .................... 13
Figura 11 – Representação das básicas da TDC no plano
[apud GONZALEZ] ............................................................ 13
Figura 12 – (a) Resultado de compressão com fator de qualidade 2, .... 15

(b) Resultado de compressão com fator de qualidade 10, .. 15


(c) Resultado de compressão com fator de qualidade 25.... 16
Figura 13 – TDC antes da quantização [apud NELSON] ...................... 17
Figura 14 – TDC após a dequantização [apud NELSON] ..................... 17
Figura 15 – A operação Run-Length Coding ......................................... 20
Figura 16 – Imagem com 640 x 480 pixels ............................................ 21
Figura 17 – Histograma da imagem original com o número de pixels

x
de cada nível de cinza [apud BAXES] ................................ 22
Figura 18 – Árvore de Huffman [apud BAXES] ................................... 22
Figura 19 – Processo de compressão JPEG ........................................... 25
Figura 20 – Processo de descompressão JPEG ...................................... 26
Figura 21 – Bloco após quantização [apud GONZALEZ] .................... 31
Figura 22 – Zig-zag num bloco de 8 x 8 [apud NELSON] .................... 32

Tabelas

Tabela 01 – Resultados de compressão com diferentes tamanhos


de blocos .............................................................................
5
Tabela 02 – Resultados de compressão variando os fatores de
qualidade aplicados a um imagem de 384 x 288 pixels
com 1 byte por pixel, tamanho de 100.592 bytes ............... 14
Tabela 03 – Codificação de Huffman [apud BAXES] ........................... 23
Tabela 04 – JPEG Categorias para Codificação dos Coeficientes ......... 27
Tabela 05 – JPEG Código DC Padrão ....................................................
28
Tabela 06 – JPEG Código AC Padrão ....................................................
30

xi
INTRODUÇÃO

O Processamento Digital de Imagens é utilizado com muita freqüência nos dias


atuais em diversas áreas tais como imageamento médico para diagnóstico, astronomia,
sensoriamento remoto, entretenimento etc. Imagens digitais ocupam grande espaço para
a sua representação e armazenamento, além disso o uso crescente da internet fez com
que houvesse um aumento da demanda de transporte de imagens pela rede, o que de
certa forma é custoso, devido ao grande volume de dados e pelo alto tempo de
transmissão. Portanto é necessário diminuir o volume de dados transmitidos e ou
armazenados. Essa diminuição é realizada através de técnicas de compressão de imagens.
Nos últimos 30 anos a busca por algoritmos eficientes e rápidos para compressão de
imagens, cresceu enormemente.
Armazenamento de imagens se refere ao armazenamento eletrônico de dados de
uma imagem, tipicamente em mídias permanentes magnéticas ou outras. Transporte de
imagem se refere à transferência eletrônica de dados de uma imagem através de um link
de transmissão de dados.
Compressão de imagens visa representar uma imagem, com algum nível de
qualidade exigido, numa forma mais compacta. Operações de compressão de imagens
buscam preservar as informações essenciais de uma imagem de forma que a mesma possa
ser reconstruída com precisão. As informações não essenciais podem ser descartadas.
A compressão de imagem tem como objetivo reduzir a quantidade exigida de
dados (número de bits) para representar uma imagem digital. A base subjacente do
processo de redução é a remoção de dados redundantes [GONZALEZ], conservando as
informações básicas, de tal maneira que as informações perdidas não sejam perceptíveis
pelo olho humano.
O problema de se usar imagens com qualidade fotográfica é a quantidade de
espaço de armazenamento requerido para uso em um programa. Para o padrão VGA,
por exemplo, uma imagem com resolução geométrica de 800 x 600 pixels, utilizando 3
bytes por pixel, ocupa aproximadamente 1.37 MBytes de memória de armazenamento.
Três fatores são importantes na medida de eficiência dos algoritmos de
compressão de imagens:

1
• Diminuição da quantidade de armazenamento requerido pela imagem;
• Distorção resultante provocado pela eliminação dos dados não necessários da
imagem;
• Grau de complexidade computacional.
Dentre os métodos com boa capacidade de compressão e com relativa
distorção da qualidade, estão aqueles que transformam a imagem do domínio espacial
para o domínio da freqüência, que são os chamados métodos por transformada.
Se a quantidade de dados necessários para representar uma imagem pode ser
reduzida, então a quantidade de tempo para transporte também é reduzida. Igualmente, o
total de espaço de armazenamento exigido é reduzido. Deste modo, a compressão de
imagens pode proporcionar economias significantes. Por exemplo, a compressão de uma
imagem na razão de 10:1, permitiria o transporte de dez imagens comprimidas no mesmo
tempo requerido para transportar uma imagem não comprimida.
Esquemas de compressão de imagem ainda podem ser divididos em dois grupos
gerais: compressão sem perda e compressão com perda. Compressão de imagem sem
perda preserva o conteúdo original da imagem, ou seja, a descompressão (processo
inverso à compressão) retorna o conteúdo exato da imagem original. O ganho em espaço
ocupado nem sempre é significativo nessas técnicas. A técnica mais conhecida neste
grupo é a compactação LZW (Lempel Ziv Welch), sendo que os formatos de imagens
TIF (Target Interchange File), GIF (Graphics Interchange Format), PCX (PC
Paintbrush File Format), fazem uso de técnicas de compressão sem perda.
Por outro lado, a compressão de imagem com perda não preserva as
informações originais em sua totalidade, mantendo alguns níveis específicos de qualidade
da imagem, desprezando as informações redundantes e garantindo uma certa qualidade
para a mesma. O objetivo é eliminar o máximo de redundância com o mínimo de perda
visual.
Os métodos mais comuns nesse grupo são baseados em transformações da
imagem para o domínio da freqüência, que representa a imagem em outras bases,
diferentes do plano no qual a imagem é visualizada. Na maioria desses casos, faz-se a
transformação por blocos menores, pois isto reduz o custo computacional. A imagem
original é dividida em sub-imagens (blocos), as quais são então transformadas. A
transformada que se mostrou mais adequada à compressão de imagens digitais é a

2
Transformada Discreta do Cosseno (TDC), que transforma a imagem do domínio
espacial para o domínio da freqüência, decompondo-a em ondas cossenoidais.
A imagem comprimida é obtida, depois da transformação, por meio da
quantização e codificação. O algoritmo mais importante neste grupo foi estabelecido
pelo padrão JPEG (Joint Photographic Experts Group) em meados da década de 80, que
tem por base a TDC e que alcança as mais altas taxas de compressão. O formato de
imagem que faz uso desse algoritmo é o .JPG. O tamanho de cada bloco adotado para o
padrão JPG é 8x8 pixels, pois possui melhor razão entre tempo de cálculo e capacidade
de compressão.

3
Capítulo 1 – TRANSFORMADA DISCRETA DO COSSENO (TDC)

A transformada é a chave para o processo de compressão: ela toma um


conjunto de pontos no domínio espacial e os transforma em uma representação
equivalente no domínio da freqüência. Um dos objetivos da transformada é diminuir a
correlação, eliminando-se portanto as redundâncias estatísticas. Outro aspecto relevante
é que os novos dados devem exigir menos espaço ao mesmo tempo em que o algoritmo
para obtê-los seja o mais eficiente possível.
A transformada utilizada no processo de compressão é a Transformada Discreta
do Cosseno (TDC), que converte um bloco de pixels em uma matriz de coeficientes,
descorrelacionando a informação da imagem. A transformada que descorrelaciona a
informação de uma imagem de modo ótimo é a Transformada de Karhunen-Loève
(TKL), a qual, por não ter um algoritmo rápido, não permite implementação
computacional eficiente. Por outro lado, dentre os métodos eficientes de transformação
de imagens, aquele que mais se aproxima da TKL é justamente o que usa a
Transformada Discreta do Cosseno (TDC), que por isso foi escolhida para ser usada no
padrão JPEG.
Os coeficientes (transformados) iniciais do bloco, contêm as informações mais
importantes da imagem, assim, deve-se garantir o armazenamento de certo número de
coeficientes com baixos índices de posição. Por outro lado, como a transformada fornece
uma série de cossenos (que no limite é convergente), os coeficientes diminuem em
amplitude conforme os índices crescem. Pode-se, portanto, quantizar os coeficientes por
zona, diminuindo-os e mesmo eliminando os menos significantes, obtendo o principal
ganho na taxa de compressão.
A Transformada Discreta do Cosseno (TDC) é definida por :

 ( 2 x + 1)iπ   ( 2 y + 1) jπ 
N N −1 −1
C (i , j ) = α (i )α ( j ) ∑ ∑ f ( x , y ) cos  cos 
x =0 y =0  2N   2N 

4
para i, j = 0, 1... , N-1, e

 1
 se x = 0
 N
α (x) = 

 2
p a ra x = 1, 2 , . . . , N - 1
 N

onde :

C : Transformada Discreta do Cosseno


f : Valores da imagem original (nível de cinza)
N : Dimensão da imagem (ou bloco).

Para aplicar a TDC em uma imagem, é necessário, para efeito de rapidez nos
cálculos e para uma melhor taxa de compressão, dividir a imagem original em blocos, 4
x 4, 8 x 8 ou 16 x 16, podendo usar até blocos de 32 x 32 ou 64 x 64. Em geral, usam-
se blocos 8 x 8. Verificar com resultados obtidos aplicando compressão com diferentes
tamanhos de blocos e fator de qualidade 2 a uma imagem de 384 x 288 com 1 byte por
pixel, ocupando um espaço de armazenamento de 100.592 bytes.

Fator Qualidade 2
Tamanho (compressão) Taxa compressão
Bloco
4x4 35.979 32,53%
Tamanho (compressão) Taxa compressão
Bloco
8x8 22.772 20,59%
Tamanho (compressão) Taxa compressão
Bloco
16x16 14.273 12,91%
Tamanho (compressão) Taxa compressão
Bloco
32x32 8.418 7,61%
Tabela 01 – Resultados de compressão com diferentes tamanhos de blocos

5
A Transformada Inversa do Cosseno (ITDC) é dada por :

 ( 2 x + 1)iπ  cos ( 2 y + 1) jπ 
N −1 N −1
f ( x , y ) = ∑ ∑ α (i )α ( j ) C (i , j ) cos   
i =0 j =0  2N   2N 

No caso de uma dimensão (1D), como por exemplo, uma linha da imagem, a
Transformada do Cosseno e sua inversa são dadas por :

Transformada Discreta do Cosseno (TDC) em uma dimensão :

 ( 2 x + 1)iπ 
N −1
C (i ) = α (i ) ∑ f ( x ) cos 
x =0  2N 

Transformada Inversa do Cosseno (ITDC) em uma dimensão :

N −1
( 2 x + 1)iπ 
f (x ) = ∑ α (i )C (i ) cos
i=0 2N

O tempo requerido para computar cada elemento na TDC é fortemente


dependente do tamanho do bloco. O número de multiplicações, para o caso
bidimensional é proporcional a N2, ou seja, quando N cresce, o tempo exigido para
processar cada elemento na TDC aumenta consideravelmente. O total de cálculos
necessários para executar uma transformada TDC é proibitivamente grande. A
implementação da TDC, em geral, deve dividir a imagem em blocos menores, mais
rapidamente computáveis. O grupo JPEG selecionou o bloco de tamanho 8 x 8 para ser
o padrão [NELSON].

6
O exemplo abaixo ilustra o resultado da TDC aplicada em um bloco 8 x 8 de
uma imagem:

140 144 147 140 140 155 179 175


144 152 140 147 140 148 167 179
152 155 136 167 163 162 152 172
168 145 156 160 152 155 136 160
162 148 156 148 140 136 147 162
147 167 140 155 155 140 136 162
136 156 123 167 162 144 140 147
148 155 136 155 152 147 147 136
Figura 01 – Bloco de entrada [apud NELSON]

186 -18 15 -9 23 -9 -14 19


21 -34 26 -9 -11 11 14 7
-10 -24 -2 6 -18 3 -20 -1
-8 -5 14 -15 -8 -3 -3 8
-3 10 8 1 -11 18 18 15
4 -2 -18 8 8 -4 1 -7
9 1 -3 4 -1 -7 -1 -2
0 -8 -2 2 1 4 -6 0
Figura 02 – Bloco de saída [apud NELSON]

Este resultado mostra uma das principais características da TDC: o coeficiente


na posição (0,0) (canto superior esquerdo), representado como DC, apresenta a maior
magnitude no bloco. Isto indica que a aplicação da TDC sobre o bloco, concentra a

7
representação mais importante da imagem no lado superior esquerdo, enquanto as
informações menos relevantes, se encontram no lado direito inferior do bloco.
Para melhor entender a decomposição da imagem original em ondas
cossenoidais, é apresentado o caso simplificado em uma linha de imagem, de tamanho 4.
A generalização segue o mesmo raciocínio, não oferecendo dificuldades significativas.
Supõe-se a existência de 4 tons de cinza f(0), f(1), f(2) e f(3) e sua transformada
C(0), C(1), C(2) e C(3) :

Figura 03 – Uma representação da imagem f(x) como sinal contínuo

Em termos contínuos, temos f(x) que nos valores 0, 1, 2 e 3 coincide com os


valores dos pixels. O sinal de f(x) foi discretizado: anteriormente era contínuo. Podemos
interpretar f(x) como uma onda. A Transformada do Cosseno decompõe esta onda em
outras ondas básicas envolvendo apenas cossenos :

 2x + 1   2x + 1   2x + 1 
f (x) = C(0)α (0) + C(1)α (1)cos π + C(2)α (2)cos 2π + C(3)α (3)cos 3π
 2N   2N   2N 

8
Os coeficientes C(0), C(1), C(2) e C(3) estão associados a freqüências cada vez
mais altas (que são responsáveis pelos detalhes existentes na imagem), ou seja, f(x) é
uma combinação linear da base :

 2x + 1   2x + 1   2x + 1 
b0 = cos(0); b1 = cos π; b2 = cos 2π ; b3 = cos 3π .
 2N   2N   2N 

Sendo o intervalo de interesse, no exemplo, x ∈[ 0, 3] e N = 4, podemos


visualizar os elementos da base, ou as básicas, nesse intervalo :

Figura 04 – Representação das básicas no caso contínuo

e também de que maneira os coeficientes α e C influenciam na composição


final:

Figura 05 – Representação das básicas multiplicadas pelos coeficientes α e C

9
e

b’0

b’0 + b’1 + b’2

b’0 + b’1 + b’2 + b’3


b’0 + b’1

Figura 06 – Soma acumulativa das básicas

que representa a soma acumulativa das parcelas, sendo possível perceber a


contribuição de cada uma delas. A contribuição das últimas básicas vai diminuindo ao
mesmo tempo em que refina os detalhes.
No intuito de possibilitar o uso dos computadores será abordado o problema
usando matrizes. Substituindo x por 0, 1, 2 e 3 respectivamente, obtemos :

 π   2π   3π 
f (0) = C(0)α(0) + C(1)α(1)cos  + C(2)α(2)cos  + C(3)α(3)cos 
 2N   2N   2N 

 3π   6π   9π 
f (1) = C(0)α(0) + C(1)α(1)cos  + C(2)α(2)cos  + C(3)α(3)cos 
 2N   2N   2N 
 5π   10π   15π 
f (2) = C(0)α(0) + C(1)α(1)cos  + C(2)α(2)cos  + C(3)α(3)cos 
 2N   2N   2N 
 7π   14π   21π 
f (3) = C(0)α(0) + C(1)α(1) cos  + C(2)α(2) cos  + C(3)α(3) cos 
 2N   2N   2N 
portanto,

  π   2π   3π  
α (0) cos(0) α (1)cos 
 2N 
α (2 ) cos 
 2N 
α (3) cos 
 2N 
 
 f (0)    3π   6π   9π   C (0) 
 f (1)  α (0) cos(0) α (1) cos 
 2N 
α (2 ) cos 
 2N 
α (3) cos 
 2N   C (1) 
 =   
 f (2)   5π   10π   15π   C (2) 
  α (0)cos(0) α (1) cos 
 2N 
α ( 2) cos
 2N 
 α (3)cos 
 2 N    
 f (3)   C (3) 
  7π   14π   21π  
α (0)cos(0) α (1) cos  α ( 2) cos  α (3) cos 
  2N   2N   2N 

10
ou seja, F = CC.
Agora interessa-nos obter os coeficientes C(0), C(1), C(2) e C(3). Para este
cálculo, observando que Ct C = I, onde Ct é a matriz transposta de C, temos :
CtF = CtCC ⇒ C = Ct F,
isto é,

α (0) cos(0) α (0) cos(0) α (0)cos(0) α (0) cos(0) 


 
 π   3π   5π   7π  
C (0)  α (1) cos  α (1) cos  α (1) cos  α (1) cos   f (0) 
C (1)    2N   2N   2N   2N    f (1) 
 = 2π  6π  10π   14π  
  
C (2)  α (2 ) cos  α (2) cos  α ( 2) cos  α (2) cos   f ( 2) 
    2N   2N   2N   2N    
C (3)     f (3) 
 ( )  3π  ( )  
9π  15π   21π  
α 3 cos 2 N  α 3 cos 2 N  α (3) cos  ( )
α 3 cos 
 2N   2 N  

Esses cálculos podem, agora, no domínio discreto, serem também colocados


como composição de elementos (básicas) de certa base. Para tanto fazemos :
F = CC , mas

 1  0 0 0 


 0 1  0 0 
       
C = C (0) + C (1) + C ( 2) + C (3)   
 0 0 1  0 
        
0 0 0 1  

então F = C(0)Ce1 + C(1)Ce2 + C(2)Ce3 + C(3)Ce4.


Não nos esquecendo das constantes α(0), α(1), α(2) e α(3), podemos
considerar as básicas :
  π    2π     3π  
cos 2 N   cos 2 N   cos 2 N  
     
cos(0)   3π     6π     9π  
cos(0) cos  cos  cos 
2N   2N   2N  
B0 =  ; B1 =  ; B2 =  ; B3 = 
cos(0)   5π     10π     15π  
  cos  cos  cos 
cos(0)  2N    2N   2N  
  7π     14π     21π  
cos  cos  cos 
  2N     2N    2N 

11
ou esquematicamente

Figura 07 – Representação das básicas – caso discreto b0

Figura 08 – Representação das básicas – caso discreto b1

Figura 09 – Representação das básicas – caso discreto b2

12
Figura 10 – Representação das básicas – caso discreto b3

No caso de uma imagem, onde tem que se considerar linhas e colunas, tudo
pode ser prontamente generalizado chegando a:
C=CFC F=C CC


cuja inversa é dada por :


com F e C matrizes com elementos dados pelas definições da transformada dada no
início desta seção.
Colocando tons de cinza para os valores dos elementos da base, obtem-se:

Figura 11 – Representação das básicas da TDC no plano [apud GONZALEZ]

13
Onde cada bloco tem dimensão 4 x 4 com elementos variando de 0 a 3. O tom
mais claro é associado ao maior valor, enquanto o mais escuro ao menor.
O próximo passo é onde ocorre a perda da informação : quantização.

1.1 – QUANTIZAÇÃO

A TDC ocupa mais espaço do que a matriz original, pois, enquanto os valores
da matriz original são do tipo byte, ou inteiro, os coeficientes da TDC são reais. Para
reduzir esses valores, é realizada a quantização, que é simplesmente o processo de
reduzir o número de bits necessários para armazenar um valor reduzindo a precisão de
um inteiro.
É neste processo de quantização, reduzindo a precisão, que acontece a perda da
informação, ou seja, os valores dos coeficientes que eram reais, agora passam a ser
inteiros, perdendo a parte decimal, mas reduzindo o número de bits necessários para
armazenar os valores.
O padrão JPEG, usa uma matriz Q[i][j] de quantização extremamente testada
por membros do comitê, que gera um nível estável e bom de compressão:

Q[i][j] = 1 + (1 + i + j) * fator_de _qualidade

Onde o fator_de_qualidade pode variar de 1 à 25. Valores maiores do que 25


comprometem em muito a qualidade da imagem.

Fator de Qualidade
2 5 10 15 20 25
Tamanho Tamanho Tamanho Tamanho Tamanho Tamanho
(compressão) (compressão) (compressão) (compressão) (compressão) (compressão)

Bloco 22.772 11.484 6.438 4.672 3.795 3.316


8x8 Taxa compressão Taxa compressão Taxa compressão Taxa compressão Taxa compressão Taxa compressão

20,59% 10,38% 5,82% 4,22% 3,43% 3,00%


Perda Perda Perda Perda Perda Perda

8.3974 10.073 11.551 12.237 12.496 13.847


Tabela 02 – Resultados de compressão variando os fatores de qualidade aplicados a uma
imagem de 384 x 288 pixels com 1 byte por pixel, tamanho de 100.592 bytes

14
(a)

(b)

15
(c)
Figura 12 – (a) Resultado de compressão com fator de qualidade 2, (b) Resultado de
compressão com fator de qualidade 10, (c) Resultado de compressão com
fator de qualidade 25

Na figura 12 (b) e (c) verifica-se a degradação visual da imagem devido ao


aumento do fator de qualidade.

Desta maneira os coeficientes associados as mais altas freqüências são os que


sofrem as maiores reduções. Esta é uma quantização por zona, pois incide em certas
posições, ao invés de determinar quais os coeficientes são os mais importantes para o
bloco específico.

Um algoritmo para gerar a matriz de quantização, poderia ser escrito como o


algoritmo:

for (i = 0; i < N; i ++)


for (j = 0; j < N; j++)
Q[i][j] = 1 + (1 + i + j)*fator_de_qualidade;

16
O próximo passo é quantizar os coeficientes da TDC:

DCT[i][j]
Valor_quantizado[i][j] = arredondado para inteiro.
Q[i][j]

No processo de descompressão, opera-se de maneira inversa:

TDC[i][j] = Valor_quantizado[i][j] * Q[i][j]


Aplicando a matriz de quantização, com fator de qualidade 2, sobre uma TDC,
obtemos:

92 3 -9 -7 3 -1 0 2
-39 -58 12 17 -2 2 4 2
-84 62 1 -18 3 4 -5 5
-52 -36 -10 14 -10 4 -2 0
-86 -40 49 -7 17 -6 -2 5
-62 65 -12 -2 3 -8 -2 0
-17 14 -36 17 -11 3 3 -1
-54 32 -9 -9 22 0 1 3
Figura 13 – TDC antes da quantização [apud NELSON]

90 0 -7 0 0 0 0 0
-35 -56 9 11 0 0 0 0
-84 54 0 -13 0 0 0 0
-45 -33 0 0 0 0 0 0
-77 -39 45 0 0 0 0 0
-52 60 0 0 0 0 0 0
-15 0 -19 0 0 0 0 0
-51 19 0 0 0 0 0 0
Figura 14 – TDC após a dequantização [apud NELSON]

17
Capítulo 2 – CODIFICAÇÃO

É a etapa final do processo de compressão e consiste em atribuir um código


para a informação quantizada.

2.1 – RUN-LENGTH CODING

A entropia de uma imagem é a medida de seu conteúdo de informação. Se a


entropia é alta, a informação de uma imagem tende a não ter muita correlação. Ou seja, a
informação de uma imagem de entropia alta contém muita aleatoriedade e pouca
redundância. Se a entropia é baixa, a informação de uma imagem é mais previsível,
contém pequena aleatoriedade e sua redundância é alta.
Pode-se computar a entropia de uma imagem como a probabilidade de sua
ocorrência. Isto é exibido como um número que representa o número de bits necessários
para representar aquela probabilidade. Para qualquer imagem, isto seria como segue:

E = Nc x Nl x Nb

onde:
E : entropia;
Nc : Número de colunas;
Nl : Número de linhas;
Nb : número de bits por pixel.

Por exemplo : 640 x 480 x 8 , teria a seguinte entropia:


Entropia = 640 x 480 x 8 = 2.457.600.

Esta é a medida de entropia para qualquer caso 640 x 480 x 8 bit imagem.
Qualquer uma de 22.457.600 possíveis imagens diferente pode ser representada por uma
imagem desta resolução. Reciprocamente, há uma em 22.457.600 chances de uma imagem
particular com estas dimensões ser idêntica à outra.

18
Como imagens raramente são compostas de níveis totalmente variados, a
entropia atual de uma imagem normal geralmente será algo menor do que o cálculo
acima. Isto se deve ao fato da quantidade de dados de uma imagem comum sempre ser
mais alta que a quantidade de dados de informação comum. A entropia atual de uma
imagem é a quantidade de informação comum da imagem. Em outras palavras, uma
imagem de 640 x 480 x 8 bits pode ser comprimida de uma forma comum e podem ser
requeridos 2.457.600 bits, para algo menor. A forma de compressão que faz isto é
chamada codificação de entropia. A técnica que codifica a entropia reduz redundâncias
da imagem para ser usada em códigos de tamanho variável. Isto pode ser feito
codificando números variáveis de pixels com código de tamanho fixo, ou codificando
números fixos de pixels com códigos de tamanhos variados.
Codificação de imagem RLC tira proveito do fato que vários pixels pertos em
uma imagem, estatisticamente, tendem a ter o mesmo valor de nível. Esta forma de
redundância pode ser reduzida agrupando-se pixels de nível idênticos em códigos únicos.
O esquema do RLC trabalha como segue: a imagem original é avaliada
começando do primeiro pixel no canto superior esquerdo, olhando o primeiro pixel e é
seguido o vizinho pela linha, o esquema determina quantos pixels seguintes tem o mesmo
valor de nível. Se o próximo um ou mais pixels na seqüência tem o mesmo valor de nível
como o primeiro, eles são todos representados por um código novo. O código novo é
composto de dois valores; um valor de nível seguido pelo número de pixels (run-length)
que tem o mesmo valor. O processo move para o próximo pixel na linha com um novo
valor de nível se repete o processo. Quando o fim da linha é alcançado, o processo volta
ao começo da próxima linha. Este processo continua até que a última linha da imagem
tenha sido codificada.
Se, por exemplo, 15 pixels seqüenciais tivessem o mesmo valor de nível de 234,
eles seriam codificados nos dois valores – nível|quantidade – 234|15. Os 15 bytes de
dados necessários para representar 15 pixels da imagem original são comprimidos para
somente 2 bytes. O resultado do run-length numa imagem comprimida está para cima de
2 bytes de códigos, representando cada valor de nível e tamanho. [BAXES]

19
76 | 5 78 | 1 79 | 4 80 | 2
(Nível | Quantidade)
x

76 76 76 76 76 78 79 79 79 79 80 80
y

imagem original
Figura 15 – A operação Run-Length Coding

Uma imagem codificada com o RLC é decodificada ampliando cada código


gerado. O nível de cada código é repetido através da linha da imagem para o número de
pixels indicado pelo valor de duração adjunto.
Em imagens binárias, esta técnica possibilita altas taxas de compressão. Por
outro lado, se os pixels vizinhos não forem iguais, a codificação pode resultar maior do
que o original.

Por exemplo:
78 81 90 - pixels de uma imagem
78 01 81 01 90 01 - codificação RLC

A região da imagem possui 3 bytes, já a codificação necessita de 6 bytes para


armazenamento, ou seja, o dobro da imagem original.

2.2 - CODIFICAÇÃO POR HUFFMAN

Outra técnica comum para a codificação de entropia é a de Huffman,


desenvolvida em 1952, por D. A. Huffman. A codificação de Huffman converte o valor
do nível de pixel da imagem original para um novo código de tamanho variável, baseado
nas freqüências de ocorrência na imagem. Desse modo, são atribuídos níveis que

20
freqüentemente acontecem em códigos menores, e são atribuídos níveis que acontecem
sem muita freqüência em códigos mais longos. O resultado é que a imagem comprimida
exigirá menos bits globais para descrever a imagem original.
O esquema de compressão de Huffman inicia olhando o histograma de nível de
uma imagem. Com o histograma, a freqüência de ocorrência para todo nível na imagem é
avaliada. Os valores de nível são ordenados pelas freqüências de ocorrência numa lista,
onde o código de Huffman atribui novos códigos a cada valor de nível. Os códigos
atribuídos são de tamanhos variados; os códigos menores são atribuídos primeiros (a
maioria freqüente) valores na lista e, eventualmente, os códigos mais longos são
atribuídos últimos (menos freqüente) valores na lista. Finalmente, a imagem comprimida
é criada simpesmente substituindo os códigos de valor de nível de tamanho variável para
o original código de valor de nível de 1 byte.

Figura 16 – Imagem com 640 x 480 pixels

21
Figura 17 – Histograma da imagem original com o número de pixels de cada nível de
cinza [apud BAXES]

Os códigos de Huffman são atribuídos criando a árvore de Huffman que


emparelha os valores de nível baseado nas suas freqüências combinadas de ocorrência. A
árvore de Huffman assegura que os códigos mais longos são atribuídos freqüentemente
os de menos níveis e vice-versa. [BAXES]

Nível Número de Pixels


0
73 69,980
0
110 67,181
0 135,062 0
146 41,988 307,200
172,138
36 34,990 0
67,881 1
183 32,891 1
1 102,158
219 30,791 0
60,170 1
255 27,992 0 1
29,379
0 1,387 1
1
307,200 = 640 x 480

Figura 18 – Árvore de Huffman [apud BAXES]

22
Intensidade Código de
Huffman
73 10
110 00
146 110
36 010
183 011
219 1110
255 11110
0 11111

Tabela 03 – Codificação de Huffman [apud BAXES]

O código de Huffman é tão pequeno quanto 1 bit e podem ser tão grande
quanto 7 bits. O código de Huffman mais longo nunca pode ser maior que o número de
níveis diferentes na imagem (no caso, oito) menos 1. Embora uma imagem codificada
pelo Huffman possa ter alguns níveis com códigos muito longos, as suas freqüências de
ocorrências sempre são estatisticamente baixas.
A decodificação de imagem Huffman inverte o processo de compressão
substituindo o valor original pelo valor da codificação de Huffman. A codificação por
Huffman gera uma razão de redução do código de 1.5:1 a 2:1.

23
Capítulo 3 – O PADRÃO JPEG

O padrão JPEG (Joint Photographic Experts Group), estabelecido juntamente


pelo ISO/IEC e organizações de CCITT, é um dos mais importantes padrões de
compressão de dados dos anos 90. O padrão de compressão de imagens JPEG manipula
imagens em tons de cinza e imagens coloridas de resolução e tamanho variado. O padrão
JPEG é usado em artes gráficas, editoração eletrônica, imagens médicas, e várias outras
aplicações. Esse padrão é usado comumente em compressão com perda. Porém, também
há um modo de compressão sem perda com desempenho de compressão reduzido.
[BAXES]
O procedimento completo para a compressão de uma imagem tem a TDC como
uma de suas componentes. Inicialmente a imagem é subdividida em blocos 8 x 8, os
quais são então transformados pela TDC gerando um conjunto conhecido como
coeficiente TDC. Esses coeficientes são então quantizados, isto é, sofrem uma redução
em valor, sendo mantidos apenas os mais relevantes. O padrão JPEG faz essa redução
por zona. É nesta fase que há uma significativa diminuição do espaço exigido para o
armazenamento, com consequente perda de informação. Os coeficientes são reordenados
para a codificação por entropia obedecendo a seqüência zig-zag, após a reordenação, são
codificados pela codificação de Huffman.
Isto se repete até que se esgotem todos os blocos da imagem, quando se tem a
imagem comprimida com extensão JPG. O processo de recuperação da imagem
“original” segue os passos na direção contrária, aplicando no final a transformada inversa
do cosseno. Uma exposição bastante didática e prática desse padrão pode ser encontrada
em [NELSON].

24
Imagem
Original

Acabou S
Imagem
Blocos? Huffman Comprimida

TDC

Quantização

Zig-zag

Codificação
RLC

Figura 19 – Processo de compressão JPEG

25
Imagem
Comprimida

Inversa de
Huffman

Acabou S Imagem
Blocos? Recuperada

Decodificação
RLC

Inversa
Zig-zag

ITDC

Figura 20 – Processo de descompressão JPEG

Para a codificação de Huffman pode-se especificar uma tabela que é comumente


usada e está baseada em testes empíricos e análises estatísticas.

26
3.1 – TABELAS PADRÃO PARA A CODIFICAÇÃO DE HUFFMAN

Faixa Categoria DC Categoria AC


0 0 N/A
-1 , 1 1 1
-3,-2 , 2,3 2 2
-7,...,-4 , 4,...,7 3 3
-15,...,-8 , 8,...,15 4 4
-31,...,-16 , 16,...,31 5 5
-63,...,-32 , 32,...,63 6 6
-127,...,-64 , 64,...,127 7 7
-255,...,-128 , 128,...,255 8 8
-511,...,-256 , 256,...,511 9 9
-1023,...,-512 , 512,...,1023 A A
-2047,...,-1024 , 1024,...,2047 B B
-4095,...,-2048 , 2048,...,4095 C C
-8191,...,-4096 , 4096,...,8191 D D
-16383,...,-8192 , 8192,...,16383 E E
-32767,...,-16384 , 16384,...,32767 F N/A
Tabela 04 – JPEG Categorias para Codificação dos Coeficientes

Em particular, os coeficientes não zero AC são codificados usando o código de


tamanho variável que define o valor do coeficiente e o número de zeros precedentes. O
coeficiente de DC é o código de diferença relativa para o coeficiente DC da sub-imagem
anterior.
Tabelas de Categorias para Codificação de Coeficientes, Código DC Padrão e
Código AC Padrão provêem a codificação padrão JPEG para imagem de luminância. O
JPEG recomenda que ordem de quantização de luminância pode ser escalada para prover
uma variedade de níveis de compressão. Através das tabelas padrão de codificação e
ordens de quantização providas para processamento de luminância e crominância, o
usuário tem a faculdade para construir tabelas de uso e / ou ordens que podem ser
adaptadas de fato às características da imagem que está sendo comprimida.

27
Categoria Código Base Tamanho Categoria Código Base Tamanho
0 010 3 6 1110 10
1 011 4 7 11110 12
2 100 5 8 111110 14
3 00 5 9 1111110 16
4 101 7 A 11111110 18
5 110 8 B 111111110 20
Tabela 05 – JPEG Código DC Padrão

28
Compr./ Compr./
Categoria Código Base Tamanho Categoria Código Base Tamanho
0/0 1010 (= EOB) 4
0/1 00 3 8/1 11111010 9
0/2 01 4 8/2 111111111000000 17
0/3 100 6 8/3 1111111110110111 19
0/4 1011 8 8/4 1111111110111000 20
0/5 11010 10 8/5 1111111110111001 21
0/6 111000 12 8/6 1111111110111010 22
0/7 1111000 14 8/7 1111111110111011 23
0/8 1111110110 18 8/8 1111111110111100 24
0/9 1111111110000010 25 8/9 1111111110111101 25
0/A 1111111110000011 26 8/A 1111111110111110 26
1/1 1100 5 9/1 111111000 10
1/2 111001 8 9/2 1111111110111111 18
1/3 1111001 10 9/3 1111111111000000 19
1/4 111110110 13 9/4 1111111111000001 20
1/5 11111110110 16 9/5 1111111111000010 21
1/6 1111111110000100 22 9/6 1111111111000011 22
1/7 1111111110000101 23 9/7 1111111111000100 23
1/8 1111111110000110 24 9/8 1111111111000101 24
1/9 1111111110000111 25 9/9 1111111111000110 25
1/A 1111111110001000 26 9/A 1111111111000111 26
2/1 11011 6 A/1 111111001 10
2/2 11111000 10 A/2 1111111111001000 18
2/3 1111110111 13 A/3 1111111111001001 19
2/4 1111111110001001 20 A/4 1111111111001010 20
2/5 1111111110001010 21 A/5 1111111111001011 21
2/6 1111111110001011 22 A/6 1111111111001100 22
2/7 1111111110001100 23 A/7 1111111111001101 23
2/8 1111111110001101 24 A/8 1111111111001110 24
2/9 1111111110001110 25 A/9 1111111111001111 25
2/A 1111111110001111 26 A/A 1111111111010000 26
3/1 111010 7 B/1 111111010 10
3/2 111110111 11 B/2 1111111111010001 18
3/3 11111110111 14 B/3 1111111111010010 19
3/4 1111111110010000 20 B/4 1111111111010011 20
3/5 1111111110010001 21 B/5 1111111111010100 21
3/6 1111111110010010 22 B/6 1111111111010101 22
3/7 1111111110010011 23 B/7 1111111111010110 23
3/8 1111111110010100 24 B/8 1111111111010111 24
3/9 1111111110010101 25 B/9 1111111111011000 25
3/A 1111111110010110 26 B/A 1111111111011001 26

29
Compr./ Compr./
Categoria Código Base Tamanho Categoria Código Base Tamanho
4/1 111011 7 C/1 1111111010 11
4/2 1111111000 12 C/2 1111111111011010 18
4/3 1111111110010111 19 C/3 1111111111011011 19
4/4 1111111110011000 20 C/4 1111111111011100 20
4/5 1111111110011001 21 C/5 1111111111011101 21
4/6 1111111110011010 22 C/6 1111111111011110 22
4/7 1111111110011011 23 C/7 1111111111011111 23
4/8 1111111110011100 24 C/8 1111111111100000 24
4/9 1111111110011101 25 C/9 1111111111100001 25
4/A 1111111110011110 26 C/A 1111111111100010 26
5/1 1111010 8 D/1 11111111010 12
5/2 1111111001 12 D/2 1111111111100011 18
5/3 1111111110011111 19 D/3 1111111111100100 19
5/4 1111111110100000 20 D/4 1111111111100101 20
5/5 1111111110100001 21 D/5 1111111111100110 21
5/6 1111111110100010 22 D/6 1111111111100111 22
5/7 1111111110100011 23 D/7 1111111111101000 23
5/8 1111111110100100 24 D/8 1111111111101001 24
5/9 1111111110100101 25 D/9 1111111111101010 25
5/A 1111111110100110 26 D/A 1111111111101011 26
6/1 1111011 8 E/1 111111110110 13
6/2 11111111000 13 E/2 1111111111101100 18
6/3 1111111110100111 19 E/3 1111111111101101 19
6/4 1111111110101000 20 E/4 1111111111101110 20
6/5 1111111110101001 21 E/5 1111111111101111 21
6/6 1111111110101010 22 E/6 1111111111110000 22
6/7 1111111110101011 23 E/7 1111111111110001 23
6/8 1111111110101100 24 E/8 1111111111110010 24
6/9 1111111110101101 25 E/9 1111111111110011 25
6/A 1111111110101110 26 E/A 1111111111110100 26
7/1 11111001 9 F/0 111111110111 12
7/2 11111111001 13 F/1 1111111111110101 17
7/3 1111111110101111 19 F/2 1111111111110110 18
7/4 1111111110110000 20 F/3 1111111111110111 19
7/5 1111111110110001 21 F/4 1111111111111000 20
7/6 1111111110110010 22 F/5 1111111111111001 21
7/7 1111111110110011 23 F/6 1111111111111010 22
7/8 1111111110110100 24 F/7 1111111111111011 23
7/9 1111111110110101 25 F/8 1111111111111100 24
7/A 1111111110110110 26 F/9 1111111111111101 25
F/A 1111111111111110 26
Tabela 06 – JPEG Código AC Padrão

30
-26 -3 -6 2 2 0 0 0
1 -2 -4 0 0 0 0 0
-3 1 5 -1 -1 0 0 0
-4 1 2 -1 0 0 0 0
1 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0
Figura 21 – Bloco após quantização [apud GONZALEZ]

[-26 -3 1 -3 -2 -6 2 -4 1 -4 1 1 5 0 2 0 0 -1 2 0 0 0 0 0 -1
-1 EOB]

onde o símbolo EOB denota uma condição de fim de bloco. Uma palavra chave de EOB
especial (veja a categoria 0 e percorra o tamanho 0 na tabela de Categorias para
Codificação dos Coeficientes) é provida para indicar que os restos dos coeficientes em
uma seqüência são zeros.

3.2 – A SEQÜÊNCIA ZIG-ZAG

Uma razão que o algoritmo de JPEG comprime tão efetivamente é que um


número grande de coeficientes na imagem de TDC é truncado para zero durante a fase
de quantização dos coeficientes. Tantos valores são setados para zero que o comitê
JPEG elegeu para manipular estes valores diferentemente de outros valores dos
coeficientes.
Em vez de se utilizar Huffman ou aritmética que codificam para comprimir os
valores zero, estes são codificados usando o algoritmo de codificação por comprimento
de cadeia o Run-Length Coding (RLC). [NELSON]
Como a quantização reduz a magnitude dos coeficientes da TDC e aumenta o
número de coeficientes com valores zero, se os dados forem reordenados com a

31
seqüência Zig-zag, mostrada na figura abaixo, os coeficientes de baixa freqüência são
colocados na frente dos coeficientes de alta freqüência.
Um esquema usado para reordenar estes elementos é conhecido como zig-zag :

Figura 22 – Zig-zag num bloco de 8 x 8 [apud NELSON]

32
CONCLUSÃO

Este trabalho demonstrou a validade do uso da TDC para compressão de


imagens, ou seja, o processo de compressão de imagens, utilizando-se da Transformada
Discreta do Cosseno apresenta altas taxas de compressão, o que reduz o espaço de
armazenamento e o tempo de transmissão, o que é fundamental nos dias atuais.
As especificações do padrão JPEG foram implementadas e testadas com várias
imagens de categorias diferentes, variando-se o fator de qualidade e o tamanho do bloco.
Ficou constatado que com a variação do fator de qualidade, ou seja, aumentado-se esse
fator, ocorre uma grande perda no processo inverso, ou seja, na descompressão, o que
acarreta em uma degradação da imagem, facilmente percebida visualmente.
Outro fator importante é o tempo de computação do processo de compressão,
que cresce proporcionalmente ao aumento do tamanho do bloco. Com blocos grandes,
como 16 x 16 ou 32 x 32, ocorre um grande ganho na taxa de compressão mas o custo
computacional é muito elevado, o que torna inviável o uso de blocos maiores do que 8 x
8, que é o definido pelo padrão JPEG.
Estudos posteriores, poderiam incluir o uso de uma transformada rápida para o
cálculo da TDC, como por exemplo, o uso da FFT (Fast Fourier Transform)
[MAKHOUL] ou a eliminação das operações de multiplicação, com o uso apenas de
adição e deslocamento [KASPEROVICH]. Também seria importante, um estudo
estatístico mais detalhado sobre uma grande quantidade de imagens (médicas, desenho,
natureza etc.), comparando-se a correlação destas imagens com as taxas de compressão
e variação no tamanho dos blocos.

33
REFERÊNCIAS BIBLIOGRÁFICAS

BAXES, Gregory A. Digital image processing: principles and applications. John


Wiley & Sons, Inc., 1994.

GONZALEZ, R. C. e WOODS, R. E. Digital image processing. Addison-


Wesley, Inc.,93.

KASPEROVICH, L. V. e BABKIN, V. F. Fast Discrete Cosine Transform


Aproximation for JPEG image compression. Computer Analysis of Images
and Patterns, Lec. Notes Computer Science, no 719.

MAKHOUL, J. A Fast Consine Transform in One and Two Dimensions. IEEE


Trans. on Acoustics, Speech and Signal Processing, v. ASSP-28, february
1980.

MATTISON, P. E. Practical Digital Video with Programming examples in C.


John Wiley & Sons Inc, Cap. 5 e 10, 1994.

MENEGUETE, M. e BARBOSA, R. L. Uma Retrospectiva sobre Compressão


de Imagens usando a Transformada Discreta do Cosseno. Revista
Colloquium, a publicar.

MENEGUETTE, M. e SANTOS, A. C. An adaptative combined-transform


coding scheme for image compression. In: Iasted International Conference
Signal and Image Processing, SIP-95, Las Vegas, USA.

NELSON, Mark. The Data Compression Book: Featuring fast, efficient data
compression techniques in C. M&T Books, 1991.

34
PENNEBAKER, W. B. e MITCHELL, J. C. JPEG: still image data
compression standard. Van Nostrand Reinhold, 1993.
REISDORPH, Kent e HENDERSON Ken. Teach Yourself Borland C++
Builder. Sams Publishing, 1997.

SANTOS, Ana Cristina. Uma Técnica por Transformada para Compressão de


Imagens. Dissertação de Mestrado, ICMSC - USP São Carlos, 1994.

TENENBAUM, Aron M., LANGSAM, Yedidyah e AUGENSTEIN, Moshe J.


Estruturas de Dados usando C. Makron Books, 1995.

35

Você também pode gostar