Casi todas las pérdidas de calidad de imagen ocurren la primera vez que una imagen se comprime como JPEG. Independientemente de cuántas veces se vuelva a comprimir un JPEG con la misma configuración , las pérdidas generacionales se limitan al error de redondeo.
Los límites de MCU permanecen intactos (bloques de 8x8).
El submuestreo de croma está deshabilitado.
DQT constante (misma configuración de calidad).
Sin embargo, los errores de redondeo pueden ser grandes para cada iteración si no se cumplen los criterios anteriores, y es prudente mantener copias de seguridad de todos los archivos originales.
Convertir espacio de color. Si lo desea, disminuya la información de color (submuestreo de croma) (con pérdida) . Si no se disminuye la muestra, la pérdida de información es el resultado de un error de redondeo .
Segmentación. Divida cada canal en bloques de 8x8 (MCU = Unidad de codificación mínima). (Sin pérdida)
Nota: Si el submuestreo de croma está habilitado, las MCU pueden ser efectivamente 16x8, 8x16 o 16x16, en términos de la imagen original. Sin embargo, las MCU todavía son todos bloques 8x8.
Transformación discreta de coseno (DCT) en cada MCU. La pérdida de información es el resultado de un error de redondeo .
Cuantización El valor en cada celda de la MCU se divide por un número especificado en una tabla de cuantificación (DQT). Los valores se redondean hacia abajo, muchos de los cuales se convertirán en cero. Esta es la porción primaria con pérdida del algoritmo.
Escaneo en zigzag. Reorganice los valores en cada MCU en una secuencia de números siguiendo un patrón en zig-zag. Los ceros que ocurrieron durante la cuantización se agruparán. (Sin pérdida)
DPCM = Modulación diferencial de código de pulso. Convierta las secuencias numéricas en una forma que sea más fácil de comprimir. (Sin pérdida)
RLE = Ejecutar codificación de longitud. Los ceros consecutivos están comprimidos. (Sin pérdida)
Entropía / Codificación Huffman. (Sin pérdida)
Recomprimir archivos JPEG
Tenga en cuenta que la disminución de muestreo de los canales de color y la cuantización son los únicos pasos intencionalmente con pérdida . Dejando de lado el error de redondeo por ahora, todos los demás pasos no tienen pérdidas. Una vez que se ha producido la cuantización, invertir y repetir el paso da resultados idénticos. En otras palabras, la recuantificación (con el mismo DQT) no tiene pérdidas .
En principio, es posible crear un algoritmo de remuestreo que no tenga pérdidas después de la primera pasada. Sin embargo, con la implementación en ImageMagick, los colores pueden cambiar drásticamente antes de alcanzar el estado estable, como se ve en la imagen de esta.
En condiciones óptimas, volver a comprimir un JPEG con la misma configuración de calidad daría como resultado exactamente el mismo JPEG. En otras palabras, volver a comprimir archivos JPEG es potencialmente sin pérdidas . En la práctica, la recompresión de archivos JPEG no es sin pérdidas, sino que está sujeta a errores de redondeo y está limitada por ellos. Aunque los errores de redondeo a menudo eventualmente convergen a cero , de modo que se recrea exactamente la misma imagen, el submuestreo de croma puede provocar cambios de color significativos.
Demostración (misma configuración de calidad)
Escribí el siguiente bash
script, que usa ImageMagick para recomprimir repetidamente un archivo JPEG con una configuración de calidad dada:
#!/usr/bin/env bash
n=10001; q1=90
convert original.png -sampling-factor 4:4:4 -quality ${q1} ${n}.jpg
while true ; do
q2=${q1} # for variants, such as adding randomness
convert ${n}.jpg -quality ${q2} $((n+1)).jpg
#\rm $((n-5)).jpg # uncomment to avoid running out of space
n=$((n+1))
echo -n "$q2 "
md5sum ${n}.jpg
done
Después de dejar que se ejecute durante unos cientos de iteraciones, ejecuté md5sum
los resultados:
d9c0d55ee5c8b5408f7e50f8ebc1010e original.jpg
880db8f146db87d293def674c6845007 10316.jpg
880db8f146db87d293def674c6845007 10317.jpg
880db8f146db87d293def674c6845007 10318.jpg
880db8f146db87d293def674c6845007 10319.jpg
880db8f146db87d293def674c6845007 10320.jpg
Podemos ver que, de hecho, el error de redondeo ha convergido a cero, y se reproduce exactamente la misma imagen, una y otra vez .
Lo he repetido varias veces con diferentes imágenes y configuraciones de calidad. Por lo general, se alcanza el estado estable y se reproduce exactamente la misma imagen una y otra vez.
He intentado replicar los resultados de mattdm usando Imagemagick en Ubuntu 18.04. El original era una conversión en bruto a TIFF en Rawtherapee, pero parece que ya no está disponible. En su lugar, tomé la versión ampliada y la reduje a su tamaño original (256x256). Luego repetidamente recomprimí a 75 hasta que logré la convergencia. Aquí está el resultado (original, 1, n, diferencia):
Mis resultados son diferentes. Sin el verdadero original, la razón de la diferencia es imposible de determinar.
Comprimí la imagen desde la esquina superior izquierda del montaje hasta la convergencia en 90. Este es el resultado (original, 1, n, diferencia):
Después de habilitar el submuestreo de croma, los colores cambian cuando se alcanza el estado estable.
Cambiar entre una pequeña cantidad de configuraciones
Al modificar la variable q2
, la configuración de calidad puede limitarse a un conjunto de valores distribuidos uniformemente.
q2=$(( (RANDOM % 3)*5 + 70 ))
Para un pequeño número de opciones de configuración, el equilibrio puede eventualmente alcanzarse , lo que se ve cuando los valores de md5 comienzan a repetirse. Parece que cuanto más grande es el conjunto, más se demora y peor es la imagen, antes de que se pueda alcanzar el equilibrio.
Lo que parece suceder en el equilibrio es que el coeficiente DCT antes de la cuantización debe ser divisible en todos (o la mayoría) de los valores cuánticos. Por ejemplo, si se cambia entre dos DQT donde el coeficiente DCT se divide alternativamente por 3 y 5, se alcanzará el equilibrio cuando el coeficiente DCT sea divisible por 15. Esto explica por qué la caída en la calidad es mucho mayor que la diferencia entre las configuraciones originales.
Cambiar entre una mayor cantidad de configuraciones
Eeyore no está contento cuando q2
se cambia así:
q2=$(( (RANDOM % 9) + 90 ))
Para hacer un video, use ffmpeg
:
rename 's@1@@' 1*.jpg
ffmpeg -r 30 -i %04d.jpg -c:v libx264 -crf 1 -vf fps=25 -pix_fmt yuv420p output.mp4
Ver las primeras 9999 iteraciones es casi como ver hervir el agua. Es posible que desee duplicar la velocidad de reproducción. Aquí está Eeyore después de 11999 iteraciones:
¿Qué pasa si los límites de MCU cambian?
Si se producen cambios un número limitado de veces, es probable que la recompresión repetida alcance el estado estable. Si se producen cambios en cada iteración, la imagen probablemente se degradará de manera similar a cuando cambia DQT.
- Esto es lo que sucede en los videos que rotan una imagen con dimensiones que no son divisibles por 8.
¿Qué pasa con la edición?
El efecto de volver a comprimir después de la edición depende de la edición particular realizada. Por ejemplo, guardar con la misma configuración de calidad después de reducir los artefactos JPEG reintroduciría los mismos artefactos. Sin embargo, la aplicación de un cambio localizado, como un pincel de curación, no afectaría las áreas que no fueron tocadas.
La mayor caída en la calidad de la imagen ocurre la primera vez que el archivo se comprime en una configuración de calidad dada. Posteriormente, volver a comprimir con la misma configuración no debería introducir ningún cambio mayor que el error de redondeo. Por lo tanto, esperaría que los ciclos de edición-resave en una configuración de calidad dada se vean como cualquier otra imagen guardada con la misma configuración de calidad (siempre que los límites de MCU permanezcan intactos y el submuestreo de croma esté desactivado ).
¿Qué hay de esos videos?
¿Implementación JPEG defectuosa? ( Volver a guardar 500 veces con Photoshop al 10/12. )
Cambiar la configuración de calidad. (La mayoría de los videos)
Interrumpiendo los límites de MCU. (Recortar o rotar )
¿Otras maniobras que reducen la calidad de la imagen o interfieren con el algoritmo JPEG?
¿Puedo sobrescribir mis originales con archivos JPEG comprimidos?
Es prudente mantener copias de seguridad de todos los archivos originales, pero si accidentalmente sobrescribe uno, es probable que el daño sea limitado. También estaría bien trabajar en JPEG con submuestreo de croma deshabilitado.
JPEG no se puede usar para imágenes que usan más de 8 bits por color.