Und wieder hallo! Ich habe diesen Artikel gefunden, der bereits im Mai 2019 geschrieben wurde. Dies ist die Fortsetzung einer Reihe von Artikeln ĂŒber WAVE und JPEG. Diese Veröffentlichung wird Informationen ĂŒber den Bildcodierungsalgorithmus und das Format selbst enthalten.
Eine Prise Geschichte
Ein Esslöffel Wikipedia-Artikel:
JPEG (Joint Photographic Experts Group) ist eines der gÀngigen Rastergrafikformate, das zur Speicherung von Fotobildern und Àhnlichen Bildern verwendet wird.
Dieser Standard wurde 1991 von der gemeinsamen Gruppe von Fotografieexperten entwickelt, um eine effiziente Bildkompression zu ermöglichen.
Welchen Weg nehmen Bilder vom Rohformat bis JPEG
Einige glauben, dass JPEG-Bilder komprimierte Rohdaten mit Huffman-Codierung sind, aber das ist nicht der Fall. Vor der kompakten Speicherung durchlaufen die Daten einen langen Prozess.
Zuerst wird das Farbmodell von RGB auf YCbCr geĂ€ndert. DafĂŒr gibt es sogar einen speziellen Algorithmus â . Y bleibt unverĂ€ndert, da es fĂŒr die Helligkeit verantwortlich ist, und seine VerĂ€nderung wird deutlich wahrgenommen.
Das Erste, was mit dem Bild gemacht wird, ist das âSubsamplingâ (Subsampling). Es ist einfach zu verstehen: Ein 2x2-Pixelarray wird verwendet, dann werden die Cb- und Cr-Werte â die Mittelwerte jeder der YCbCr-Komponenten dieser 4 Pixel â genommen. So gewinnen wir 6 Byte, anstatt 4 Y, 4 Cb, 4 Cr erhalten wir 4 Y und identische Cb- und Cr-Werte fĂŒr jeden von ihnen (4 + 4 + 4 = 12; 4 + 1 + 1 = 6; 12 â 6 = 6). Selbst bei einer 2Ă2-Kompensation klingt eine verlustbehaftete Kompression mit einem KompressionsverhĂ€ltnis von 2:1 solide. Dies wird auf das gesamte Bild angewendet. Und so haben wir die GröĂe um die HĂ€lfte reduziert. Diese Methode können wir aufgrund unseres Farbsehens nutzen. Ein Mensch wird problemlos einen Unterschied in der Helligkeit wahrnehmen, nicht aber in der Farbe, wenn sie durchschnittlich in einem kleinen Block von Pixeln ist. Auch das Subsampling kann in einer Linie durchgefĂŒhrt werden, 4 Pixel horizontal und vertikal. Die erste Methode wird hĂ€ufiger verwendet. Wenn die BildqualitĂ€t wichtig ist, wird kein Subsampling durchgefĂŒhrt.
Eine anschauliche Darstellung von Subsampling (Habr erlaubte kein EinfĂŒgen des GIFs) â
Der Hauptteil der Vorbereitung
DCT
Jetzt kommt der schwierigste und notwendigste Teil. Das gesamte Bild wird in Blöcke von 8x8 unterteilt (es wird Padding verwendet, wenn die Auflösung nicht ein Vielfaches der Blockseite ist).
Jetzt wird auf jeden Block angewandt DCT (diskrete Kosinustransformation). In diesem Teil des Bildes wird alles ĂberflĂŒssige entfernt. Mithilfe der DCT muss festgestellt werden, ob dieser Block (8Ă8) einen monotonen Teil des Bildes beschreibt: Himmel, WĂ€nde; oder ob er eine komplexe Struktur enthĂ€lt (Haare, Symbole usw.). Es ist logisch, dass 64 Ă€hnlich gefĂ€rbte Pixel nur mit einem beschrieben werden können, da die BlockgröĂe bereits bekannt ist. Das ist die Kompression: 64 zu 1.
Die DCT verwandelt den Block in ein Spektrum, und dort, wo die Werte abrupt wechseln, wird der Koeffizient positiv, und je schĂ€rfer der Ăbergang, desto höher ist das Ergebnis. Dort, wo der Koeffizient höher ist, sind auf dem Bild deutliche ĂbergĂ€nge in Farbe und Helligkeit dargestellt, wo er niedriger ist, sind schwache (sanfte) Ănderungen der YCbCr-Komponenten im Block.
Quantisierung
Hier werden bereits die Kompressionseinstellungen angewendet. Jeder der Koeffizienten in jeder der 8Ă8 Matrizen wird durch eine bestimmte Zahl geteilt. Wenn Sie die BildqualitĂ€t nach all seinen Modifikationen nicht weiter reduzieren möchten, sollte der Teiler eins sein. Wenn Ihnen wichtiger ist, der Speicher, den dieses Foto belegt, dann wird der Teiler gröĂer als 1 sein, und das Ergebnis wird gerundet. So kommt es oft vor, dass nach der Rundung viele Nullen entstehen.
Die Quantisierung erfolgt, um die Möglichkeit einer weiteren Kompression zu schaffen. So sieht das am Beispiel der Quantisierung der Funktion y = sin(x) aus:

Kompression
Zuerst gehen wir zigzagartig durch die Matrix:

Wir erhalten ein eindimensionales Array mit Zahlen. Wir sehen, dass es viele Nullen darin gibt, diese können entfernt werden. DafĂŒr schreiben wir anstelle einer Folge von vielen Nullen 1 Null und danach die Zahl, die die Menge in der Folge angibt. So kann die gesamte ArraygröĂe auf 1/3 reduziert werden. Und anschlieĂend wird dieses Array einfach mit der Huffman-Methode komprimiert und bereits in die Datei eingefĂŒgt.
Verwendung
Ăberall. Wie PNG wird JPEG in Kameras, Betriebssystemen (als Unternehmenslogos, Anwendungssymbole, Thumbnails) und in allen möglichen Bereichen eingesetzt, wo eine effiziente Speicherung von Bildern erforderlich ist.
Ausgabe
Aktuell sind Kenntnisse ĂŒber JPEG nur zu Bildungszwecken wertvoll, denn es ist bereits ĂŒberall integriert und von groĂen Gruppen von Menschen optimiert worden, aber das Wissen bleibt dennoch ansprechend.
Quellen
Quelle: habr.com
