terça-feira, 5 de junho de 2007

Uma obra de arte colectiva

Ver antes:

Georges Seurat, La Seine à la Grande-Jatte, 1888

Um rio, um barco, uma árvore... ou muitos, muitos pontos? Os pormenores não são importantes para interpretar o significado de uma imagem. Podemos diminuir a informação dos detalhes em qualquer fotografia e ninguém sentirá a sua falta, mesmo tendo o original ao lado.

Se eu quizesse diminuir os pormenores de uma fotografia provavelmente ia começar por comparar cada ponto com os vizinhos, codificando a diferença em vez do valor absoluto, esbatendo as grandes amplitudes com uma divisão não linear. A ideia não é disparatada, tirando o esbatimento este é um método utilizado nas imagens PNG e JPEG sem perda. Mas o método JPEG com perda foi estudado durante anos e certamente dá melhores resultados.

O método começa por "separar" os detalhes das manchas através da aplicação de uma transformada discreta de cosseno (DCT em inglês) a grupos de pontos. Como resultado, para cada grupo obtemos uma quantidade igual de valores onde o primeiro é proporcional à soma dos originais e os outros dependem da variação existente. Se os valores originais são todos iguais o resultado fica reduzida ao primeiro valor, os restantes são zero.



Em fotografias a variação entre pontos adjacentes é geralmente pequena. Quando aplicamos a DCT a um grupo de pontos o resultado é uma sequência com valores absolutos tendencial­mente decrescentes. Se anularmos os últimos valores da transformada a média dos valores originais não é alterada (manutenção da mancha) e as diferenças são esbatidas (diminuição do detalhe).

A transformada discreta de cosseno foi definida num estudo de N.Ahmed, T.Natarajan e K.R.Rao publicado em 1974. Desde então, e principalmente depois da publicação da especificação JPEG, muitas implementações foram publicadas em revistas, livros, patentes e hardware. Como referência a fórmula que segue funciona nos dois sentidos, isto é, pode ser utilizada para calcular a transformada e recuperar os valores originais:



Nas imagens JPEG a transformada é aplicada a quadrados com 8x8 pontos. Aplicada directa­mente o cálculo seria muito "pesado" e várias simplifi­cações são utilizadas: o processamento é feito primeiro sobre as linhas e depois sobre as colunas, os cossenos são pré-calculados e combinados com a raiz quadrada, as operações são agrupadas para aproveitar cálculos comuns… a biblioteca do Grupo Independente JPEG utiliza um algoritmo de C.Loeffler, A.Ligtenberg e G.S.Moschytz que reduz o cálculo de cada linha / coluna a 11 multiplicações e 29 adições.

A transformada não reduz a quantidade de informação: a quantidade de valores resultado é igual à original. A redução é implementada através da divisão de cada valor numa escala não linear — por exemplo, enquanto os primeiros valores são divididos por 6 os últimos são divididos por 40. Como os últimos valores são geralmente pequenos o resultado típico é meia dúzia de valores significativos, uma dúzia de 1's e uma catrefada de 0's, sequência óptima para o passo seguinte.

Não existe uma redução ideal. Quase todos os programas permitem ajustar a redução, é a chamada "qualidade JPEG". Normalmente a melhor redução está entre 80 e 70, qualidades menores que 60 estragam a fotografia sem ganhos na compressão, já pouco se pode reduzir:
windows bitmap  100%
quality 100 31%
quality 90 12%
quality 80 8%
quality 70 6%
quality 60 5%


qualidade 100, 55K bytes


qualidade 80, 15K bytes


qualidade 40, 7K bytes

A definição e as implementações da transformada directa de cosseno são resultado do contributo de muitos técnicos, com destaque para as publicações do Institute of Electrical and Electronics Engineers (IEEE). É uma obra de arte colectiva.

A diminuição de detalhes não reduz a imagem mas coloca a informação num sequência óptima para o passo seguinte.

