Formatos de imagen: WebP

Originalmente, Google desarrolló WebP como un formato de imagen con pérdida para sustituir a JPEG, uno que podía producir archivos más pequeños que un archivo de imagen de calidad comparable codificado como JPEG. Las actualizaciones posteriores del formato introdujeron la opción de compresión sin pérdida, la transparencia de canal alfa similar a PNG y la animación similar a la de GIF, que pueden utilizarse junto con la compresión con pérdida de estilo JPEG. WebP es un formato increíblemente versátil.

El algoritmo de compresión con pérdida de WebP se basa en un método que usa el códec de video de VP8. para comprimir los fotogramas clave en los videos. En un nivel alto, es similar a la codificación JPEG: WebP funciona en términos de "bloques" en lugar de píxeles individuales, y tiene una división similar entre la luminancia y la crominancia. Los bloques de luma de WebP son de 16 × 16, mientras que los de croma son de 8 × 8 y esos "macrobloques" son se subdividen en subbloques de 4x4.

Cuando WebP difiere radicalmente de JPEG, se presenta en dos funciones: “predicción de bloques” y la “cuantización de bloques adaptable”.

Bloquear predicción

La predicción de bloques es el proceso a través del cual se predicen los contenidos de cada bloque de crominancia y luminancia en función de los valores de los bloques que los rodean (específicamente los bloques que están encima y a la izquierda del bloque actual). Como te imaginarás, los algoritmos que hacen este trabajo son bastante complejas, pero para expresarlo de forma sencilla: "si hay azul sobre el bloque actual y azul en el lado izquierdo, del bloque actual, imagina que este bloque es azul".

En verdad, tanto PNG como JPEG también hacen este tipo de predicción en algún grado. Sin embargo, WebP es único, ya que permite muestrear los datos circundantes de bloques de datos y luego intenta propagar el bloque actual a través de varios "modos de predicción" diferentes, intentando efectivamente "dibujar" la parte faltante de la imagen. Los resultados proporcionados por cada modo de predicción se comparan con los datos de imágenes reales y los se seleccionó la coincidencia predictiva.

Diagrama de los diversos métodos de predicción de bloques de WebP.

Incluso la coincidencia predictiva más cercana no será del todo correcta, por lo que las diferencias entre la y los valores reales de ese bloque están codificados en el archivo. Al decodificar la imagen, el motor de renderización usa los mismos datos para aplicar la misma lógica predictiva, lo que lleva a los mismos valores predichos para cada bloque. La diferencia entre la predicción y el que se codificó en el archivo se aplica sobre las predicciones, de manera similar a cómo una confirmación de Git representa un diferencial parche que se aplica sobre el archivo local, en lugar de una copia completamente nueva del archivo.

A modo de ejemplo, en lugar de profundizar en la matemática compleja involucrada en el verdadero algoritmo predictivo, inventará una codificación similar a WebP con un solo modo de predicción y usarlo para retransmitir una cuadrícula de números de forma eficiente, tal como lo hicimos con los formatos heredados. Nuestro algoritmo tiene un solo modo de predicción, que llamaremos “modo de predicción uno”: el valor de cada bloque es la suma de los valores de los bloques de arriba y a su izquierda, empezando por 1.

Ahora, supongamos que empezamos con los siguientes datos de imágenes reales:

111151111
122456389

Usando nuestro modelo predictivo para determinar el contenido de una cuadrícula de 2x9, obtendríamos el siguiente resultado:

111111111
123456789

Nuestros datos son adecuados para el algoritmo predictivo que inventamos: los datos predichos son muy parecidos a los reales. No un ajuste perfecto, por supuesto, los datos reales tienen varios bloques que son diferentes de los datos predichos. Entonces, la codificación que enviamos incluye no solo el método de predicción que se usará, sino también una diferencia de cualquier bloque que debería diferir de sus valores predichos:

_ _ _ _ +4 _ _ _ _
_ _ -1 _ _ _ -4 _ _

Usa el mismo tipo de lenguaje sin formato que algunas de las codificaciones de formato heredadas que hemos analizado:

Cuadrícula de 2 x 9 con el modo de predicción uno. +4 a 1x5, -1 a 2x3, -4 a 2x7.

El resultado final es un archivo codificado increíblemente eficiente.

Cuantización por bloques adaptable

