# JPEG

JPG (ou JPEG) é um método comum usado para comprimir imagens fotográficas. O grau de redução pode ser ajustado, o que permite a você escolher o tamanho de armazenamento e seu nível de compromisso com a qualidade da imagem. Geralmente se obtém uma compressão pouco perceptível na perda de qualidade da imagem.
Além de ser um método de compressão, é frequentemente considerado como um formato de arquivo. JPEG / Exif é o formato de imagem mais comum usado por câmeras digitais e outros dispositivos de captura de imagem, juntamente de JPEG / JFIF, que também é um outro formato para o armazenamento e transmissão de imagens na World Wide Web. JPEG / JFIF é o formato usado para armazenar fotos e transmiti-las através da Internet. Geralmente desconsideram-se os formatos e dizemos simplesmente JPEG.
A sigla vem do nome "Joint Photographic Experts Group", que é o grupo responsável pelo padrão JPEG.

## Funcionamento

O algoritmo de compactação JPEG funciona melhor em fotografias e pinturas de cenas realistas com variações suaves de tom e cor. Para uso na web, onde a largura de banda utilizada por uma imagem é importante, JPEG é muito popular. JPEG / Exif também é o formato mais comum gravado por câmeras digitais.
Por outro lado, JPEG não é tão adequado para desenhos e gráficos textuais ou icônicos, onde o forte contraste entre os pixels adjacentes causa alterações perceptíveis na imagem, fazendo com que esta perca qualidade gráfica. Tais tipos de imagem são melhor guardados em um formato gráfico sem perda (lossless), como TIFF, PNG ou uma imagem do tipo RAW.
JPEG também não é adequado a arquivos que vão sofrer múltiplas edições, à medida que alguma qualidade de imagem geralmente se perde cada vez que a imagem é descompactada e recompactada — especialmente se a imagem é cortada ou redimensionada, ou se os parâmetros codificação são alterados. Para evitar isto, uma imagem que está a ser alterada ou que poderá ser alterada no futuro pode ser salva em um formato sem perdas como o PNG, e uma cópia exportada como JPEG para distribuição.
Como JPEG é um método com perdas na compressão (lossy), que removem informações de imagem, não deve ser usado em astronomia ou imagiologia médica ou para outros fins onde a exata reprodução dos dados seja necessária. Formatos sem perda como PNG devem ser utilizados no lugar.

## Tipos de JPEG

Essa metodologia foi implementada com dois modos básicos: o método de compressão com perdas, que utiliza um algoritmo baseado na DCT e o método de compressão sem perdas, que se baseia em métodos preditivos. Existem no total 44 variações do método de compressão JPEG, sendo que algumas destas são utilizadas em aplicações especificas tais como aplicações médicas, imagens astronômicas entre outras. Devido a esta quantidade de variações dificilmente será encontrado um software que processe todas. Podemos dividir todas estas variações do método de compressão JPEG em quatro grandes grupos, como segue:
* Baseline / Sequencial Encoding: os componentes da imagem são compactados de forma seqüencial da esquerda para a direita e de cima para baixo.
* Progressive Encoding: a imagem é compactada em um processo de múltiplas linhas de varredura. Esta forma é geralmente utilizada em arquivos que são transmitidos pela Internet, pois possibilita a visualização da imagem inteira, em menor resolução, enquanto o restante da imagem está sendo enviada.
* Lossless: neste método não ocorre perda na qualidade da imagem. Existem duas variações: o original, que foi normalizado em 1992, e o novo método JPEG-LS, que deverá deixar obsoleto o formato JPEG “lossless” original.
* Hierarchical Encoding: outro formato utilizado na Internet. Neste formato a imagem é comprimida em múltiplas resoluções (vários tamanhos), sendo que a de menor resolução (menor tamanho) é codificada e transmitida primeiro e na seqüência são compactadas e transmitidas as de melhores resoluções (as de maiores tamanhos) (CONCOLATO,2000) em ordem crescente de tamanho, e por fim é enviada a imagem completa em seu tamanho original. Os elementos de imagem das resoluções já recebidas são utilizados na próxima resolução, diminuindo desta forma o tamanho do arquivo.
Com exceção do tipo “lossless”, todas as variantes apresentam perda de qualidade da imagem, sendo que esta perda é função da taxa de compressão .
Um grupo de especialistas, denominados “Independente JPEG Group”, desenvolveu um parâmetro denominado “Índice de Qualidade (IQ)”, que varia de “1” (pior qualidade e maior taxa de compressão) a “100”. Estes índices influenciam as tabelas de quantização, que serão vistas a seguir. Com a alteração destas tabelas de quantização, varia-se a taxa de compressão e a qualidade da imagem.
Normalmente com uma taxa de compressão 20:1 já é possível perceber pequenas perdas de qualidade da imagem. Uma taxa de compressão de 100:1 produz uma imagem de baixa qualidade.