A seguir: apertar os bits

Etiquetas:

quinta-feira, 10 de maio de 2007

A importância das cores

Ver antes: compressão jpeg


Os quadrados A e B têm a mesma cor.

Difícil acreditar sem verificar… esta imagem é fabricada, não esperes ilusões como esta em fotografias. Mas é uma boa introdução para a questão: qual é a importância das cores na percepção de imagens?

As cores são importantes para codificação, nos semáforos por exemplo; mas qualquer combinação de cores (verde / amarelo / vermelho) é suficiente, não são necessárias cores específicas — um amigo disse-me uma vez que o verde dos semáforos, para ele, estava mais próximo do azul que do verde. Pouco ou nada sentimos a falta de cores em fotografias antigas, ainda hoje são feitos filmes "a preto e branco" ou "descoloridos". Para o nosso sistema visual a percepção de formas e detalhes é influenciada essencial­mente pela luz e pelos contrastes.

A menor importância das cores na interpretação de imagens foi (e continua a ser) uma característica utilizada para reduzir a quantidade de informação suficiente para o transporte e armazenamento de fotografias e filmes. A televisão analógica utiliza uma pequena parte do espaço (largura de banda) reservado a cada canal para transmitir as cores, em parte porque a cor foi "encaixada" no espaço inicial­mente atribuído. Mas a televisão digital também utiliza menos espaço para as cores que para a luz.

Quando a norma JPEG foi escrita este facto foi, muito provavelmete, tomado em consideração. No entanto não foi definido que as imagens seriam codificadas como luz+cor, ou que existiria redução de cor. A separação entre luz e cor foi definida pela especificação JFIF através da equação que transforma a codificação (espaço de cor) RGB na codificação YCbCr:

Esta equação transforma três cores primárias — vermelho, verde, azul — numa componente [Y] de luz e duas componentes [Cb, Cr] de cor. Repara que o peso da cor verde é preponderante (58,7%) na componente de luz resultante: o olho humano é mais sensível à luz verde que à vermelha ou azul.

A especificação JFIF não quantifica como as duas componentes de cor são reduzidas, apenas define a relação espacial entre as várias componentes caso exista redução. A quantificação foi resultado das implementações, nomeada­mente através da biblioteca código aberto disponibilizada pelo Grupo Independente JPEG. Na prática cada componente de cor é reduzida para 1/4 do tamanho original calculando a média de quatro pontos; este método é tão consensual que rara­mente é colocado como opção nas ferramentas para utilizadores.


Imagem original


Componente luz reduzida, 75% do tamanho original


Componentes cor reduzidas, 50% do tamanho original

Nas imagens anteriores podemos ver o resultado da diminuição da componente luz e da redução das componentes cor. Só uma observação minuciosa consegue detectar diferenças entre a primeira e terceira imagem.

A diminuição de cores permite reduzir a imagem para metade do tamanho original.

notas técnicas:
- a imagem "original" foi guardada como jpeg sem perder cores ou detalhe (apenas tem erros de arredondamento); com o programa IJG o comando é "cjpeg -quality 100 -sample 1x1 -optimize …", com o popular IrfanView as opções são "disable color subsampling" e "quality 100"
- para reduzir luz sem perder detalhe foi utilizado o comando "cjpeg -quality 100 -sample 1x1,2x2,2x2 -optimize …"
- as cores foram reduzidas com "cjpeg -quality 100 -optimize …"; quase todos os programas permitem esta opção com "quality 100"


A seguir:

Etiquetas:

sábado, 5 de maio de 2007

Compressão JPEG

O comité JPEG foi criado em 1986 por dois institutos de standardização, ISO e ITU-T, como um agregado de vários grupos que trabalhavam na apresentação de gráficos com a qualidade de fotografia. O espaço necessário para o armazenamento de imagens e a velocidade de transmissão eram problemas ainda maiores que hoje, e naturalmente o comité JPEG concentrou-se na compressão de dados. Seis anos depois publicou o seu trabalho mais conhecido, o standard ISO 10918-1 / recomendação ITU-T T.81.

