JPEG. Komprimierungsalgorithmus

Hallo wieder! Ich habe diesen Artikel gefunden, der im Mai 2019 geschrieben wurde. Dies ist hier eine Fortsetzung einer Artikelreihe über WAVE und JPEG erste. Diese Veröffentlichung enthält Informationen zum Bildkodierungsalgorithmus und zum Format selbst als Ganzes.

Eine Prise Geschichte

Ein Esslöffel Wikipedia-Artikel:

JPEG (Joint Photographic Experts Group) ist eines der beliebtesten Rastergrafikformate zum Speichern von Fotos und ähnlichen Bildern.

Dieser Standard wurde bereits 1991 von der Joint Photographic Experts Group für eine effiziente Bildkomprimierung entwickelt.

Wie werden Bilder von RAW in JPEG umgewandelt?

Manche Leute denken, dass es sich bei JPEG-Bildern um mit der Huffman-Methode komprimierte Rohdaten handelt, aber das stimmt nicht. Vor der Komprimierung legen die Daten einen langen Weg zurück.

Zunächst wird das Farbmodell von RGB auf YCbCr geändert. Dafür gibt es sogar einen speziellen Algorithmus - hier. Y wird nicht berührt, da es für die Helligkeit verantwortlich ist und seine Änderung spürbar ist.

Das erste, was mit dem Bild zu tun ist, ist "Verdünnung" (Unterabtastung). Es ist leicht zu verstehen: Es wird ein 2x2-Pixel-Array genommen, dann werden Cb und Cr genommen – die Durchschnittswerte jeder der YCbCr-Komponenten dieser 4 Pixel. Also, Wir haben 6 Bytes gewonnen, statt 4 Y, 4 Cb, 4 Cr haben wir 4 Y und das gleiche Cb und Cr für jeden von ihnen (4 + 4 + 4 = 12; 4 + 1 + 1 = 6; 12 - 6 = 6). Selbst im 2x2-Maßstab klingt die verlustbehaftete Komprimierung mit einem Komprimierungsverhältnis von 2:1 solide. Dies gilt für das gesamte Bild. Und so haben sie eine halbe Nummer kleiner gemacht. Und diese Technik können wir dank unserer Farbwahrnehmung nutzen. Eine Person wird leicht einen Unterschied in der Helligkeit bemerken, jedoch nicht in der Farbe, wenn dieser über einen kleinen Pixelblock gemittelt wird. Die Ausdünnung kann auch in einer Linie erfolgen, 4 Pixel horizontal und vertikal. Die erste Option wird häufiger verwendet. Wenn die Bildqualität wichtig ist, wird überhaupt keine Dezimierung durchgeführt.
Eine visuelle Veranschaulichung der Ausdünnung (Habr erlaubte mir nicht, ein GIF einzufügen) - https://i.ibb.co/Rg5Th9H/150953010617579181.gif

Der Hauptteil der Vorbereitung

Dkp

Jetzt kommt der schwierigste und notwendigste Teil. Das gesamte Bild ist in 8x8-Blöcke unterteilt (Füllung wird verwendet, wenn die Auflösung kein Vielfaches der Blockseite ist).

Wenden Sie es nun auf jeden Block an DCT (Diskrete Kosinustransformation). In diesem Teil wird alles Unnötige aus dem Bild genommen. Mithilfe von DCT müssen Sie verstehen, ob ein bestimmter Block (8×8) einen monotonen Teil des Bildes beschreibt: den Himmel, die Wand; oder es enthält eine komplexe Struktur (Haare, Symbole usw.). Es ist logisch, dass 64 Pixel ähnlicher Farbe durch nur 1 beschrieben werden können, denn Die Blockgröße ist bereits bekannt. Soviel zur Komprimierung: 64 zu 1.

DCT wandelt den Block in ein Spektrum um, und wenn sich die Messwerte stark ändern, wird der Koeffizient positiv, und je schärfer der Übergang, desto höher ist die Ausgabe. Wo der Koeffizient höher ist, zeigt das Bild deutliche Übergänge in Farbe und Helligkeit, wo er niedriger ist – schwache (sanfte) Änderungen der Werte der YCbCr-Komponenten im Block.

Quantisierung

Die Komprimierungseinstellungen sind hier bereits angewendet. Jeder der Koeffizienten in jeder der 8x8-Matrizen wird durch eine bestimmte Zahl dividiert. Wenn Sie die Bildqualität nach all den Änderungen nicht beeinträchtigen, sollte der Teiler eins sein. Wenn Ihnen der Speicher, den dieses Foto einnimmt, wichtiger ist, ist der Divisor größer als 1 und der Quotient wird gerundet. Es stellt sich heraus, dass man nach dem Runden oft viele Nullen erhält.

Die Quantisierung erfolgt, um die Möglichkeit einer noch stärkeren Komprimierung zu schaffen. So sieht es am Beispiel der Quantisierung des Graphen y = sin(x) aus:

JPEG. Komprimierungsalgorithmus

Kompression

Zuerst gehen wir die Matrix im Zick-Zack-Muster durch:

JPEG. Komprimierungsalgorithmus

Wir erhalten ein eindimensionales Array mit Zahlen. Wir sehen, dass es viele Nullen gibt, die entfernt werden können. Dazu geben wir statt einer Folge von vielen Nullen eine Null ein und dahinter eine Zahl, die deren Nummer in der Folge angibt. Auf diese Weise können Sie die Größe des gesamten Arrays auf 1/1 zurücksetzen. Und dann komprimieren wir dieses Array einfach mit der Huffman-Methode und schreiben es in die Datei selbst.

Wo zu verwenden

Überall. Wie PNG wird JPEG in Kameras, Betriebssystemen (als Firmenlogos, Anwendungssymbole, Miniaturansichten) und in allen möglichen Bereichen verwendet, in denen Bilder effizient gespeichert werden müssen.

Abschluss

Im Moment ist das Wissen über JPEG nur noch für Bildungszwecke wertvoll, da es bereits überall eingebaut und von großen Gruppen von Menschen optimiert ist, aber der Granit der Wissenschaft ist immer noch lecker.

Quellen

Artikel über YCbCr auf Wikipedia
Wikipedia-Artikel zu JPEG
Ein wenig über PrEP aus dem Pikabu-Beitrag
Wikipedia-Artikel zu PrEP

Source: habr.com

Kommentar hinzufügen