JPEG. Algoritmo de compresión

¡Hola de nuevo! Encontré este artículo escrito en mayo de 2019. Esta es una continuación de una serie de artículos sobre WAVE y JPEG, aquí primero. Esta publicación incluirá información sobre el algoritmo de codificación de imágenes y el formato en sí en su conjunto.

Una pizca de historia

Una cucharada de artículo de Wikipedia:

JPEG (Joint Photographic Experts Group) es uno de los formatos de gráficos rasterizados más populares que se utilizan para almacenar fotografías e imágenes similares.

Este estándar fue desarrollado por el Grupo Conjunto de Expertos en Fotografía en 1991 para una compresión de imágenes eficiente.

¿Cómo pasan las imágenes de raw a JPEG?

Algunas personas piensan que las imágenes JPEG son datos sin procesar comprimidos mediante el método Huffman, pero esto no es cierto. Antes de la compresión de control, los datos viajan un largo camino.

Primero, el modelo de color se cambia de RGB a YCbCr. Incluso existe un algoritmo especial para esto: aquí. Y no se toca, ya que es el responsable del brillo, y su cambio se notará.

Lo primero que hay que hacer con la imagen es "adelgazamiento" (submuestreo). Es fácil de entender: se toma una matriz de píxeles de 2x2, luego se toman Cb y Cr, los valores promedio de cada uno de los componentes YCbCr de estos 4 píxeles. Entonces, ganamos 6 bytes, en lugar de 4 Y, 4 Cb, 4 Cr obtuvimos 4 Y y los mismos Cb y Cr para cada uno de ellos (4 + 4 + 4 = 12; 4 + 1 + 1 = 6; 12 - 6 = 6). Incluso en una escala de 2x2, la compresión con pérdida con una relación de compresión de 2:1 suena sólida. Esto se aplica a toda la imagen. Y así, bajaron medio tamaño. Y podemos utilizar esta técnica gracias a nuestra percepción del color. Una persona notará fácilmente una diferencia en el brillo, pero no en el color, si se promedia en un pequeño bloque de píxeles. El adelgazamiento también se puede realizar en línea, 4 píxeles horizontal y verticalmente. La primera opción se utiliza con más frecuencia. Si la calidad de la imagen es importante, entonces no se realiza ninguna diezma.
Una ilustración visual del adelgazamiento (Habr no me permitió insertar un gif) - https://i.ibb.co/Rg5Th9H/150953010617579181.gif

La parte principal de la preparación.

Dkp

Ahora viene la parte más difícil y necesaria. La imagen completa se divide en bloques de 8x8 (se utiliza relleno si la resolución no es múltiplo del lado del bloque).

Ahora aplica a cada bloque. DCT (Transformada de coseno discreta). En esta parte, todo lo innecesario se elimina de la imagen. Con DCT, es necesario comprender si un bloque determinado (8×8) describe alguna parte monótona de la imagen: el cielo, la pared; o contiene una estructura compleja (pelo, símbolos, etc.). Es lógico que 64 píxeles de color similar se puedan describir con solo 1, porque El tamaño del bloque ya se conoce. Hasta aquí la compresión: 64 a 1.

DCT convierte el bloque en un espectro y, cuando las lecturas cambian bruscamente, el coeficiente se vuelve positivo y cuanto más pronunciada sea la transición, mayor será la salida. Donde el coeficiente es mayor, la imagen muestra transiciones claras de color y brillo, donde es menor: cambios débiles (suaves) en los valores de los componentes YCbCr en el bloque.

Cuantización

La configuración de compresión ya se aplica aquí. Cada uno de los coeficientes en cada una de las matrices de 8x8 se divide por un número determinado. Si no desea reducir la calidad de la imagen después de todas sus modificaciones, entonces el divisor debe ser uno. Si el recuerdo que ocupa esta foto es más importante para ti, entonces el divisor será mayor que 1 y el cociente se redondeará. Resulta que después de redondear, a menudo terminas con muchos ceros.

La cuantización se realiza para crear la posibilidad de una compresión aún mayor. Así es como se ve usando el ejemplo de cuantización del gráfico y = sin(x):

JPEG. Algoritmo de compresión

compresión

Primero recorremos la matriz en forma de zig-zag:

JPEG. Algoritmo de compresión

Obtenemos una matriz unidimensional con números. Vemos que contiene muchos ceros, se pueden eliminar. Para hacer esto, en lugar de una secuencia de muchos ceros, ingresamos 1 cero y después un número que indica su número en la secuencia. De esta manera puede restablecer a 1/3 del tamaño de toda la matriz. Y luego simplemente comprimimos esta matriz usando el método Huffman y la escribimos en el archivo.

Donde se usa

En todos lados. Al igual que PNG, JPEG se utiliza en cámaras, sistemas operativos (como logotipos de empresas, íconos de aplicaciones, miniaturas) y en todas las áreas posibles donde las imágenes deben almacenarse de manera eficiente.

conclusión

Por el momento, el conocimiento sobre JPEG es valioso sólo con fines educativos, porque ya está integrado en todas partes y optimizado por grandes grupos de personas, pero el granito de la ciencia sigue siendo sabroso.

fuentes

Artículo sobre YCbCr en Wikipedia
Artículo de Wikipedia sobre JPEG
Un poco sobre PrEP del post de Pikabu
Artículo de Wikipedia sobre PrEP

Fuente: habr.com

Añadir un comentario