Bonjour à nouveau ! J'ai trouvé cet article écrit en mai 2019. C'est la suite d'une série d'articles sur WAVE et JPEG. Voici . Cette publication contiendra des informations sur l'algorithme de compression d'images et sur le format lui-même.
Une pincée d'histoire
Une cuillère de l'article de Wikipédia :
JPEG (Joint Photographic Experts Group) est un des formats d'image bitmap populaires utilisé pour stocker des photographies et des images similaires.
Ce standard a été développé par un groupe d'experts en photographie en 1991 pour une compression efficace des images.
Quel chemin parcourent les images de leur état brut à JPEG
Certains pensent que les images JPEG sont des données brutes compressées par Huffman, mais ce n'est pas le cas. Avant la compression finale, les données suivent un long parcours.
D'abord, le modèle de couleur est changé de RGB à YCbCr. Pour cela, il existe même un algorithme spécial — . Le Y n'est pas modifié, car il est responsable de la luminance et son changement serait perceptible.
La première chose qu'on fait avec l'image est le "sous-échantillonnage" (subsampling). C'est simple à comprendre : on prend une matrice 2x2 de pixels, ensuite on prend Cb et Cr — les valeurs moyennes de chacun des composants YCbCr de ces 4 pixels. Ainsi, nous avons économisé 6 octets, au lieu de 4 Y, 4 Cb, 4 Cr, nous avons obtenu 4 Y et les mêmes Cb et Cr pour chacun d'eux (4 + 4 + 4 = 12; 4 + 1 + 1 = 6; 12 - 6 = 6). À l'échelle même de 2x2, une compression avec perte avec un taux de compression de 2:1 semble solide. Cela s'applique à toute l'image. Et donc — nous avons réduit la taille de moitié. Ce procédé peut être utilisé grâce à notre perception des couleurs. Un humain remarquera facilement la différence de luminance, mais pas dans la couleur, si elle est moyennée dans un petit bloc de pixels. Le sous-échantillonnage peut également être effectué en ligne, 4 pixels horizontalement et verticalement. La première option est utilisée plus souvent. Si la qualité de l'image est importante, le sous-échantillonnage n'est pas réalisé du tout.
Une illustration claire du sous-échantillonnage (Habr n'a pas permis d'insérer un GIF) —
La partie principale de la préparation
DCT
Maintenant, la partie la plus complexe et nécessaire. Toute l'image est divisée en blocs de 8×8 (on utilise un remplissage si la résolution n'est pas un multiple de la taille du bloc).
Maintenant, à chaque bloc on applique DCT (Transformation discrète en cosinus). Dans cette partie, on retire tout l'excès de l'image. En utilisant la DCT, il faut comprendre si le bloc (8×8) décrit une partie monotone de l'image : le ciel, les murs ; ou s'il contient une structure complexe (cheveux, symboles, etc.). Il est logique que 64 pixels de couleur similaire puissent être décrits par un seul, puisque la taille du bloc est déjà connue. Voilà une forme de compression : 64 à 1.
La DCT transforme le bloc en spectre, et là où les valeurs changent brusquement, le coefficient devient positif, et plus la transition est nette, plus le résultat sera élevé. Là où le coefficient est plus élevé, l'image présente des transitions claires de couleur et de luminosité, tandis que là où il est plus faible, il s'agit de changements de composantes YCbCr dans le bloc qui sont faibles (progressifs).
Quantification
C'est à ce moment que les réglages de compression entrent en jeu. Chacun des coefficients dans chaque matrice 8×8 est divisé par un certain nombre. Si vous ne réduisez plus la qualité de l'image après toutes ses modifications, le diviseur doit être 1. Si la mémoire occupée par cette photo vous importe davantage, le diviseur sera supérieur à 1, et le quotient est arrondi. Ainsi, il s'avère qu'après l'arrondi, il reste souvent beaucoup de zéros.
La quantification est réalisée pour permettre une compression encore plus importante. Voici à quoi cela ressemble en prenant l'exemple de la quantification du graphique y = sin(x) :

Compression
On commence par parcourir la matrice en zigzag :

Nous obtenons un tableau unidimensionnel de nombres. Nous voyons qu'il contient beaucoup de zéros, qui peuvent être supprimés. Pour cela, au lieu d'une séquence de nombreux zéros, nous inscrivons un zéro suivi d'un nombre indiquant leur quantité dans la séquence. De cette manière, on peut réduire la taille de l'ensemble du tableau jusqu'à 1/3. Ensuite, il ne reste plus qu'à compresser ce tableau avec la méthode de Huffman et à l'inscrire dans le fichier lui-même.
Utilisé dans
Partout. Comme le PNG, le JPEG est utilisé dans les appareils photo, systèmes d'exploitation (comme logos d'entreprise, icônes d'applications, miniatures) et dans tous les domaines où il faut stocker des images efficacement.
Sortie
À l'heure actuelle, les connaissances sur le JPEG n'ont de valeur que pour des fins éducatives, car il est déjà intégré et optimisé par de grands groupes de personnes, mais la pierre angulaire de la science reste tout de même savoureuse.
Sources
Source : habr.com
