Compressão de Imagens
Compressão de Imagens Geradas por Computador (Gráficos) Armazenamento (e transmissão) como um conjunto de instruções (formato de programa) que geram a imagem Utilização de algum esquema de compressão sem perdas. Imagens Digitalizadas (Fotos) Armazenadas em formato matricial ou bitmap (pixels). Dois métodos de compressão (padronizados) utilizados: Combinação de codificação estatística e por repetição de série (run-length) Compressão sem perdas de documentos digitalizados. Combinação de codificações por transformadas, diferenças e por repetição de série (runlength) Caso genérico. Geradas por modelos matemáticos (fractais) Armazenadas como um conjunto de equações Compressão intrínseca
Padrão GIF Graphics Interchange Format
GIF Permite codificação de imagens com 24 bits por pixel (8 por componente RGB), embora o formato selecione as 256 (das 2 24 ) cores que melhor representam aquelas presentes na imagem. A lista de 256 cores resulta numa tabela de cores, cada entrada contendo um valor de 24 bits de cor.
GIF Cada pixel é codificado com um elemento da tabela (8 bits) ao invés de 24, com uma compressão 3:1. A Tabela de Cores pode ser Global: é utilizada na imagem inteira. Local: é utilizada apenas em parte da imagem. O conteúdo da tabela é enviado pela rede (ou armazenado), junto com informação sobre as dimensões da imagem e os dados referentes aos pixels da imagem propriamente ditos. A codificação LZW pode ser utilizada para maior compressão. A tabela de valores vai sendo dinamicamente estendida à medida que as strings de cores vão aparecendo. Usualmente a tabela começa com 512 posições, 256 das quais contendo as cores selecionadas. Se a tabela estiver cheia, ela pode crescer em incrementos de 1 bit (209 cores, 210 cores, 211 cores, etc.).
GIF
GIF - Entrelaçamento Armazenamento e transmissão da imagem podem ser feitos em modo entrelaçado (interlaced). A imagem a ser transmitida é organizada de modo que a imagem possa ser reconstruída, com qualidade menor, mais rapidamente. Mais níveis de detalhe são acrescentados até que a imagem completa é apresentada. Isso é muito útil para canais de comunicação lentos, pois rapidamente já se recebe um esboço da imagem (o usuário pode cancelar uma transferência de imagem...). A imagem é dividida em quatro grupos, o primeiro com 1/8 da informação da imagem, o segundo com outros 1/8, o terceiro com 1/4 e o último com o 1/2 restante.
Padrão JPEG Joint Photographic Experts Group
JPEG - Introdução O JPEG (Joint Photographic Experts Group) é um padrão desenvolvido em conjunto pela ISO, IEC e ITU-TS (1992) Primeiro padrão internacional de compressão de imagem estáticas (P&B ou em cores). Define vários modos de compressão, um para cada tipo de aplicação considerada. Compressão sem perdas ou com perdas Taxa de compressão dos métodos sem perda (lossless) não é suficiente para compressão vídeo JPEG usa transform coding, que é baseada em 2 observações sobre mudanças no conteúdo e sobre a limitações humanas.
JPEG Obs 1: existe uma mudança relativamente lenta dentro do conteúdo de uma imagem, i.e., é difícil encontrar mudanças bruscas de intensidade em áreas pequenas que compõe a imagem (ex, dentro de um bloco 8x8 de imagem)... No domínio da freqüência: algo como dizer que os componentes de freqüência mais baixa contêm mais informação que os de alta freqüência (detalhes menos importantes e ruídos) Obs 2: Experimentos psicofísicos mostraram que humanos são menos receptivos a perda de componentes de freqüência espacial mais alta do que os de mais baixa...
Visão geral da Codificação JPEG I Preparação da Imagem Processamento da Imagem Quantização Codificação por entropia Construção do Quadro I
Visão geral da Codificação JPEG (2) Fonte: http://www.cs.sfu.ca/coursecentral/365/li/material/notes/
Preparação da Imagem (1) 1) Seleciona-se o tipo de imagem a ser comprimida. 2) Partição da imagem em blocos de 8x8 pixels (permite uma execução mais eficiente do passo seguinte, a DCT ).
Processamento da Imagem (1) Como exemplo seja um dos blocos de 8x8 pixels obtidos na fase anterior 52 55 61 66 70 61 64 73 63 59 66 90 109 85 69 72 62 59 68 113 144 104 66 73 63 58 71 122 154 106 70 69 67 61 68 104 126 88 68 70 79 65 60 70 77 68 58 75 85 71 64 59 55 61 65 83 87 79 69 68 65 76 78 94
Processamento da Imagem (2) A primeira etapa do processamento consiste em deslocar o valor das amostras de 128 (256/2): Na verdade, os valores de pixel devem ser padronizados no intervalo de 128 a +127, já que os valores poderiam estar, anteriormente, entre 0 e 255 (R, G, B, Y) ou entre -128 e +127 (Cr, Cb). O resultado do deslocamento é a seguinte matriz:
Processamento da Imagem (2) A primeira etapa do processamento consiste em deslocar o valor das amostras de 128 (256/2): Na verdade, os valores de pixel devem ser padronizados no intervalo de 128 a +127, já que os valores poderiam -76-73 -67 estar, -62-58 anteriormente, -67-64 -55 entre 0 e 255 (R, G, B, Y) -65 ou -69 entre -62-38 -128-19 e -43 +127-59(Cr, -56 Cb). -66-69 -60-15 16-24 -62-55 O resultado -65 do -70 deslocamento -57-6 26-22 -58-59 é a seguinte matriz: -61-67 -60-24 -2-40 -60-58 -49-63 -68-58 -51-65 -70-53 -43-57 -64-69 -73-67 -63-45 -41-49 -59-60 -63-52 -50-34
Transformada Discreta de Cossenos DCT: Domínio do espaço para o domínio da freqüência DCT F(x,y) F(u,v)
Transformada de Cossenos Direta 7 7 1 x u y v F ( u, v ) = C ( u ) C ( v ) f ( x, y ) cos ( 2 + 1 ) p cos ( 2 + 1 ) p 4 16 16 x = 0 y = 0 1 C ( w ) = para w = 2 0 C ( w ) = 1 para w = 1, 2,..., 7 Inversa 7 7 1 x u y v f ( x, y ) = C ( u ) C ( v ) F ( u, v ) cos ( 2 + 1 ) p cos ( 2 + 1 ) p 4 16 16 u = 0 v = 0
Entendendo a DCT... Todos os 64 valores da matriz de entrada f(x,y) contribuem para cada valor na matriz transformada F(u,v). Para u = v = 0, os termos de cosseno são 1. Como cos(0) =1, o valor em F(0,0) da matriz transformada consiste de nada mais que uma função do somatório dos valores da matriz de entrada P. Mais precisamente, F(0,0) é o valor médio dos 64 valores da matriz e é conhecido como coeficiente DC. Todos os outros valores na matriz são chamados coeficientes AC, já que os mesmos tem um componente de frequência horizontal (u = 1-7, v = 0), vertical (v = 1-7, u = 0) ou ambos (u = 1-7, v = 1-7) relacionados. Para v = 0 (ou u = 0) somente frequências horizontais (verticais) estão presentes com aumento de frequências para u=1-7 (v=1-7). Todas as outras posições (u 0, v 0) contém ambos componen-tes de frequência horizontais e verticais.
64 Funções (8 x 8) DCT de base
Propriedades da DCT Para muitas frequências a DCT resulta num valor nulo ou próximo de 0 Esses valores (ou frequências) podem ser ignorados na codificação : COMPRESSÃO A compressão de uma imagem de 640 480 pixels seria iniciada com a identificação do tipo de imagem, seguida do particionamento dela em blocos de 8 8 pixels. Seriam, portanto, necessários 80 60 blocos (um total de 4800 blocos). Considerando que a imagem ocupa uma tela de 16 (~ 40cm), cada bloco teria, apenas, 5 5mm. As regiões que contêm uma única cor (cores próximas) gerarão matrizes transformadas cujos coeficientes DC tem valores idênticos (ou próximos) e poucos coeficientes AC. As regiões da imagem original que possuem transição de cores seriam as que levariam à criação de matrizes transformadas com coeficientes DC distintos e vários componentes AC.
Aplicando a DCT Depois do deslocamento, aplica-se a DCT obtendo-se a seguinte matriz: -415-29 -62 25 55-20 -1 3 7-21 -62 9 11-7 -6 6-46 8 77-25 -30 10 7-5 -50 13 35-15 -9 6 0 3 11-8 -13-2 -1 1-4 1-10 1 3-3 -1 0 2-1 -4-1 2-1 2-3 1-2 -1-1 -1-2 -1-1 0-1
Quantização da Matriz Após a transformada os valores são quantizados utilizando-se uma matriz de quantização Q : os valores da matriz Q expressam a importância relativa das freqüências Matriz de Quantização Q Matriz Resultante 16 11 10 16 24 40 51 61 12 12 14 19 26 58 60 55 14 13 16 24 40 57 69 56 14 17 22 29 51 87 80 62 18 22 37 56 68 109 403 77 24 35 55 64 81 104 113 92 49 64 78 87 103 121 120 101 72 92 95 98 112 100 103 99-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 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 0 O JPEG define duas tabelas padrão de quantização (uma para matrizes de luminância e outra para componentes de crominância), além de também permitir o uso de tabelas customizadas.
Resultados da Quantização JPEG O cálculo dos valores durante a Quantização envolve arredondamento dos coeficientes resultantes. Os valores na tabela de quantização aumentam à medida que aumenta a freqüência espacial (o olho humano é menos sensível a freqüências espaciais mais elevadas) O Coeficiente DC é o maior valor armazenado. Muitos dos coeficientes de maior freqüência espacial são zerados na matriz depois da Quantização.
JPEG - Codificação por Entropia Algoritmos de codificação por entropia operam sobre um vetor de símbolos. Converter o bloco resultante da DCT + Quantização (matricial) para um vetor unidimensional. Para tirar proveito da matriz de quantizada, uma varredura em zig-zag é utilizada: A vetorização deixa o coeficiente DC (o maior) sendo o 1 o, seguido imediatamente dos coeficientes AC de menor freqüência espacial e no final os de maior freqüência espacial. A maioria dos valores não nulos se concentra no início do vetor, facilitando a compressão!
Vetorização: Ordenação dos coeficientes Blocos de Coeficientes DCT (a) Ordenação zig-zag dos coeficientes (b) Ordenação Alternada dos coeficientes
Resultado da Compressão A transformada e a normalização resultam em um número muito grande de zeros como coeficientes O primeiro elemento do vetor é o coeficiente DC, que representa a cor (luminância/crominância) média do bloco de 8 8 pixels Devido à sua importância, o coeficiente DC é mantido com a maior resolução possível durante a quantização Usando a seqüência zig-zag, o resultado da linearização do bloco anterior é o vetor unidimensional: [-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]
Codificação por Entropia Por causa das pequenas dimensões de um bloco, os coeficientes DC de blocos vizinhos variam pouco de um para outro (imagine uma foto do mar...): Codificação por Diferença Cada coeficiente é codificado como uma diferença para o anterior O primeiro DC é codificado em relação a zero! Em geral, o no. de bits para representar a diferença é menor. Para os demais 63 valores do vetor (que contém uma grande sequência de zeros): Codificação por Repetição de Série (run-length)
Codificação por Diferença Os valores de diferenças são codificados no formato (SSS, value), onde SSS representa o no. de bits necessários para armazenar o valor e value é a representação do valor naquele no. de bits. Valores positivos são codificados usando o formato sem sinal (unsigned) e valores negativos são codificados como complemento Zero é codificado com um único bit zero no campo SSS.
Codificação por Repetição de Série Os demais 63 valores do resultado da vetorização da matriz quantizada são codificados como uma string de pares de valores (skip, value),onde skip representa o número de zeros na seqüência e value é o próximo coeficiente não zero. (0,6)(0,7)(0,3)(0,3)(0,3)(0,2)(0,2)(0,2)(0,2)(0,0) A seqüência (0,0) indica que todos os demais valores no vetor são nulos. O campo value é codificado no formato (SSS, value) anterior. Por causa do grande uso de codificação com palavras de tamanho variável, a etapa de codificação por entropia de JPEG também é conhecida como etapa variable-lenght coding (VLC).
Codificação de Huffman Codificação de Huffman é utilizada em seguida para codificar o resultado da codificações diferencial e por repetição de série. Os bits do campo SSS são enviados como códigos de Huffman, o que permite que o receptor identifique os códigos sem ambigüidade (princípio do prefixo da codificação de Huffman). Ambos os components skip e SSS são codificados por Huffman ou por uma tabela customizada que é armazenada (enviada) no formato JPEG. Para permitir o decodificador diferenciar os códigos skip e SSS cada um é codificado separadamente e o par resultante é então substituído por um código de Huffman equivalente (ver tabela).
Codificação de Huffman Codificação de Huffman é utilizada em seguida para codificar o resultado da codificações diferencial e por repetição de série. Os bits do campo SSS são enviados como códigos de Huffman, o que permite que o receptor identifique os códigos sem ambigüidade (princípio do prefixo da codificação de Huffman). Ambos os components skip e SSS são codificados por Huffman ou por uma tabela customizada que é armazenada (enviada) no formato JPEG. Para permitir o decodificador diferenciar os códigos skip e SSS cada um é codificado separadamente e o par resultante é então substituído por um código de Huffman equivalente (ver tabela).
JPEG - Construção de Quadro A etapa de construção de quadro consiste em encapsular os dados resultantes das etapas anteriores de modo que possam ser tratados por um decodificador. O formato hierárquico resultante é composto por camadas, cada uma com seus cabeçalhos próprios e demais campos: Nível 1 (Frame), cujo cabeçalho define: Largura e comprimento da imagem. Número e tipo de componentes que formam a imagem (RGB, YCrCb, etc.). Tipo de digitalização utilizada (4:2:2, 4:2:0, etc.). Nível 2 (Scan), cujo cabeçalho define: Identidade do componente (R, G, B, etc.). Número de bits utilizado para codificar cada componente. Tabelas de quantização utilizadas na codificação de cada componente. Nível 3 (Segment) : O cabeçalho define as Tabelas de Códigos de Huffman utilizadas para codificar cada componente, caso as tabelas padrão não sejam utilizadas. Um segmento é composto de um grupo de blocos.
Quadros JPEG
Decodificação JPEG
Decodificação/Descompressão JPEG O procedimento é exatamente o inverso, isto é: 1. O Decodificador de Quadros identifica o conjunto de dados e as tabelas incluídas no quadro. 2. O conjunto de dados passa então pelo decodificador de Huffman, que gera os coeficientes DC e AC de cada bloco. 3. Os coeficientes passam pelos decodificadores diferenciais (DCs) ou de repetição de série (ACs). 4. O bloco 2D é reconstituído a partir do vetor 1D quantificado. 5. O bloco é desnormalizado utilizando a matriz de quantização. 6. Aplica-se a DCT Inversa (vista anteriormente...). 7. Finalmente, o construtor de imagens gera a imagem original a partir dos blocos gerados, utilizando a informação de controle recebida pelo decodificador de frames.
JPEG: Considerações Finais Embora o JPEG seja relativamente complicado por conta do número de etapas envolvidas, níveis de compressão de mais de 20:1 são alcançados com boa qualidade de imagem. Tal nível de compressão, no entanto, se aplica a imagens relativamente simples (poucas transições de cor). Níveis de compressão da ordem de 10:1 são mais comuns para imagens típicas. Como em GIFs, pode-se também codificar uma imagem JPEG em modo progressivo (envio de uma versão simplificada da imagem, seguida de níveis de detalhes), útil para transmissões na Internet. Metodologias de transmissão progressiva incluem: Modo progressivo: primeiro são transmitidos os coeficientes DC e componentes de baixa frequência dos blocos, seguidos dos coeficientes de maior frequência. Modo hierárquico: A imagem é enviada com uma resolução menor (ex. 320x240), seguida de maior resolução (ex. 640x480),...
JPEG Atual JPEG 2000: Padrão mais recente do JPEG (Jul/2000) Ver status atual em http://www.jpeg.org/jpeg2000/ Maior mudança: uso de transformadas de Wavelets no lugar da DCT na codificação Objetivos propostos: Melhoria de desempenho de compressão: reduzir taxas Codificação com perda e sem perdas (lossless e lossy) numa mesma stream Robustez: transmissão em ambientes ruidosos com taxas de erro elevadas Aplicação para imagens coloridas e em tons de cinza, imagens com texto, imagens reais e imagens geradas por computador Interface com MPEG-4, Descrição baseada no conteúdo (semântica)
JPG, GIF, PNG-8 & PNG-24 8-colour GIF (1292 bytes) 64-colour GIF (2940 bytes) 16-colour PNG-8 (6481 bytes Full-colour PNG-24 (34377 bytes) Low-quality JPEG (4089 bytes) High-quality JPEG (17465 bytes)
8-colour GIF (1292 bytes)
64-colour GIF (2940 bytes)
16-colour PNG-8 (6481 bytes)
Full-colour PNG-24 (34377 bytes)
Low-quality JPEG (4089 bytes)
High-quality JPEG (17465 bytes)
GIF x JPG GIF é melhor para tratar bordas (cantos) (imagens sintéticas) GIF 4 cores 2.3Kbytes JPG 256 cores 7.14Kbytes
GIF x JPG JPG é melhor para mudanças suaves (foto-realismo) GIF 11.229 bytes 256-color Dithered JPEG 2.583 bytes 16.8M-color PSP Compression: 40