JPEG. Algoritmo de compressão

Olá novamente! Encontrei este artigo, escrito em maio de 2019. Este é um continuação da série de artigos sobre WAVE e JPEG, Aqui primeiro. Esta publicação incluirá informações sobre o algoritmo de codificação de imagens e sobre o formato em si.

Uma pitada de história

Uma colherada de artigo da Wikipédia:

JPEG (Joint Photographic Experts Group) é um dos formatos gráficos rasterizados mais populares, utilizado para armazenar fotos e imagens semelhantes.

Esse padrão foi desenvolvido pelo Grupo Conjunto de Especialistas em Fotografia ainda em 1991, para compressão eficiente de imagens.

Qual é o caminho que as imagens percorrem desde a forma bruta até o JPEG

Alguns acreditam que as imagens JPEG são dados brutos comprimidos pelo método Huffman, mas não é bem assim. Antes da compressão, os dados passam por um longo caminho.

Primeiro, o modelo de cores é alterado de RGB para YCbCr. Para isso, existe até mesmo um algoritmo especial — aqui. O Y não é tocado, pois é responsável pela luminosidade, e sua alteração será percebida.

A primeira coisa que se faz com a imagem é «subamostragem» (subsampling). É fácil de entender: pega-se uma matriz de pixels 2x2, em seguida, pegam-se Cb e Cr — os valores médios de cada um dos componentes YCbCr desses 4 pixels. Assim, ganhamos 6 bytes, ao invés de 4 Y, 4 Cb, 4 Cr, obtivemos 4 Y e iguais para cada um deles Cb e Cr (4 + 4 + 4 = 12; 4 + 1 + 1 = 6; 12 — 6 = 6). Em uma escala de 2×2, uma compressão com perda com uma taxa de compressão de 2:1 soa sólida. Isso se aplica a toda a imagem. Portanto, reduzimos pela metade o tamanho. E essa técnica pode ser utilizada devido à nossa percepção de cores. Um ser humano percebe facilmente a diferença de luminosidade, mas não a de cor, se ela for média em um pequeno bloco de pixels. A subamostragem também pode ser feita em linha, 4 pixels na horizontal e na vertical. O primeiro método é mais comumente utilizado. Se a qualidade da imagem for importante, a subamostragem não é feita de forma alguma.
Uma ilustração clara da subamostragem (Habr não permitiu inserir o gif) — https://i.ibb.co/Rg5Th9H/150953010617579181.gif

A parte principal da preparação

DCT

Agora a parte mais complicada e necessária. Toda a imagem é dividida em blocos de 8x8 (usa-se preenchimento caso a resolução não seja múltipla do lado do bloco).

Agora, aplica-se DCT (Transformada Discreta de Cosseno) a cada bloco.. Nesta parte, tudo o que é excessivo é removido da imagem. Usando a DCT, é necessário entender se este bloco (8×8) descreve alguma parte monótona da imagem: céu, parede; ou contém uma estrutura complexa (cabelos, símbolos, etc.). É lógico que 64 pixels semelhantes em cor podem ser descritos por apenas 1, já que o tamanho do bloco é conhecido. Aqui está a compressão: 64 para 1.

A DCT transforma o bloco em um espectro, e onde os valores mudam abruptamente, o coeficiente se torna positivo, e quanto mais brusca a transição, maior será a saída. Onde o coeficiente é mais alto, a imagem apresenta transições nítidas em cor e luminosidade; onde é mais baixo, mudanças suaves nas magnitudes dos componentes YCbCr no bloco.

Quantização

Aqui já são aplicadas as configurações de compressão. Cada um dos coeficientes em cada uma das matrizes 8×8 é dividido por um número específico. Se a qualidade da imagem após todas as suas modificações não for mais reduzida, o divisor deve ser um. Se a memória ocupada por esta foto for mais importante para você, o divisor será maior que 1, e o quociente é arredondado. Assim, depois do arredondamento, muitas vezes resultam em muitos zeros.

A quantização é feita para permitir uma compressão ainda maior. Aqui está como fica com a quantização do gráfico y = sin(x):

JPEG. Algoritmo de compressão

Compressão

Primeiro, passamos pela matriz em zigue-zague:

JPEG. Algoritmo de compressão

Obtemos um array unidimensional com números. Vemos que há muitos zeros nele, que podem ser removidos. Para isso, em vez de uma sequência de muitos zeros, escrevemos 1 zero e, depois dele, o número que indica a quantidade na sequência. Assim, pode-se reduzir até 1/3 do tamanho total do array. E então, esse array é simplesmente comprimido pelo método de Huffman e inserido no próprio arquivo.

Onde é utilizado

Em toda parte. Assim como o PNG, o JPEG é usado em câmeras, sistemas operacionais (como logotipos de empresas, ícones de aplicativos, miniaturas) e em todas as áreas onde é necessário armazenar imagens de forma eficiente.

Saída

Atualmente, o conhecimento sobre JPEG é valioso apenas para fins educacionais, pois já está embutido e otimizado em muitos lugares por grandes grupos de pessoas, mas a pedra da ciência ainda é atraente.

Fontes

Artigo sobre YCbCr na Wikipedia
Artigo sobre JPEG na Wikipedia
Um pouco sobre DCT de um post no Pikabu
Artigo sobre DCT na Wikipedia

Fonte: habr.com

Compre hospedagem confiável para sites com proteção contra DDoS, servidores VPS VDS 🔥 Compre hospedagem confiável para sites com proteção contra DDoS, servidores VPS VDS | ProHoster