Jpeg. Algorithme de compression

Bonjour encore! J'ai trouvé cet article, écrit en mai 2019. Il s'agit d'une suite d'une série d'articles sur WAVE et JPEG, voici le 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 Wikipedia:


JPEG (Joint Photographic Experts Group) est l'un des formats graphiques raster les plus utilisés pour le stockage d'images photo et d'images similaires.

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


Quels chemins vont du raw au jpeg


Certaines personnes pensent que les images JPEG sont des données brutes compressées par la méthode Huffman, mais ce n'est pas le cas. Avant de contrôler la compression, les données vont très loin.


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é, car il est responsable de la luminosité, et son changement sera perceptible.


La première chose que l'on fait avec l'image est le sous-échantillonnage. Ceci est facile à comprendre: un tableau 2x2 de pixels est pris, puis Cb et Cr sont pris - les valeurs moyennes de chacun des composants YCbCr de ces 4 pixels. Et donc, nous avons gagné 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). Sur 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 baissé de moitié. Et nous pouvons utiliser cette technique en raison de notre perception des couleurs. Une personne remarquera facilement une différence de luminosité, mais pas de couleur, si elle est calculée en moyenne sur un petit bloc de pixels. L'amincissement peut également être effectué en ligne, 4 pixels horizontalement et verticalement. La première option est utilisée plus souvent. Si la qualité d'image est importante, l'amincissement n'est pas effectué du tout.
Illustration visuelle de l'amincissement (Habr n'a pas permis d'insérer un gif) - https://i.ibb.co/Rg5Th9H/150953010617579181.gif


La majeure partie de la préparation

DCT

Maintenant, la partie la plus difficile et la plus nécessaire. L'image entière est divisée en blocs 8x8 (utilisez un remplissage au cas où la résolution ne serait pas un multiple du côté du bloc).


Désormais, pour chaque bloc, la DCT (Discrete Cosine Transformation) est appliquée. Dans cette partie, tout l'excédent est retiré de l'image. A l'aide de DCT, il est nécessaire de comprendre si ce bloc (8x8) décrit une partie monotone de l'image: ciel, mur; ou il contient une structure complexe (cheveux, personnages, etc.). Il est logique que 64 pixels de couleur similaires puissent être décrits en un seul, car la taille des blocs est déjà connue. Voilà pour la compression: 64 à 1.


Le DCT transforme un bloc en spectre, et lorsque les lectures changent brusquement, le coefficient devient positif et plus la transition est nette, plus la sortie est élevée. Lorsque le coefficient est plus élevé, l'image montre des transitions claires de couleur et de luminosité, où elle est plus faible - des changements faibles (lisses) des valeurs des composants YCbCr dans le bloc.


Quantification

Des paramètres de compression sont déjà appliqués. Chacun des coefficients de chacune des matrices 8x8 est divisé par un certain nombre. Si la qualité de l'image après toutes ses modifications ne diminuera pas davantage, 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 donc qu'après avoir arrondi souvent, il s'avère qu'il y a beaucoup de zéros.


La quantification est effectuée pour créer encore plus de compression. Voici à quoi cela ressemble sur l'exemple de quantification du graphe y = sin (x):


image


La compression

Nous passons d'abord par la matrice en zig-zag:


image


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 cela un nombre indiquant leur nombre dans la séquence. Ainsi, vous pouvez réinitialiser à 1/3 de la taille de l'ensemble du tableau. Et puis il compresse simplement ce tableau en utilisant la méthode Huffman et nous le saisissons dans le fichier lui-même.


Où est utilisé


Partout. Comme PNG, JPEG est utilisé dans les caméras, les systèmes d'exploitation (comme logos d'entreprise, icônes d'application, miniatures) et dans tous les domaines possibles où vous devez stocker efficacement des images.


Conclusion


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


Les sources

L'article Wikipedia sur YCbCr
Article JPEG sur Wikipédia
Un peu sur DCT du post de Picabu
Article du DCT sur Wikipédia

Source: https://habr.com/ru/post/fr482728/


All Articles