Com uma diferença de dois anos o grupo de trabalho MPEG produziu o MPEG-1, standard em que se baseiam o Video CD e MP3. JPEG e MPEG partilham mais que as três letras finais: eles definiram a ideia base que permite a difusão de conteúdos digitais com os equipamentos actuais -- compressão com perda de dados (lossy compression).

Estas são as taxas de compressão conseguidas por formatos bastante utilizados quando comprimi algumas fotografias; sem compressão com perda as coisas seriam mais lentas (ou mais pequenas ou mais feias) na internet:
zip (toda a cor)   ############################# 72%
png toda a cor  ######################### 63%
gif (256 cores)  ######### 23%
png 256 cores    ######## 21%
jpeg qualidade 80  ### 8%

Boa, a partir de agora só vou utilizar JPEG

A compressão com perda não é adequada para todas as imagens. Desenhos com linhas bem definidas ficam com distorções facilmente detectáveis quando comprimidos pelo método JPEG; PNG indexedado (256 cores) é melhor para estes casos. Além disso JPEG não permite transparência ou animação, e é um formato final -- nunca guardes as etapas do teu trabalho como JPEG. Mas se queres colocar fotografias na rede ou enviá-las por correio electrónico, JPEG é o formato indicado.

Como funciona: descrição geral

A especificação JPEG define duas formas para comprimir dados sem afectar a percepção que nós, humanos, temos acerca da imagem: diminuir informação sobre as cores, diminuir informação sobre os detalhes.

Penso que o segundo método é claro: a "visão geral" é suficiente para apanhar o significado de uma imagem, geralmente não reparamos na maior parte dos detalhes; com o método JPEG todos os detalhes são representados mas são codificados com menos dados. Dizer isto é fácil mas fazê-lo é mais difícil e ainda mais difícil é fazê-lo rapidamente; o algoritmo tem que detectar os detalhes genericamente, para qualquer imagem. A especificação JPEG fá-lo com um método elegante e permite que o utilizador controle a perda de detalhe, é isso que define a "qualidade jpeg".

A "diminuição de cores" pode ser menos evidente. A especificação JPEG não a define em pormenor, apenas permite diferentes densidades para cada componente da imagem. Os humanos necessitam três componentes para ver imagens coloridas -- como RGB, CMY ou Lab -- e o método JPEG permite codificar imagens em qualquer espaço com pesos específicos para cada componente. Antes da aprovação da JPEG já Eric Hamilton publicava a especificação JFIF, que definiu um formato para as imagens JPEG utilizando o espaço YCbCr. O tipo image/jpeg designa na realidade os ficheiros JFIF; imagens JPEG são sequências de bits que podem ser incluidas noutros formatos, por exemplo como imagens-chave nos filmes MPEG.

Depois da "diminuição de detalhes", os dados ficam numa forma muito adequada para diminuir a entropia, um método bastante utilizado para comprimir dados sem perder informação (losslessly compression) -- é o que se passa com o formato mais utilizado dos ficheiros zip. A especificação JPEG define em pormenor um passo final para "apertar os bits".

JPEG é Open Source

Uma das decisões do comité JPEG foi manter parte da especificação livre de patentes conhecidas. Para diminuir detalhes foi utilizada a transformada discreta de cosseno. O codificador de entropia guarda cada valor significativo (não zero) através do seu tamanho mínimo em bits, com codificação huffman para sequências de zeros e magnitude dos valores.

Enquanto a especificação JPEG estava a ser aprovada e a JFIF estava a ser escrita, o Grupo Independente JPEG começou a escrever uma biblioteca portável em linguagem C para compressão e descompressão. Esta biblioteca permitiu uma rápida adopção do novo standard e é actualmente utilizada como suporte JPEG por muitos programas.

A seguir:

Etiquetas: