JPEG. Kompressionsalgorithmus

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. ersteDiese 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 — hier. 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) — https://i.ibb.co/Rg5Th9H/150953010617579181.gif

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:

JPEG. Kompressionsalgorithmus

Kompression

Zuerst gehen wir zigzagartig durch die Matrix:

JPEG. Kompressionsalgorithmus

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

Artikel über YCbCr auf Wikipedia
Artikel über JPEG auf Wikipedia
Ein wenig über die DCT aus dem Post auf Pikabu
Artikel über DCT auf Wikipedia

Quelle: habr.com

60GB SSD 8Gb DDR4