JPEG. Algorithme de compression

Bonjour à nouveau! J'ai trouvé cet article rédigé en mai 2019. Ceci est la suite d'une série d'articles sur WAVE et JPEG, ici premier. Cette publication comprendra des informations sur l'algorithme de codage d'image et le format lui-même dans son ensemble.

Une pincée d'histoire

Une cuillère à soupe d'article Wikipédia :

JPEG (Joint Photographic Experts Group) est l'un des formats graphiques raster les plus populaires utilisés pour stocker des photographies et des images similaires.

Cette norme a été développée par le Joint Photographic Experts Group en 1991 pour une compression efficace des images.

Comment les images passent-elles du brut au JPEG ?

Certaines personnes pensent que les images JPEG sont des données brutes compressées selon la méthode Huffman, mais ce n'est pas vrai. Avant de contrôler la compression, les données parcourent un long chemin.

Tout d’abord, le modèle de couleur passe de RVB à YCbCr. Il existe même un algorithme spécial pour cela - ici. Y n'est pas touché, puisqu'il est responsable de la luminosité, et son changement sera perceptible.

La première chose à faire avec l'image est "amincissement" (sous-échantillonnage). C'est facile à comprendre : un tableau 2x2 de pixels est pris, puis Cb et Cr sont pris - les valeurs moyennes de chacune des composantes YCbCr de ces 4 pixels. Donc, nous avons gagné 6 octets, au lieu de 4 Y, 4 Cb, 4 Cr nous avons 4 Y et les mêmes Cb et Cr pour chacun d'eux (4 + 4 + 4 = 12 ; 4 + 1 + 1 = 6 ; 12 - 6 = 6). Même à une échelle de 2x2, la compression avec perte avec un taux de compression de 2:1 semble solide. Cela s'applique à l'image entière. Et donc - ils ont perdu une demi-taille. Et nous pouvons utiliser cette technique grâce à notre perception des couleurs. Une personne remarquera facilement une différence de luminosité, mais pas de couleur, si la moyenne est calculée sur un petit bloc de pixels. L'amincissement peut également se faire en ligne, de 4 pixels horizontalement et verticalement. La première option est utilisée plus souvent. Si la qualité de l’image est importante, la décimation n’est pas effectuée du tout.
Une illustration visuelle de l'amincissement (Habr ne m'a pas permis d'insérer un gif) - https://i.ibb.co/Rg5Th9H/150953010617579181.gif

L'essentiel de la préparation

Préparation

Vient maintenant la partie la plus difficile et la plus nécessaire. L'image entière est divisée en blocs de 8x8 (le remplissage est utilisé si la résolution n'est pas un multiple du côté du bloc).

Appliquez maintenant à chaque bloc DCT (Transformation en Cosinus Discrète). Dans cette partie, tout ce qui est inutile est supprimé du tableau. En utilisant DCT, vous devez comprendre si un bloc donné (8×8) décrit une partie monotone de l’image : le ciel, le mur ; soit il contient une structure complexe (cheveux, symboles, etc.). Il est logique que 64 pixels de couleur similaire puissent être décrits par seulement 1, car la taille du bloc est déjà connue. Voilà pour la compression : 64 contre 1.

DCT transforme le bloc en spectre, et là où les lectures changent fortement, le coefficient devient positif, et plus la transition est nette, plus la sortie sera élevée. Là où le coefficient est plus élevé, l'image montre des transitions claires de couleur et de luminosité, là où il est inférieur - des changements faibles (lisses) dans les valeurs des composants YCbCr dans le bloc.

Quantification

Les paramètres de compression sont déjà appliqués ici. Chacun des coefficients de chacune des matrices 8x8 est divisé par un certain nombre. Si vous ne réduisez pas la qualité de l'image après toutes ses modifications, alors le diviseur devrait être un. Si la mémoire occupée par cette photo est plus importante pour vous, alors le diviseur sera supérieur à 1, et le quotient sera arrondi. Il s’avère qu’après avoir arrondi, on se retrouve souvent avec beaucoup de zéros.

La quantification est effectuée pour créer la possibilité d'une compression encore plus importante. Voici à quoi cela ressemble en utilisant l'exemple de quantification du graphique y = sin(x) :

JPEG. Algorithme de compression

compression

Nous parcourons d’abord la matrice en zigzag :

JPEG. Algorithme de compression

Nous obtenons un tableau unidimensionnel avec des nombres. On voit qu'il y a beaucoup de zéros dedans, ils peuvent être supprimés. Pour ce faire, au lieu d'une séquence de plusieurs zéros, nous entrons 1 zéro et après lui un nombre indiquant leur numéro dans la séquence. De cette façon, vous pouvez réinitialiser à 1/3 la taille de l'ensemble du tableau. Et puis nous compressons simplement ce tableau à l'aide de la méthode Huffman et l'écrivons dans le fichier lui-même.

Où utiliser

Partout. Comme PNG, JPEG est utilisé dans les appareils photo, les systèmes d'exploitation (comme les logos d'entreprise, les icônes d'application, les vignettes) et dans tous les domaines possibles où les images doivent être stockées efficacement.

conclusion

À l'heure actuelle, les connaissances sur le JPEG n'ont de valeur qu'à des fins éducatives, car elles sont déjà intégrées partout et optimisées par de grands groupes de personnes, mais le granit de la science est toujours savoureux.

sources

Article sur YCbCr sur Wikipédia
Article Wikipédia sur JPEG
Un peu sur la PrEP du post de Pikabu
Article Wikipédia sur la PrEP

Source: habr.com

Ajouter un commentaire