JPEG. Algoritmo de compressão

Olá novamente! Encontrei este artigo, escrito em maio de 2019. Esta é uma continuação de uma série de artigos sobre WAVE e JPEG.Aqui está o 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:


O JPEG (Joint Photographic Experts Group) é um dos populares formatos gráficos de varredura usados ​​para armazenar imagens fotográficas e similares.

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


Quais caminhos vão do raw para o JPEG


Algumas pessoas pensam que as imagens JPEG são dados brutos compactados pelo método Huffman, mas não é assim. Antes de controlar a compactação, os dados são muito úteis.


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 alteração será perceptível.


A primeira coisa que é feita com a imagem é a subamostragem. Isso é fácil de entender: uma matriz de 2x2 pixels é obtida e Cb e Cr são obtidas - os valores médios de cada um dos componentes YCbCr desses 4 pixels. E assim, ganhamos 6 bytes , em vez de 4 Y, 4 Cb, 4 Cr, temos 4 Y e o mesmo Cb e Cr para cada um deles (4 + 4 + 4 = 12; 4 + 1 + 1 = 6; 12 - 6 = 6) Em uma escala de 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 assim - eles caíram metade do tamanho. E podemos usar essa técnica devido à nossa percepção de cores. Uma pessoa notará facilmente uma diferença no brilho, mas não na cor, se for calculada a média de um pequeno bloco de pixels. O afinamento também pode ser realizado em uma linha, 4 pixels na horizontal e na vertical. A primeira opção é usada com mais frequência. Se a qualidade da imagem é importante, o desbaste não é realizado.
Ilustração visual de desbaste (Habr não permitiu inserir um gif) - https://i.ibb.co/Rg5Th9H/150953010617579181.gif


A maior parte da preparação

DCT

Agora a parte mais difícil e necessária. A imagem inteira é dividida em blocos de 8x8 (use preenchimento caso a resolução não seja um múltiplo da lateral do bloco).


Agora, para cada bloco, é aplicada a DCT (Discrete Cosine Transformation) . Nesta parte, todo o excesso é retirado da imagem. Usando o DCT, é necessário entender se esse bloco (8x8) descreve qualquer parte monótona da imagem: céu, parede; ou contém uma estrutura complexa (cabelo, caracteres, etc.). É lógico que 64 pixels em cores semelhantes possam ser descritos em apenas um, porque o tamanho do bloco já é conhecido. Tanta coisa para a compressão: 64 para 1.


O DCT transforma um bloco em um espectro, e onde as leituras mudam abruptamente, o coeficiente se torna positivo e, quanto mais nítida a transição, maior a saída. Onde o coeficiente é maior, a imagem mostra transições nítidas em cores e brilho, onde é menor - alterações fracas (suaves) nos valores dos componentes YCbCr no bloco.


Quantização

Já existem configurações de compactação aplicadas. Cada um dos coeficientes em cada uma das matrizes 8x8 é dividido por um determinado número. Se a qualidade da imagem após todas as modificações não reduzir mais, 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 será arredondado. Então, depois de arredondar frequentemente, resulta muitos zeros.


A quantização é feita para criar ainda mais compactação. Aqui está como está o exemplo da quantização do gráfico y = sin (x):


imagem


Compressão

Primeiro, passamos pela matriz em zig-zag:


imagem


Temos uma matriz unidimensional com números. Vemos que existem muitos zeros, eles podem ser removidos. Para fazer isso, em vez de uma sequência de muitos zeros, inserimos 1 zero e depois um número indicando seu número na sequência. Assim, você pode redefinir para 1/3 do tamanho de toda a matriz. E então simplesmente comprime essa matriz usando o método Huffman e a inserimos no próprio arquivo.


Onde é usado


Em todos os lugares. Como o PNG, o JPEG é usado em câmeras, sistemas operacionais (como logotipos da empresa, ícones de aplicativos, miniaturas) e em todas as áreas possíveis em que você precisa armazenar imagens com eficiência.


Conclusão


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


Fontes

O artigo da Wikipedia sobre YCbCr
Artigo JPEG na Wikipedia
Um pouco sobre o DCT no post de Picabu
Artigo do DCT na Wikipedia

Source: https://habr.com/ru/post/pt482728/


All Articles