JPEG. Algoritmo de compresión

Olá outra vez! Atopei este artigo escrito en maio de 2019. Esta é a continuación dunha serie de artigos sobre WAVE e JPEG, aquí primeiro. Esta publicación incluirá información sobre o algoritmo de codificación de imaxes e o propio formato no seu conxunto.

Un chisco de historia

Unha cullerada de artigo da Wikipedia:

JPEG (Joint Photographic Experts Group) é un dos formatos de gráficos raster populares usados ​​para almacenar fotografías e imaxes similares.

Este estándar foi desenvolvido polo Joint Photographic Experts Group en 1991 para unha compresión de imaxe eficiente.

Como pasan as imaxes de raw a JPEG?

Algunhas persoas pensan que as imaxes JPEG son datos en bruto comprimidos mediante o método Huffman, pero isto non é certo. Antes da compresión de control, os datos percorren un longo camiño.

En primeiro lugar, o modelo de cor cámbiase de RGB a YCbCr. Incluso hai un algoritmo especial para isto - aquí. Y non se toca, xa que é responsable do brillo, e o seu cambio será perceptible.

O primeiro que hai que facer coa imaxe é "adelgazamento" (submostraxe). É doado de entender: tómase unha matriz de píxeles de 2x2, despois tómanse Cb e Cr: os valores medios de cada un dos compoñentes YCbCr destes 4 píxeles. Entón, gañamos 6 bytes, en lugar de 4 Y, 4 Cb, 4 Cr obtemos 4 Y e os mesmos Cb e Cr para cada un deles (4 + 4 + 4 = 12; 4 + 1 + 1 = 6; 12 - 6 = 6). Incluso a escala 2x2, a compresión con perdas cunha relación de compresión de 2:1 soa sólida. Isto aplícase a toda a imaxe. E así - caeron a metade do tamaño. E podemos utilizar esta técnica grazas á nosa percepción da cor. Unha persoa notará facilmente unha diferenza de brillo, pero non de cor, se se fai unha media sobre un pequeno bloque de píxeles. O adelgazamento tamén se pode facer en liña, 4 píxeles horizontal e vertical. A primeira opción úsase con máis frecuencia. Se a calidade da imaxe é importante, a decimación non se realiza en absoluto.
Unha ilustración visual do adelgazamento (Habr non me permitiu inserir un gif) - https://i.ibb.co/Rg5Th9H/150953010617579181.gif

A parte principal da preparación

Dkp

Agora vén a parte máis difícil e necesaria. Toda a imaxe divídese en bloques de 8x8 (utilízase o recheo se a resolución non é múltiplo do lado do bloque).

Agora aplícase a cada bloque DCT (Transformación coseno discreta). Nesta parte, todo o innecesario sácase da imaxe. Usando DCT, cómpre comprender se un determinado bloque (8×8) describe algunha parte monótona da imaxe: o ceo, a parede; ou contén estrutura complexa (pelo, símbolos, etc.). É lóxico que 64 píxeles de cor semellante poidan ser descritos por só 1, porque xa se coñece o tamaño do bloque. Tanto para a compresión: 64 a 1.

DCT converte o bloque nun espectro e, cando as lecturas cambian bruscamente, o coeficiente faise positivo e canto máis nítida sexa a transición, maior será a saída. Cando o coeficiente é maior, a imaxe mostra transicións claras de cor e brillo, onde é menor: cambios débiles (suave) nos valores dos compoñentes YCbCr do bloque.

Cuantización

A configuración de compresión xa está aplicada aquí. Cada un dos coeficientes de cada unha das matrices 8x8 divídese por un número determinado. Se non reduces a calidade da imaxe despois de todas as súas modificacións, entón o divisor debería ser un. Se a memoria que ocupa esta foto é máis importante para ti, entón o divisor será maior que 1 e o cociente será redondeado. Resulta que despois de redondear moitas veces acabas con moitos ceros.

A cuantificación faise para crear a posibilidade dunha compresión aínda maior. Aquí tes como se ve usando o exemplo de cuantificación da gráfica y = sen(x):

JPEG. Algoritmo de compresión

Compresión

Primeiro pasamos pola matriz en zig-zag:

JPEG. Algoritmo de compresión

Obtemos unha matriz unidimensional con números. Vemos que hai moitos ceros nel, pódense eliminar. Para iso, en lugar dunha secuencia de moitos ceros, introducimos 1 cero e despois un número que indica o seu número na secuencia. Deste xeito, pode restablecer a 1/3 do tamaño de toda a matriz. E entón simplemente comprimimos esta matriz usando o método Huffman e escribimos no propio ficheiro.

Onde se usa

En todas partes. Do mesmo xeito que PNG, JPEG utilízase en cámaras, sistemas operativos (como logotipos de empresas, iconas de aplicacións, miniaturas) e en todas as áreas posibles nas que as imaxes deben almacenarse de forma eficiente.

Saída

Polo momento, o coñecemento sobre JPEG é valioso só para fins educativos, porque xa está construído en todas partes e optimizado por grandes grupos de persoas, pero o granito da ciencia aínda é saboroso.

Fontes

Artigo sobre YCbCr na Wikipedia
Artigo da Wikipedia sobre JPEG
Un pouco sobre a PrEP da publicación de Pikabu
Artigo na Wikipedia sobre PrEP

Fonte: www.habr.com

Engadir un comentario