## Algoritmo
### Aquisição de Imagem

Uma imagem digital pode ser capturada através de scanners, câmeras digitais ou câmeras analógicas ligadas ao computador através de placas digitalizadoras. A câmera digital e o “scanner” contêm sensores que captam a luz emitida ou refletida dos objetos, e a decompõe nos seus componentes fundamentais: vermelho (R), verde (G) e azul (B).
A imagem capturada é bidimensional e pode ser dividida em seus componentes fundamentais, que chamaremos de “Pixels". “Pixel” é o menor componente de uma imagem digital. Sua representação é a de um ponto, porém, com um tamanho definido, ou seja, não é o conceito matemático de ponto com tamanho nulo. Este ponto eventualmente pode ter um formato quadrado, e é composto pelos componentes fundamentais: vermelho, verde e azul (RGB) (ALBUQUERQUE, 2000).
Estes pixels são enviados para um conversor analógico / digital, e quantizados, ou seja, os valores dos componentes fundamentais RGB, que teoricamente poderiam variar de zero ao infinito, são convertidos para poucos valores inteiros, próximos de 256, o que possibilita guardar a representação de cada componente em apenas oito bits.
Numa segunda etapa estes componentes RGB são convertidos para componentes de luminância (“Y”) e crominância (“U” e ”V”). A luminância é uma escala de representação numérica do cinza, enquanto a crominância são duas escalas numéricas, que juntas representam as cores. A escala de luminância, por convenção (ITU-R 601), é quantizada com valores entre “16” e “235”, sendo que, o valor “16” representa o negro absoluto e o valor “235” representa o branco absoluto. As duas escalas de crominância contém valores que variam entre “16” e “240” (com 128 como valor central). Os valores não utilizados, dos “256” possíveis, servem como códigos de controle (MELO,1999).
As matrizes de conversão entre os componentes “RGB” e os componentes “YUV” para o sistema PAL (Phase Alternate Line sistema de TV a cores utilizado na Europa, Brasil e Argentina) são:
${\begin{bmatrix}Y\\U\\V\end{bmatrix}}\approx {\begin{bmatrix}0.2990&0.5870&0.1140\\-0.1687&-0.3313&0.5000\\0.5000&-0.4187&-0.0813\end{bmatrix}}*{\begin{bmatrix}R\\G\\B\end{bmatrix}}$
${\begin{bmatrix}R\\G\\B\end{bmatrix}}\approx {\begin{bmatrix}1,00000&0,00000&1,40200\\1,00000&-0,34414&-0,71414\\1,00000&1,77200&0,00000\end{bmatrix}}*{\begin{bmatrix}Y\\U\\V\end{bmatrix}}$
Estas matrizes de conversão se alteram em função do sistema de aquisição de imagem (NTSC – SECAM etc). Para o sistema NTSC os índices do vetor de luminância (“Y”) não se alteram, mas os vetores de crominância se alteram e recebem outra denominação (“I” e “Q”).

### Preparação dos Blocos

Após a aquisição e a conversão analógica / digital, as matrizes de crominância são reduzidas na taxa de 2:1 horizontalmente (cada duas linhas é convertida em uma), e 1:1 ou 2:1 verticalmente (cada duas colunas são convertidas em uma).
Estas conversões são chamadas “2h1v sampling” e “2h2v sampling”.
A matriz de luminância não é reduzida, pois o olho humano é mais sensível à luminância (tonalidade de cinza) do que à crominância (tonalidades das cores), o que permite maior taxa de perda de crominância sem que esta perda seja percebida pelo espectador (Li, Ze-Nian; Zhong, Willian; 2000).
Nesta etapa as informações do quadro são compactadas em duas ou três vezes (a matriz de luminância permanece com o mesmo tamanho, e as duas de crominância diminuem para um quarto ou para a metade de seu tamanho original)

### Transformada Discreta do Cosseno

