Presque toutes les pertes de qualité d'image se produisent la première fois qu'une image est compressée au format JPEG. Quel que soit le nombre de fois où un JPEG est recompressé avec les mêmes paramètres , les pertes générationnelles sont limitées à une erreur d'arrondi.
Les limites du MCU restent intactes (blocs 8x8).
Le sous-échantillonnage de chrominance est désactivé.
DQT constant (même réglage de qualité).
Cependant, les erreurs d'arrondi peuvent être importantes pour chaque itération si les critères ci-dessus ne sont pas remplis, et il est prudent de conserver des sauvegardes de tous les fichiers d'origine.
Convertissez l'espace colorimétrique. Si vous le souhaitez, sous-échantillonnez les informations de couleur (sous-échantillonnage de chrominance) (avec perte) . Si elle n'est pas sous-échantillonnée, la perte d'informations est le résultat d'une erreur d'arrondi .
Segmentation. Divisez chaque canal en blocs 8x8 (MCU = unité de codage minimale). (Sans perte)
Remarque: Si le sous-échantillonnage de chrominance est activé, les MCU peuvent effectivement être de 16 x 8, 8 x 16 ou 16 x 16, en termes d'image d'origine. Cependant, les MCU sont toujours tous des blocs 8x8.
Transformation cosinus discrète (DCT) sur chaque MCU. La perte d'informations est le résultat d'une erreur d'arrondi .
Quantification. La valeur dans chaque cellule du MCU est divisée par un nombre spécifié dans une table de quantification (DQT). Les valeurs sont arrondies vers le bas, dont beaucoup deviendront nulles. Il s'agit de la principale partie avec perte de l'algorithme.
Scan Zig-Zag. Réorganisez les valeurs dans chaque MCU en une séquence de nombres suivant un motif en zig-zag. Les zéros qui se sont produits pendant la quantification seront regroupés. (Sans perte)
DPCM = modulation différentielle de code d'impulsion. Convertissez les séquences de nombres en une forme plus facile à compresser. (Sans perte)
RLE = Run Length Encoding. Les zéros consécutifs sont compressés. (Sans perte)
Entropie / codage de Huffman. (Sans perte)
Recompression de JPEG
Notez que le sous- échantillonnage des canaux de couleur et la quantification sont les seules étapes intentionnellement avec perte . Mis à part l'erreur d'arrondi pour l'instant, toutes les autres étapes sont sans perte. Une fois la quantification effectuée, inverser et répéter l'étape donne des résultats identiques. En d'autres termes, la re-quantification (avec le même DQT) est sans perte .
En principe, il est possible de créer un algorithme de rééchantillonnage sans perte après le premier passage. Cependant, avec l'implémentation dans ImageMagick, les couleurs peuvent changer radicalement avant d'atteindre l'état d'équilibre, comme le montre l'image de ths.
Dans des conditions optimales, la recompression d'un JPEG avec les mêmes paramètres de qualité entraînerait exactement le même JPEG. En d'autres termes, la recompression des fichiers JPEG est potentiellement sans perte . Dans la pratique, la recompression des fichiers JPEG n'est pas sans perte, mais sujette à, et limitée par, une erreur d'arrondi. Bien que les erreurs d'arrondi finissent souvent par converger vers zéro , de sorte que la même image exacte soit recréée, le sous-échantillonnage de la chrominance peut entraîner des changements de couleur importants.
Démonstration (même réglage de qualité)
J'ai écrit le bash
script suivant , qui utilise ImageMagick pour recompresser à plusieurs reprises un fichier JPEG avec un paramètre de qualité donné:
#!/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
Après l'avoir laissé fonctionner pendant quelques centaines d'itérations, j'ai couru md5sum
sur les résultats:
d9c0d55ee5c8b5408f7e50f8ebc1010e original.jpg
880db8f146db87d293def674c6845007 10316.jpg
880db8f146db87d293def674c6845007 10317.jpg
880db8f146db87d293def674c6845007 10318.jpg
880db8f146db87d293def674c6845007 10319.jpg
880db8f146db87d293def674c6845007 10320.jpg
Nous pouvons voir que, en effet, l'erreur d'arrondi a convergé vers zéro, et la même image exacte est reproduite, encore et encore .
J'ai répété cela plusieurs fois avec différentes images et paramètres de qualité. Habituellement, l'état d'équilibre est atteint et la même image exacte est reproduite encore et encore.
J'ai essayé de répliquer les résultats de mattdm en utilisant Imagemagick sur Ubuntu 18.04. L'original était une conversion brute en TIFF dans Rawtherapee, mais il semble qu'il ne soit plus disponible. À sa place, j'ai pris la version agrandie et je l'ai réduite à sa taille d'origine (256x256). Ensuite, j'ai recomprimé à plusieurs reprises à 75 jusqu'à ce que j'obtienne la convergence. Voici le résultat (original, 1, n, différence):
Mes résultats sont différents. Sans le véritable original, la raison de la différence est impossible à déterminer.
J'ai recompressé l'image depuis le coin supérieur gauche du montage jusqu'à convergence à 90. Voici le résultat (original, 1, n, différence):
Après avoir activé le sous-échantillonnage de chrominance, les couleurs changent au moment où l'état stationnaire est atteint.
Changement parmi un petit nombre de paramètres
En modifiant la variable q2
, le paramètre de qualité peut être limité à un ensemble de valeurs uniformément réparties.
q2=$(( (RANDOM % 3)*5 + 70 ))
Pour un petit nombre de choix de réglage, l' équilibre peut finalement être atteint , ce qui se voit lorsque les valeurs md5 commencent à se reproduire. Il semble que plus l'ensemble est grand, plus il prend de temps et pire l'image devient, avant que l'équilibre ne puisse être atteint.
Ce qui semble se produire à l'équilibre est que le coefficient DCT avant la quantification doit être divisible par toutes (ou la plupart) des valeurs quantiques. Par exemple, si vous basculez entre deux DQT où le coefficient DCT est divisé alternativement par 3 et 5, l'équilibre sera atteint lorsque le coefficient DCT est divisible par 15. Cela explique pourquoi la baisse de qualité est beaucoup plus importante que la différence entre les paramètres d'origine.
Changement parmi un plus grand nombre de paramètres
Bourriquet n'est pas content quand q2
on le change ainsi:
q2=$(( (RANDOM % 9) + 90 ))
Pour faire une vidéo, utilisez 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
Regarder les 9999 premières itérations, c'est presque comme regarder l'eau bouillir. Pourrait vouloir doubler la vitesse de lecture. Voici Bourriquet après 11999 itérations:
Et si les limites du MCU changent?
Si des changements se produisent un nombre limité de fois, une recompression répétée est susceptible d'atteindre l'état d'équilibre. Si des changements se produisent à chaque itération, l'image se dégradera probablement de la même manière que lorsque DQT change.
- C'est ce qui se passe dans les vidéos qui font pivoter une image avec des dimensions qui ne sont pas divisibles par 8.
Et l'édition?
L'effet de la recompression après l'édition dépend de l'édition particulière effectuée. Par exemple, l'enregistrement avec le même paramètre de qualité après réduction des artefacts JPEG réintroduirait les mêmes artefacts. Cependant, l'application d'un changement localisé, tel qu'un pinceau de cicatrisation, n'affecterait pas les zones non touchées.
La plus grande baisse de qualité d'image se produit la première fois que le fichier est compressé avec un paramètre de qualité donné. Par la suite, la recompression avec le même paramètre ne devrait pas introduire de changement supérieur à l'erreur d'arrondi. Je m'attends donc à ce que les cycles d'édition-réenregistrement à un paramètre de qualité donné ressemblent à toute autre image enregistrée avec le même paramètre de qualité (tant que les limites du MCU restent intactes et que le sous-échantillonnage de chrominance est désactivé ).
Et ces vidéos?
Implémentation JPEG défectueuse? ( Ré-enregistrer 500 fois avec Photoshop au 10/12. )
Modification des paramètres de qualité. (La plupart des vidéos.)
Perturber les limites du MCU. (Recadrage ou rotation )
D'autres manœuvres qui réduisent la qualité de l'image ou interfèrent avec l'algorithme JPEG?
Puis-je écraser mes originaux avec des fichiers JPEG recompressés?
Il est prudent de conserver des sauvegardes de tous les fichiers d'origine, mais si vous en écrasez accidentellement un, les dommages sont probablement limités. Il serait également judicieux de travailler en JPEG avec le sous-échantillonnage de chrominance désactivé.
JPEG ne peut pas être utilisé pour des images qui utilisent plus de 8 bits par couleur.