JPEG.webp. Algoritmo de compressão

Olá de novo! Encontrei este artigo escrito em maio de 2019. Esta é uma continuação de uma série de artigos sobre WAVE e JPEG, aqui primeiro. Esta publicação incluirá informações sobre o algoritmo de codificação de imagem e o próprio formato como um todo.

Uma pitada de história

Uma colher de sopa de artigo da Wikipedia:

JPEG (Joint Photographic Experts Group) é um dos formatos gráficos raster populares usados ​​para armazenar fotografias e imagens semelhantes.

Este padrão foi desenvolvido pelo Joint Photographic Experts Group em 1991 para compactação eficiente de imagens.

Como as imagens passam de raw para JPEG?

Algumas pessoas pensam que as imagens JPEG são dados brutos compactados usando o método Huffman, mas isso não é verdade. Antes da compactação de controle, os dados percorrem um longo caminho.

Primeiro, o modelo de cores é alterado de RGB para YCbCr. Existe até um algoritmo especial para isso - aqui. Y não é tocado, pois é responsável pelo brilho, e sua mudança será perceptível.

A primeira coisa a fazer com a imagem é "desbaste" (subamostragem). É fácil de entender: uma matriz 2x2 de pixels é obtida e, em seguida, Cb e Cr são obtidos - os valores médios de cada um dos componentes YCbCr desses 4 pixels. Então, ganhamos 6 bytes, em vez de 4 Y, 4 Cb, 4 Cr obtivemos 4 Y e os mesmos Cb e Cr para cada um deles (4 + 4 + 4 = 12; 4 + 1 + 1 = 6; 12 - 6 = 6). Mesmo na escala 2x2, a compactação com perdas com uma taxa de compactação de 2:1 parece sólida. Isso se aplica a toda a imagem. E então - eles caíram pela metade. E podemos usar essa técnica graças à nossa percepção de cores. Uma pessoa notará facilmente uma diferença no brilho, mas não na cor, se a média for calculada sobre um pequeno bloco de pixels. O desbaste também pode ser feito em linha, 4 pixels na horizontal e na vertical. A primeira opção é usada com mais frequência. Se a qualidade da imagem for importante, a dizimação não será realizada.
Uma ilustração visual do desbaste (Habr não me permitiu inserir um gif) - https://i.ibb.co/Rg5Th9H/150953010617579181.gif

A parte principal da preparação

Preparação

Agora vem a parte mais difícil e necessária. A imagem inteira é dividida em blocos de 8x8 (o preenchimento é usado se a resolução não for um múltiplo do lado do bloco).

Agora aplique a cada bloco DCT (transformada discreta de cosseno). Nesta parte, tudo o que é desnecessário é retirado de cena. Usando o DCT, você precisa entender se um determinado bloco (8×8) descreve alguma parte monótona da imagem: o céu, a parede; ou contém estrutura complexa (cabelos, símbolos, etc.). É lógico que 64 pixels de cor semelhante possam ser descritos por apenas 1, porque o tamanho do bloco já é conhecido. Tanto para a compressão: 64 para 1.

DCT transforma o bloco em um espectro, e onde as leituras mudam bruscamente, o coeficiente torna-se positivo, e quanto mais nítida for a transição, maior será a saída. Onde o coeficiente é maior, a imagem mostra transições claras de cor e brilho, onde é menor - mudanças fracas (suaves) nos valores dos componentes YCbCr no bloco.

Quantização

As configurações de compactação já estão aplicadas aqui. Cada um dos coeficientes em cada uma das matrizes 8x8 é dividido por um certo número. Se você não reduzir a qualidade da imagem após todas as suas modificações, o divisor deverá ser um. Se a memória ocupada por esta foto for mais importante para você, o divisor será maior que 1 e o quociente será arredondado. Acontece que depois de arredondar você geralmente acaba com muitos zeros.

A quantização é feita para criar a possibilidade de uma compressão ainda maior. Aqui está o que parece usando o exemplo de quantização do gráfico y = sin(x):

JPEG.webp. Algoritmo de compressão

compressão

Primeiro percorremos a matriz em zigue-zague:

JPEG.webp. Algoritmo de compressão

Obtemos uma matriz unidimensional com números. Vemos que tem muitos zeros, eles podem ser removidos. Para fazer isso, em vez de uma sequência de muitos zeros, inserimos 1 zero e depois dele um número indicando seu número na sequência. Dessa forma, você pode redefinir para 1/3 do tamanho de todo o array. E então simplesmente compactamos esse array usando o método Huffman e o escrevemos no próprio arquivo.

Onde usar

Em todos os lugares. 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 possíveis onde as imagens precisam ser armazenadas com eficiência.

Jogar aviator online grátis: hack aviator funciona

No momento, o conhecimento sobre JPEG é valioso apenas para fins educacionais, porque já está integrado em todos os lugares e otimizado por grandes grupos de pessoas, mas o granito da ciência ainda é saboroso.

fontes

Artigo sobre YCbCr na Wikipedia
Artigo da Wikipédia sobre JPEG
Um pouco sobre PrEP no post Pikabu
Artigo da Wikipédia sobre PrEP

Fonte: habr.com

Adicionar um comentário