JPEG. Kompressionsalgorithmus

Hallo nochmal! Ich habe diesen Artikel gefunden, der im Mai 2019 geschrieben wurde. Dies ist eine Fortsetzung einer Reihe von Artikeln über WAVE und JPEG. Hier ist der erste . Diese Veröffentlichung enthält Informationen über den Bildcodierungsalgorithmus und das Format selbst als Ganzes.


Eine Prise Geschichte


Ein Esslöffel Wikipedia-Artikel:


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

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


Welche Pfade gehen von roh zu JPEG


Einige Leute denken, dass JPEG-Bilder Rohdaten sind, die mit der Huffman-Methode komprimiert wurden, aber das ist nicht so. Vor der Steuerungskomprimierung sind die Daten ein langer Weg.


Zunächst wird das Farbmodell von RGB auf YCbCr geändert. Hierfür gibt es sogar einen speziellen Algorithmus. 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 gemacht wird, ist die Unterabtastung. Dies ist leicht zu verstehen: Es wird ein 2x2-Array von Pixeln genommen, dann werden Cb und Cr genommen - die Durchschnittswerte jeder YCbCr-Komponente dieser 4 Pixel. Also haben wir 6 Bytes gewonnen , anstatt 4 Y, 4 Cb, 4 Cr, wir haben 4 Y und das gleiche Cb und Cr für jeden von ihnen (4 + 4 + 4 = 12; 4 + 1 + 1 = 6; 12 - 6) = 6). Auf einer Skala von 2x2 klingt die verlustbehaftete Komprimierung mit einem Komprimierungsverhältnis von 2: 1 solide. Dies gilt für das gesamte Bild. Und so - sie sind halb so groß gefallen. Und diese Technik können wir aufgrund unserer Farbwahrnehmung anwenden. Eine Person wird leicht einen Helligkeitsunterschied bemerken, jedoch keinen Farbunterschied, wenn sie in einem kleinen Pixelblock gemittelt wird. Die Ausdünnung kann auch in einer Zeile mit 4 Pixeln horizontal und vertikal erfolgen. Die erste Option wird häufiger verwendet. Wenn die Bildqualität wichtig ist, wird überhaupt keine Ausdünnung durchgeführt.
Visuelle Darstellung der Ausdünnung (Habr hat das Einfügen eines GIF nicht zugelassen) - https://i.ibb.co/Rg5Th9H/150953010617579181.gif


Der Großteil der Vorbereitung

DCT

Jetzt der schwierigste und notwendigste Teil. Das gesamte Bild ist in 8x8-Blöcke unterteilt (verwenden Sie die Auffüllung, falls die Auflösung nicht ein Vielfaches der Seite des Blocks ist).


Jetzt wird für jeden Block DCT (Discrete Cosine Transformation) angewendet. In diesem Teil wird der gesamte Überschuss aus dem Bild entfernt. Mit DCT muss man verstehen, ob dieser Block (8x8) einen monotonen Teil des Bildes beschreibt: Himmel, Wand; oder es enthält eine komplexe Struktur (Haare, Zeichen usw.). Es ist logisch, dass 64 ähnliche Farbpixel in nur einem beschrieben werden können, weil Blockgröße ist bereits bekannt. Soviel zur Komprimierung: 64 zu 1.


DCT verwandelt einen Block in ein Spektrum. Wenn sich die Messwerte abrupt ändern, wird der Koeffizient positiv. Je schärfer der Übergang, desto höher die Ausgabe. Wenn der Koeffizient höher ist, zeigt das Bild deutliche Übergänge in Farbe und Helligkeit, wenn er niedriger ist - schwache (glatte) Änderungen der Werte der YCbCr-Komponenten im Block.


Quantisierung

Es wurden bereits Komprimierungseinstellungen angewendet. Jeder der Koeffizienten in jeder der 8 × 8-Matrizen wird durch eine bestimmte Zahl geteilt. Wenn die Bildqualität nach all ihren Modifikationen nicht mehr abnimmt, sollte der Teiler einer sein. Wenn der von diesem Foto belegte Speicherplatz für Sie wichtiger ist, ist der Divisor größer als 1, und der Quotient wird gerundet. Es stellt sich also heraus, dass es nach dem Runden oft viele Nullen gibt.


Die Quantisierung wird durchgeführt, um eine noch stärkere Komprimierung zu erzielen. So sieht es am Beispiel der Quantisierung des Graphen y = sin (x) aus:


Bild


Kompression

Zuerst gehen wir die Zick-Zack-Matrix durch:


Bild


Wir erhalten ein eindimensionales Array mit Zahlen. Wir sehen, dass es viele Nullen gibt, die entfernt werden können. Dazu geben wir anstelle einer Folge von vielen Nullen 1 Null und danach eine Zahl ein, die ihre Nummer in der Folge angibt. Somit können Sie 1/3 der Größe des gesamten Arrays zurücksetzen. Und dann komprimiert es dieses Array einfach mit der Huffman-Methode und wir geben es in die Datei selbst ein.


Wo wird verwendet


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


Fazit


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


Quellen

Der Wikipedia-Artikel über YCbCr
JPEG-Artikel auf Wikipedia
Ein wenig über DCT von der Post von Picabu
DCT-Artikel auf Wikipedia

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


All Articles