O algoritmo de compressão JPEG divide a matriz de luminância e as duas matrizes de crominância, que são as três matrizes que descrevem a imagem, em inúmeras matrizes, cada uma com o tamanho de 8 x 8 elementos. Com isto teremos varias matrizes compostas de 64 elementos, conhecidas como “sample values”. Sobre estas matrizes é aplicado o algoritmo DCT (Transformada discreta de cosseno), gerando outras matrizes, denominadas “Coeficientes de DCT”, cuja maioria dos elementos tem valor igual a zero.
Esse processo translada a informação do domínio do espaço para o domínio da freqüência.
A Transformada Discreta de Cosseno converte uma matriz de valores altamente correlacionados, e com uma distribuição de probabilidade uniforme, em um conjunto de valores menos correlacionados e com uma distribuição de probabilidade não uniforme. Em outras palavras, este algoritmo converte uma matriz numérica em outra, sendo que, a maior parte dos elementos desta nova matriz, especificamente os do canto inferior direito, tem valor igual a zero.
O valor médio da matriz, que representa a cor fundamental dos 64 pixels, é chamado de componente DC (“Direct Current” – Corrente Direta), e está localizado no canto superior esquerdo da matriz de Coeficientes de DCT. Os outros coeficientes são denominados coeficientes AC (“Alternating Current” – Corrente Alternada) e representam os valores das pequenas variações de tonalidade e coloração do bloco.
A DCT, em termos de compressão, gera uma compactação equivalente ao da Transformada Discreta de Fourier (FFT). No entanto, no processo inverso, ao se aplicar a antitransformada da DCT consegue-se uma aproximação melhor dos coeficientes originais do que a antitransformada da FFT.
A transformada Discreta de Cosseno para matrizes de duas dimensões e tamanho de 8 x 8 pode ser expressa pela seguinte equação F(u, v) =(1/4)C(u)C(v) $\sum _{i=0}^{N}$ $\sum _{j=0}^{N}$f(i,j)cos ((2i+1) u $\pi$/16) cos ((2j+1) v $\pi$/16)
Onde: F(u, v) = coeficiente no domínio da transformada
u = eixo horizontal no domínio da transformada
v = eixo vertical no domínio da transformada
C(x) = 1 / ${\sqrt[{2}]{2}}$ para x = 0
C(x) = 1 para x $\neq$ 0
x = u ou v
f(i, j) = amplitude no domínio do tempo
i = eixo horizontal no domínio do tempo
j = eixo vertical no domínio do tempo

### Quantização

Somente a aplicação da DCT resulta em pouca ou quase nenhuma compactação, pois a matriz resultante terá o mesmo tamanho que a original, e poucos coeficientes terão valor zero. A maioria destes coeficientes tem valores próximos de zero. A compactação virá a partir da aplicação do processo denominado Quantização. Neste processo de compressão os elementos menos importantes da matriz de coeficientes DCT serão descartados. A matriz de coeficientes DCT é dividida por outra matriz (chamada de tabela de quantização), que transforma todos os elementos em uma nova matriz. Este processo irá acentuar as características da matriz de Coeficientes de DCT forçando todos os elementos a aproximarem-se do valor zero. No fundo, cria-se um nova tabela, com o resultado inteiro (arredondado à unidade) da divisão dos valores na matriz de coeficientes DCT pelos valores da tabela de quantização. Assim, com a divisão de valores mais próximos do zero, o resultado será o zero absoluto. É neste processo que se introduz a perda de qualidade na compressão JPEG, uma vez que é a única fase irreversível no processo. Tendo apenas os valores arredondados, aquando da descompressão, ao multiplica-los novamente pelos valores da tabela de quantização, darão resultados de valores diferentes dos originais.

### Leitura em Zig Zag

Esta matriz de valores quantizados é lida em zig zag da esquerda para direita e de cima para baixo, fazendo com que os primeiros elementos lidos sejam valores não zerados. Ignora-se a leitura a partir do momento em que se encontram elementos com valores zerados

### Codificação de Entropia

Após a leitura em zig zag os coeficientes serão reorganizados para possibilitar uma nova compressão chamada de codificação de entropia. Esta codificação pode utilizar os algoritmos de Huffman ou a codificação aritmética. Estes algoritmos são do tipo “lossless”, ou seja, não introduzem erros nas informações, logo esta nova compressão não afetará a qualidade da imagem. Esta compressão baseia-se em características estatísticas, ou seja, as informações que são estatisticamente mais comuns de ocorrerem são codificadas com código de tamanho menor, resultando em menores taxas de transmissão. Este principio foi utilizado no telégrafo. No código Morse as letras mais utilizadas do alfabeto Inglês foram codificadas com menores quantidades de símbolos. Para a letra “E” adotou-se “.” enquanto para a letra “Q” adotou-se “- - . -“

### Montagem do arquivo

Finalmente são adicionados os headers e trailers de controle no arquivo, com todos os parâmetros e tabelas a serem utilizadas na descompressão. Dentre as tabelas que serão incluídas no arquivo estão as de quantização e a de Huffman.