Formatos de imagen: WebP

Originalmente, Google desarrolló WebP como un formato de imagen con pérdida para sustituir a JPEG, 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 GIF, todo lo cual se puede usar junto con la compresión con pérdida de estilo JPEG. WebP es un formato versátil increíble.

El algoritmo de compresión con pérdida de WebP se basa en un método que usa el códec de video VP8 para comprimir fotogramas clave en videos. En un nivel superior, 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 luminancia y crominancia. Los bloques de luma de WebP son de 16 x 16, mientras que los de croma son de 8 x 8, y esos "macrobloques" se subdividen en subbloques de 4x4.

WebP difiere radicalmente de JPEG, en dos funciones: "predicción de bloques" y "cuantización de bloques adaptable".

Bloquear predicción

La predicción de bloques es el proceso a través del cual se predice el contenido de cada bloque de crominancia y luminancia según los valores de los bloques circundantes, en particular los bloques superiores y a la izquierda del bloque actual. Como puedes imaginar, los algoritmos que hacen este trabajo son bastante complejos, pero para ponerlo en lenguaje sencillo: "Si hay azul sobre el bloque actual y azul a la izquierda del bloque actual, supone que este bloque es azul".

En realidad, tanto PNG como JPEG también hacen este tipo de predicción en cierto grado. Sin embargo, WebP es único, ya que muestra los datos de los bloques circundantes y, luego, intenta completar el bloque actual mediante varios "modos de predicción" y trata de "dibujar" la parte faltante de la imagen. Los resultados que proporciona cada modo de predicción se comparan con los datos de imágenes reales y se selecciona la coincidencia predictiva más cercana.

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

Por supuesto, incluso la coincidencia predictiva más cercana no será del todo correcta, por lo que las diferencias entre los valores predichos y reales de ese bloque se codifican en el archivo. Cuando se decodifica la imagen, el motor de renderización usa los mismos datos para aplicar la misma lógica predictiva, lo que genera los mismos valores de predicción para cada bloque. La diferencia entre la predicción y la imagen esperada que se codifica en el archivo luego se aplica sobre las predicciones, de manera similar a como una confirmación de Git representa un parche diferencial que se aplica sobre el archivo local, en lugar de una copia nueva del archivo.

Para ilustrarlo, en lugar de profundizar en los cálculos matemáticos complejos que implica el verdadero algoritmo predictivo, inventaremos una codificación similar a WebP con un solo modo de predicción y la usaremos para retransmitir de forma eficiente una cuadrícula de números como lo hicimos con los formatos heredados. Nuestro algoritmo tiene un único 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 que están por encima y a la izquierda, y comienza con 1.

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

111151111
122456389

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

111111111
123456789

Los datos encajan muy bien con el algoritmo predictivo que inventamos: los datos predichos coinciden en gran medida con los datos reales. No es un ajuste perfecto, por supuesto, los datos reales tienen varios bloques que son diferentes de los datos predichos. Por lo tanto, la codificación que enviamos incluye no solo el método de predicción a utilizar, sino también una diferencia de cualquier bloque que deba diferir de sus valores previstos:

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

Usa el mismo tipo de lenguaje simple que algunas de las codificaciones de formato heredadas que mencionamos:

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 de 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, esto 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 nuestros ajustes de compresión de JPEG no están determinados por los detalles de alta frecuencia (en los que la compresión JPEG sobresale), sino por las partes de la imagen en las que es más probable que aparezcan los 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 la original para compararla con ella. Del mismo modo, la inflorescencia detallada del almazon y las hojas en primer plano (tú y yo podemos ver rastros de artefactos de compresión con nuestros ojos entrenados, pero incluso con la compresión marcada mucho más allá de los niveles razonables, los elementos en primer plano se ven bien nítidos. La información de baja frecuencia que aparece en la parte superior izquierda de la imagen (el fondo verde borroso de las hojas) se ve pésima. Incluso un usuario sin entrenamiento se daría cuenta de inmediato del problema de calidad: los gradientes sutiles en el fondo se redondean hacia abajo a bloques dentados de color sólido.

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

Una imagen WebP comprimida de una mariposa monarca

El tamaño de ambos archivos de imagen es casi el mismo. La calidad es casi la misma cuando observamos las alas del monarca: se pueden ver algunas pequeñas diferencias en el resultado final si se ven muy, muy de cerca, pero no hay una diferencia real en la calidad general. En WebP, las flores de la almez son solo un poco más nítidas, de nuevo, es probable que no sean lo suficientemente notorias para ser notorias, a menos que compares las dos juntas y busques diferencias en la calidad, como somos. El fondo es una historia diferente en conjunto: tiene apenas un rastro de los artefactos obviamente de JPEG. WebP nos proporciona el mismo tamaño de archivo, pero una imagen de calidad mucho más alta. Proporciona o toma algunos detalles que nuestros sistemas psicovisuales no podrían detectar si no estuviéramos comparando ambos detalles.

Cómo usar WebP

Los componentes internos de WebP pueden ser mucho más complejos que la codificación JPEG, pero igual de sencillo para nuestro trabajo diario: toda la complejidad de la codificación de WebP está estandarizada en torno a un único valor de "calidad", expresado de 0 a 100, al igual que JPEG. Una vez más, eso no significa que estás limitado a un solo parámetro de configuración general de "calidad". Puedes (y debes) jugar con todos los detalles pequeños de la codificación WebP, incluso para comprender mejor la forma en que esta configuración normalmente invisible puede afectar 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 por la línea de comandos, Squoosh nos servirá de la misma manera para la codificación WebP. Nos da la opción de realizar comparaciones en paralelo entre diferentes codificaciones, configuraciones, niveles de calidad y diferencias en el tamaño de archivo de la codificación JPEG.