La compresión de JPEG es una operación general que aplica el mismo nivel de cuantización a cada bloque de la imagen. En una imagen con una composición uniforme, eso tiene sentido, pero las fotografías del mundo real no son más uniformes que el mundo que nos rodea. En la práctica, esto significa que nuestra configuración de compresión JPEG no se determina por los detalles de alta frecuencia, en los que JPEG sobresale la compresión, sino en las partes de la imagen en las que es más probable que aparezcan artefactos de compresión.

Una imagen JPEG comprimida de una mariposa monarca

Como puedes ver en este ejemplo exagerado, las alas del monarca en primer plano se ven relativamente nítidas: un poco granuladas. en comparación con el original en alta resolución, pero no se nota sin el original para compararlo con él. Del mismo modo, la detallada inflorescencia de la planta de leche y las hojas en primer plano (es posible que tú y yo veamos rastros de compresión) artefactos con nuestros ojos entrenados, pero incluso con la compresión alcanzada mucho más allá de niveles razonables de cosas en primer plano aun así se ven bastante nítidas. La información de baja frecuencia en la parte superior izquierda de la imagen (el fondo verde borroso de hojas) se ve pésimo. Incluso un usuario no entrenado notaría de inmediato el problema de calidad: los sutiles gradientes en el fondo son redondeados hacia abajo a bloques dentados de color sólido.

Para evitar esto, WebP adopta un enfoque adaptable a la cuantización: una imagen se divide en hasta cuatro imágenes similares segmentos, y los parámetros de compresión para esos segmentos se ajustan de forma independiente. Uso de la misma compresión de gran tamaño con WebP:

Una imagen WebP comprimida de una mariposa monarca

El tamaño de los dos archivos de imagen es casi el mismo. Cuando miramos las alas del monarca, la calidad es casi la misma: puedes detectar pequeñas diferencias en el resultado final si lo observas muy, muy de cerca, pero no hay ninguna diferencia real en la calidad general. En el WebP, las flores de la planta de leche son solo un poco más nítidas; además, es probable que no sean lo suficientemente claras a menos que se trate de comparamos ambos en paralelo y realmente buscamos las diferencias en la calidad, como nosotros. El trasfondo es una historia diferente tiene apenas un rastro de los artefactos evidentes de JPEG. WebP nos da el mismo tamaño de archivo, pero una de calidad, dar o tomar pequeños detalles que nuestros sistemas psicovisuales no podrían detectar si no estuviéramos comparando los dos tan estrechamente.

Cómo usar WebP

Las partes internas de WebP pueden ser considerablemente más complejas que la codificación JPEG, pero igual de simples para nuestros fines diarios. : toda la complejidad de la codificación de WebP está estandarizada en torno a una sola "calidad" expresado de 0 a 100, como JPEG. Y, una vez más, eso no quiere decir que estés limitado a una sola “calidad” general. del lugar. Puedes, y debes, jugar con todos detalles sutiles de la codificación WebP, para comprender mejor cómo puede afectar esta configuración normalmente invisible el tamaño y la calidad del archivo.

Google ofrece un codificador de línea de comandos cwebp que te permite convertir o comprimir archivos individuales o directorios completos de imágenes:

$ cwebp -q 80 butterfly.jpg -o butterfly.webp

Saving file 'butterfly.webp'
File:   butterfly.jpg
Dimension: 1676 x 1418
Output: 208418 bytes Y-U-V-All-PSNR 41.00 43.99 44.95   41.87 dB
        (0.70 bpp)
block count:    intra4:     7644  (81.80%)
               Intra16:     1701  (18.20%)
               Skipped:       63  (0.67%)
bytes used:  header:            249  (0.1%)
              mode-partition:  36885  (17.7%)
Residuals bytes  |segment 1|segment 2|segment 3|segment 4|  total
macroblocks:     |       8%|      22%|      26%|      44%|   9345
quantizer:       |      27 |      25 |      21 |      13 |
filter level:    |       8 |       6 |      19 |      16 |

Y si no te inclinas hacia la línea de comandos, Squoosh nos servirá de la misma manera para codificar WebP. Nos da la opción de comparaciones en paralelo entre diferentes codificaciones, configuraciones, niveles de calidad y diferencias en el tamaño de archivo de la codificación JPEG.