So funktioniert das JPEG-Format

JPEG-Bilder sind überall in unserem digitalen Leben zu finden, aber hinter dieser Abdeckung des Bewusstseins stecken Algorithmen, die Details eliminieren, die vom menschlichen Auge nicht wahrgenommen werden. Das Ergebnis ist die höchste visuelle Qualität bei kleinster Dateigröße - aber wie genau funktioniert das alles? Mal sehen, was genau unsere Augen nicht sehen!




Es ist einfach, die Möglichkeit, ein Foto an einen Freund zu senden, als selbstverständlich zu betrachten und sich keine Gedanken darüber zu machen, welches Gerät, welcher Browser oder welches Betriebssystem verwendet wird. Dies war jedoch nicht immer der Fall. In den frühen 1980er Jahren wussten Computer, wie man digitale Bilder speichert und anzeigt, aber es gab viele konkurrierende Ideen, wie dies am besten möglich ist. Es war unmöglich, einfach ein Bild von einem Computer auf einen anderen zu senden und zu hoffen, dass alles funktionierte.

Um dieses Problem zu lösen, wurde 1986 in Zusammenarbeit mit der Internationalen Organisation für Normung (ISO) und der Internationalen Elektrotechnischen Kommission (IEC) ein Expertenkomitee aus der ganzen Welt unter dem Namen Joint Photographic Experts Group (JPEG) zusammengestellt ) - zwei internationale Normungsorganisationen mit Hauptsitz in Genf (Schweiz).

Eine Gruppe von Personen namens JPEG schuf 1992 den JPEG-Standard für die digitale Bildkomprimierung. Jeder, der das Internet nutzt, stößt wahrscheinlich auf JPEG-codierte Bilder. Dies ist die häufigste Methode zum Codieren, Senden und Speichern von Bildern. Von Webseiten über E-Mails bis hin zu sozialen Netzwerken wird JPEG milliardenfach am Tag verwendet - fast jedes Mal, wenn wir ein Bild online ansehen oder senden. Ohne JPEG wäre das Web weniger lebendig, langsamer und wahrscheinlich weniger Katzenbilder!

In diesem Artikel wird beschrieben, wie Sie ein JPEG-Bild dekodieren. Mit anderen Worten, was erforderlich ist, um auf einem Computer gespeicherte komprimierte Daten in ein Bild umzuwandeln, das auf dem Bildschirm angezeigt wird. Es ist wichtig, darüber Bescheid zu wissen, nicht nur, weil es wichtig ist, die Technologie zu verstehen, die wir täglich verwenden, sondern auch, weil wir bei der Offenlegung der Kompressionsstufen die Wahrnehmung und das Sehen sowie die Details, für die unsere Augen am empfindlichsten sind, besser verstehen.

Außerdem ist es sehr interessant, auf diese Weise mit Bildern zu spielen.



Blick in ein JPEG


Auf einem Computer wird alles als Folge von Binärzahlen gespeichert. Typischerweise sind diese Bits, Nullen und Einsen, in acht gruppiert und bilden Bytes. Wenn Sie ein JPEG-Bild auf einem Computer öffnen, sollte etwas (Browser, Betriebssystem, etwas anderes) die Bytes dekodieren und das Originalbild in Form einer Liste von Farben wiederherstellen, die angezeigt werden können.

Wenn Sie dieses süße Katzenfoto herunterladen und in einem Texteditor öffnen, sehen Sie eine Reihe inkohärenter Zeichen.


Hier verwende ich Notepad ++, um den Inhalt einer Datei zu untersuchen, da normale Texteditoren wie Notepad von Windows die Binärdatei nach dem Speichern beschädigen und das JPEG-Format nicht mehr erfüllen.

Wenn Sie ein Bild in einem Texteditor öffnen, verwirren Sie den Computer, genauso wie Sie Ihr Gehirn verwirren, wenn Sie sich die Augen reiben und anfangen, farbige Flecken zu sehen!

Diese Flecken, die Sie sehen, werden als Phosphene bezeichnet und sind nicht das Ergebnis der Exposition gegenüber einem Lichtreiz oder Halluzinationen, die vom Geist erzeugt werden. Sie treten auf, weil Ihr Gehirn glaubt, dass elektrische Signale in den Sehnerven Informationen über das Licht übertragen. Das Gehirn muss solche Annahmen treffen, da es unmöglich ist zu wissen, ob das Signal Ton, Vision oder irgendetwas anderes ist. Alle Nerven im Körper übertragen genau die gleichen elektrischen Impulse. Durch Drücken auf die Augen senden Sie Signale, die nicht visuell sind, sondern die Rezeptoren des Auges aktivieren, die Ihr Gehirn - in diesem Fall falsch - als etwas Visuelles interpretiert. Sie können buchstäblich den Druck sehen!

Es ist lustig darüber nachzudenken, wie Computer wie ein Gehirn aussehen, aber es ist auch eine nützliche Analogie, die zeigt, wie stark die Bedeutung von Daten, die von Nerven durch den Körper übertragen oder auf einem Computer gespeichert werden, von ihrer Interpretation abhängt. Alle Binärdaten bestehen aus Nullen und Einsen, Grundkomponenten, die Informationen jeglicher Art übertragen können. Ihr Computer errät häufig anhand von Hinweisen wie Dateierweiterungen, wie sie interpretiert werden sollen. Und jetzt zwingen wir ihn, sie als Text zu interpretieren, wie es der Texteditor erwartet.

Um zu verstehen, wie JPEG dekodiert wird, müssen wir die Originalsignale selbst sehen - Binärdaten. Dies kann mit dem Hex-Editor oder direkt auf der Webseite des Originalartikels erfolgen ! Es gibt ein Bild, neben dem im Textfeld alle Bytes (außer der Kopfzeile) in Dezimalform angezeigt werden. Sie können sie ändern, und das Skript wird sofort neu codieren und ein neues Bild erstellen.



Sie können viel lernen, indem Sie einfach mit diesem Editor spielen. Können Sie beispielsweise feststellen, in welcher Reihenfolge die Pixel gespeichert sind?

In diesem Beispiel ist es seltsam, dass das Ändern einiger Zahlen das Bild überhaupt nicht beeinflusst. Wenn Sie beispielsweise die Zahl 17 in der ersten Zeile durch 0 ersetzen, wird das Foto vollständig beschädigt!



Andere Änderungen, zum Beispiel das Ersetzen von 7 in Zeile 1988 durch die Nummer 254, ändern die Farbe, jedoch nur der nachfolgenden Pixel.



Das Seltsamste ist vielleicht, dass einige Zahlen nicht nur die Farbe, sondern auch die Form des Bildes ändern. Ändern Sie 70 in Zeile 12 in 2 und schauen Sie in die obere Reihe des Bildes, um zu sehen, was ich meine.



Unabhängig davon, welches JPEG-Bild Sie verwenden, finden Sie diese kryptischen Schachsequenzen beim Bearbeiten von Bytes immer.

Wenn Sie mit dem Editor spielen, ist es schwer zu verstehen, wie das Foto aus diesen Bytes neu erstellt wird, da die JPEG-Komprimierung aus drei verschiedenen Technologien besteht, die nacheinander über die Ebenen hinweg angewendet werden. Wir werden jeden von ihnen einzeln untersuchen, um das mysteriöse Verhalten zu enthüllen, das wir beobachten.

Drei Stufen der JPEG-Komprimierung:

  1. Farb-Downsampling .
  2. Diskrete Cosinustransformation und Diskretisierung .
  3. Codierung von Serienlängen , Delta und Huffman

Damit Sie sich die Komprimierungsskala vorstellen können, beachten Sie bitte, dass das obige Bild 79.819 Zahlen darstellt, dh ungefähr 79 KB. Wenn wir es ohne Komprimierung speichern würden, wären für jedes Pixel drei Zahlen erforderlich - für die rote, grüne und blaue Komponente. Das wären 917.700 Zahlen oder ca. 917 Kb. Infolge der JPEG-Komprimierung hat sich die resultierende Datei um mehr als das Zehnfache verringert!

Tatsächlich kann dieses Bild viel stärker komprimiert werden. Unten sehen Sie zwei Bilder nebeneinander - das Foto rechts wurde auf 16 KB verkleinert, das ist 57-mal kleiner als die unkomprimierte Version!



Wenn Sie genau hinschauen, werden Sie feststellen, dass diese Bilder nicht identisch sind. Beide sind Bilder mit JPEG-Komprimierung, aber das richtige ist viel kleiner. Es sieht auch etwas schlechter aus (siehe die Quadrate der Hintergrundfarben). Daher wird JPEG auch als verlustbehaftete Komprimierung bezeichnet. Während der Komprimierung ändert sich das Bild und verliert einige Details.

1. Farb-Downsampling


Hier ist ein Bild, das nur die erste Komprimierungsstufe verwendet.


(Interaktive Version - im Originalartikel ). Durch Entfernen einer Zahl werden alle Farben zerstört. Wenn Sie jedoch genau sechs Zahlen löschen, hat dies praktisch keine Auswirkungen auf das Bild.

Jetzt sind die Zahlen etwas leichter zu entziffern. Dies ist eine fast einfache Liste von Farben, bei der jedes Byte genau ein Pixel ändert, gleichzeitig aber bereits halb so groß ist wie ein unkomprimiertes Bild (das bei einer derart reduzierten Größe etwa 300 KB einnehmen würde). Ratet mal warum?

Sie können sehen, dass diese Zahlen nicht die Standardkomponenten Rot, Grün und Blau bezeichnen. Wenn wir alle Zahlen durch Nullen ersetzen, erhalten wir ein grünes Bild (und kein Weiß).



Dies liegt daran, dass diese Bytes Y (Helligkeit) anzeigen.



Cb (relative Blauheit),



und Cr-Bilder (relative Rötung).



Warum nicht RGB verwenden? So funktionieren die meisten modernen Bildschirme. Ihr Monitor kann jede Farbe anzeigen, einschließlich Rot, Grün und Blau mit unterschiedlichen Intensitäten für jedes Pixel. Weiß wird erhalten, indem alle drei bei voller Helligkeit eingeschaltet werden, und Schwarz, indem sie ausgeschaltet werden.



Es ist auch der Arbeit des menschlichen Auges sehr ähnlich. Die Farbrezeptoren unserer Augen werden als " Zapfen " bezeichnet und sind in drei Typen unterteilt, von denen jeder empfindlicher auf Rot, Grün oder Blau reagiert. [Zapfen vom Typ S sind in Violettblau empfindlich (S von English Short - Shortwave) Spektrum), M-Typ - in grün-gelb (M aus dem Englischen. Mittel - Mittelwelle) und L-Typ - in den gelb-roten (L aus dem Englischen. Lang - langwellig) Teilen des Spektrums. Das Vorhandensein dieser drei Arten von Zapfen (und Stäbchen, die im smaragdgrünen Teil des Spektrums empfindlich sind) gibt einer Person Farbsehen. / ca. übersetzt.]. Stäbchen , eine andere Art von Fotorezeptor in unseren Augen, können nur Helligkeitsänderungen erfassen, sind jedoch viel empfindlicher. In unseren Augen gibt es ungefähr 120 Millionen Stäbchen und nur 6 Millionen Zapfen.

Daher bemerken unsere Augen Helligkeitsänderungen viel besser als Farbänderungen. Wenn Sie die Farbe von der Helligkeit trennen, können Sie ein wenig Farbe entfernen, und niemand wird etwas bemerken. Beim Farb-Downsampling werden die Farbkomponenten eines Bildes mit einer niedrigeren Auflösung als die Helligkeitskomponenten dargestellt. Im obigen Beispiel hat jedes Pixel genau eine Y-Komponente, und jede einzelne Gruppe von vier Pixeln hat genau eine Cb-Komponente und ein Cr. Daher enthält das Bild viermal weniger Farbinformationen als das Original.

Der YCbCr-Farbraum wird nicht nur in JPEG verwendet. Es wurde ursprünglich 1938 für Fernsehshows erfunden. Nicht jeder hat einen Farbfernseher, so dass durch die Trennung von Farbe und Helligkeit jeder das gleiche Signal empfangen konnte, und Fernseher ohne Farbe verwendeten nur die Helligkeitskomponente.

Wenn Sie also eine Zahl aus dem Editor löschen, werden alle Farben vollständig zerstört. Komponenten werden als JJJJ Cb Cr gespeichert (tatsächlich nicht unbedingt in dieser Reihenfolge - die Speicherreihenfolge wird im Dateikopf angegeben). Das Entfernen der ersten Zahl führt dazu, dass der erste Cb-Wert als Y, Cr als Cb wahrgenommen wird und insgesamt ein Dominoeffekt auftritt, der alle Farben des Bildes wechselt.

Die JPEG-Spezifikation verpflichtet Sie nicht zur Verwendung von YCbCr. In den meisten Dateien wird es jedoch verwendet, da es nach dem Downsampling Bilder mit besserer Qualität liefert als RGB. Aber du musst nicht mein Wort dafür nehmen. Überzeugen Sie sich in der folgenden Tabelle, wie das Downsampling jeder einzelnen Komponente in RGB und YCbCr aussehen wird.


(Interaktive Version - im Originalartikel ).

Das Entfernen von Blau ist nicht so auffällig wie das Entfernen von Rot oder Grün. Dies liegt an den sechs Millionen Zapfen in Ihren Augen, etwa 64% reagieren empfindlich auf Rot, 32% auf Grün und 2% auf Blau.

Die Unterabtastung der Komponente Y (unten links) ist am besten zu sehen. Auffällig ist sogar eine geringfügige Änderung.

Durch das Konvertieren eines Bilds von RGB in YCbCr wird die Dateigröße nicht verringert, es wird jedoch einfacher, weniger auffällige Details zu finden, die entfernt werden können. In der zweiten Stufe tritt eine verlustbehaftete Komprimierung auf. Es basiert auf der Idee, Daten in einer komprimierbareren Form darzustellen.

2. Diskrete Cosinustransformation und Diskretisierung


Diese Komprimierungsstufe bestimmt größtenteils die Essenz von JPEG. Nach dem Konvertieren von Farben in YCbCr werden die Komponenten separat komprimiert, sodass wir uns erst später auf die Y-Komponente konzentrieren können. So sehen die Bytes der Y-Komponente nach dem Anwenden dieser Ebene aus.


(Interaktive Version - im Originalartikel ). Wenn Sie in der interaktiven Version auf ein Pixel klicken, wird der Editor zu der Zeile gescrollt, die dies angibt. Versuchen Sie, Zahlen vom Ende zu entfernen oder einer bestimmten Zahl einige Nullen hinzuzufügen.

Auf den ersten Blick sieht es nach einer sehr schlechten Komprimierung aus. Das Bild enthält 100.000 Pixel, und 102.400 Zahlen sind erforderlich, um ihre Helligkeit (Y-Komponenten) anzuzeigen - dies ist schlimmer, als überhaupt nichts zu komprimieren!

Beachten Sie jedoch, dass die meisten dieser Zahlen Null sind. Darüber hinaus können alle diese Nullen am Zeilenende gelöscht werden, ohne das Bild zu ändern. Es sind noch ungefähr 26.000 Nummern übrig, und das ist fast viermal weniger!

Auf dieser Ebene liegt das Geheimnis der Schachmuster. Im Gegensatz zu anderen Effekten, die wir gesehen haben, ist das Erscheinungsbild dieser Muster kein Fehler. Sie sind die Bausteine ​​des gesamten Bildes. Jede Zeile des Editors enthält genau 64 Zahlen, diskrete Cosinustransformationskoeffizienten (DCT), die Intensitäten von 64 eindeutigen Mustern entsprechen.

Diese Muster werden auf der Basis des Kosinusgraphen gebildet. Hier sind einige davon:


8 von 64 Gewinnchancen

Unten sehen Sie ein Bild, das alle 64 Muster zeigt.


(Interaktive Version - im Originalartikel ).

Diese Muster sind von besonderer Bedeutung, da sie die Grundlage für 8x8-Bilder bilden. Wenn Sie mit linearer Algebra nicht vertraut sind, bedeutet dies, dass aus diesen 64 Mustern jedes 8x8-Bild erhalten werden kann. Bei DCT werden Bilder in 8 x 8 Blöcke unterteilt und jeder Block in eine Kombination dieser 64 Koeffizienten umgewandelt.

Die Tatsache, dass jedes Bild aus 64 spezifischen Mustern bestehen kann, scheint magisch. Dies ist jedoch dasselbe wie zu sagen, dass jeder Ort auf der Erde durch zwei Zahlen beschrieben werden kann - Breite und Länge [was Hemisphären anzeigt / ca. übersetzt.]. Wir betrachten die Erdoberfläche oft als zweidimensional, daher benötigen wir nur zwei Zahlen. Ein 8x8-Bild hat 64 Dimensionen, daher benötigen wir 64 Zahlen.

Es ist noch nicht klar, wie uns dies im Sinne der Komprimierung hilft. Wenn wir 64 Zahlen benötigen, um ein 8x8-Bild darzustellen, warum ist dies besser, als nur 64 Luminanzkomponenten zu speichern? Wir tun dies aus dem gleichen Grund, aus dem wir drei RGB-Nummern in drei YCbCr-Nummern umgewandelt haben: Dadurch können wir unsichtbare Details entfernen.

Es ist schwer zu erkennen, welche Details zu diesem Zeitpunkt genau entfernt werden, da JPEG DCT auf 8x8-Blöcke anwendet. Niemand verbietet uns jedoch, es auf das ganze Bild anzuwenden. So sieht DCT in Komponente Y aus, wenn es auf das gesamte Bild angewendet wird:



Am Ende können Sie mehr als 60.000 Nummern löschen, ohne dass sich das Foto merklich ändert.



Beachten Sie jedoch, dass der Unterschied offensichtlich ist, wenn wir die ersten fünf Zahlen zurücksetzen.



Die Zahlen am Anfang zeigen niederfrequente Änderungen im Bild an, und unsere Augen nehmen sie am besten auf. Die Zahlen am Ende zeigen Änderungen bei hohen Frequenzen an, die schwieriger zu bemerken sind. Um zu sehen, was mit dem Auge nicht sichtbar ist, können wir diese hochfrequenten Teile isolieren, indem wir die ersten 5000 Zahlen auf Null setzen.



Wir sehen alle Bereiche des Bildes, in denen die größte Änderung von Pixel zu Pixel auftritt. Die Augen der Katze, sein Schnurrbart, die Frotteedecke und die Schatten in der unteren linken Ecke fallen auf. Sie können noch weiter gehen, indem Sie die ersten 10.000 Zahlen löschen:



20.000:



40.000:



60.000:



Diese Hochfrequenzteile sind JPEG und werden während der Komprimierungsphase gelöscht. Das Konvertieren von Farben in DCT-Koeffizienten ist verlustfrei. Verluste werden im Diskretisierungsschritt erzeugt, bei dem Hochfrequenzwerte oder nahe Null entfernt werden. Wenn Sie die Qualität des Speicherns von JPEG verringern, erhöht das Programm den Schwellenwert für die Anzahl der gelöschten Werte, wodurch die Dateigröße verringert wird, das Bild jedoch pixeliger wird. Daher sah das Bild im ersten Abschnitt, das 57-mal kleiner war, so aus. Jeder 8x8-Block schien im Vergleich zu einer besseren Version eine viel geringere Anzahl von DCT-Koeffizienten zu haben.

Sie können einen coolen Effekt erzielen, z. B. das schrittweise Streamen von Bildern. Sie können ein verschwommenes Bild anzeigen, das detaillierter wird, wenn immer mehr Koeffizienten heruntergeladen werden.

Hier, nur zum Spaß, was passiert, wenn nur 24.000 Zahlen verwendet werden:



Oder nur 5000:



Sehr verschwommen, aber als ob erkennbar!

3. Codierung von Serienlängen, Delta und Huffman


Bisher sind alle Komprimierungsstufen mit Verlusten verbunden. Die letzte Etappe verläuft dagegen verlustfrei. Es löscht keine Informationen, reduziert jedoch die Dateigröße erheblich.

Wie können Sie etwas komprimieren, ohne Informationen zu verwerfen? Stellen Sie sich vor, wie wir ein einfaches schwarzes Rechteck 700 x 437 beschreiben würden.

JPEG verwendet hierfür 5000 Zahlen, aber es kann ein viel besseres Ergebnis erzielt werden. Können Sie sich ein Codierungsschema vorstellen, das ein solches Bild mit möglichst wenigen Bytes beschreibt?

Das minimale Schema, das ich mir ausdenken könnte, verwendet vier: drei, um die Farbe anzuzeigen, und das vierte - wie viele Pixel haben diese Farbe. Die Idee, wiederholte Werte auf solch komprimierte Weise darzustellen, wird als Serienlängencodierung bezeichnet. Es gibt keine Verluste, da wir die verschlüsselten Daten in ihrer ursprünglichen Form wiederherstellen können.

Die Größe einer JPEG-Datei mit einem schwarzen Rechteck ist viel größer als 4 Byte. Denken Sie daran, dass auf DCT-Ebene die Komprimierung auf Blöcke mit 8 x 8 Pixel angewendet wird. Daher benötigen wir mindestens einen DCT-Koeffizienten pro 64 Pixel. Wir brauchen einen, weil wir anstelle eines einzelnen DCT-Koeffizienten gefolgt von 63 Nullen durch Codieren der Längen der Reihe eine Zahl speichern und angeben können, dass „alle anderen Nullen sind“.

Die Delta-Codierung ist eine Technik, bei der jedes Byte eine Differenz zu einem bestimmten Wert und nicht zu einem absoluten Wert enthält. Daher ändert das Bearbeiten bestimmter Bytes die Farbe aller anderen Pixel. Zum Beispiel anstatt zu speichern

12 13 14 14 14 13 13 14

Wir könnten mit 12 beginnen und dann einfach angeben, wie viel wir addieren oder subtrahieren müssen, um die nächste Zahl zu erhalten. Und diese Sequenz in der Delta-Codierung hat die Form:

12 1 1 0 0 -1 0 1 Die

konvertierten Daten werden nicht weniger als das Original erhalten, aber es ist bereits einfacher, sie zu komprimieren. Die Verwendung der Delta-Codierung vor der Codierung von Serienlängen kann sehr hilfreich sein, während die verlustfreie Komprimierung erhalten bleibt.

Die Delta-Codierung ist eine der wenigen Techniken, die außerhalb von 8x8-Blöcken verwendet werden. Von den 64 DCT-Koeffizienten ist einer einfach eine Konstantwellenfunktion (Volltonfarbe). Es repräsentiert die durchschnittliche Helligkeit jedes Blocks für die Luminanzkomponenten oder die durchschnittliche Blauheit für die Cb-Komponenten und so weiter. Der erste Wert jedes DCT-Blocks wird als DC-Wert bezeichnet, und jeder DC-Wert wird in Bezug auf die vorherigen Delta-Codierungen unterzogen. Daher wirkt sich eine Änderung der Helligkeit des ersten Blocks auf alle Blöcke aus.

Das letzte Rätsel bleibt: Wie verdirbt die singuläre Veränderung das ganze Bild? Bisher hatten Komprimierungsstufen keine solchen Eigenschaften. Die Antwort liegt im JPEG-Header. Die ersten 500 Bytes enthalten Metadaten zu Bild - Breite, Höhe usw., mit denen wir bisher nicht gearbeitet haben.

Ohne Header ist es fast unmöglich (gut oder sehr schwierig), JPEG zu dekodieren. Es wird so aussehen, als würde ich versuchen, Ihnen das Bild zu beschreiben und Worte zu erfinden, um meinen Eindruck zu vermitteln. Die Beschreibung wird wahrscheinlich sehr prägnant sein, da ich Wörter mit genau der Bedeutung erfinden kann, die ich vermitteln möchte, aber für alle anderen werden sie keinen Sinn ergeben.

Es klingt dumm, aber genau das passiert. Jedes JPEG-Bild wird mit spezifischen Codes komprimiert. Ein Header von Codes wird in der Kopfzeile gespeichert. Diese Technik wird als Huffman-Code bezeichnet, und das Wörterbuch wird als Huffman-Tabelle bezeichnet. In der Kopfzeile wird die Tabelle mit zwei Bytes markiert - 255 und dann 196. Jede Farbkomponente kann eine eigene Tabelle haben.

Änderungen an den Tabellen wirken sich radikal auf jedes Bild aus. Ein gutes Beispiel ist das Ändern von 1 zu 12 in der 15. Zeile.



Dies liegt daran, dass die Tabellen angeben, wie einzelne Bits gelesen werden sollen. Bisher haben wir nur mit Binärzahlen in Dezimalform gearbeitet. Dies verbirgt uns jedoch die Tatsache, dass, wenn Sie die Nummer 1 in einem Byte speichern möchten, diese wie 00000001 aussieht, da jedes Byte genau acht Bits haben sollte, selbst wenn nur eines von ihnen benötigt wird.

Dies ist möglicherweise eine große Platzverschwendung, wenn Sie viele kleine Zahlen haben. Der Huffman-Code ist eine Technik, mit der wir diese Anforderung lockern können, nach der jede Zahl acht Bits belegen sollte. Dies bedeutet, wenn Sie zwei Bytes sehen:

234 115

Das können je nach Huffman-Tabelle drei Zahlen sein. Um sie zu extrahieren, müssen Sie sie zuerst in separate Bits

aufteilen : 11101010 01110011

Dann wenden wir uns der Tabelle zu, um zu verstehen, wie sie gruppiert werden. Zum Beispiel können es die ersten sechs Bits (111010) oder 58 im Dezimalsystem sein, gefolgt von fünf Bits (10011) oder 19 und schließlich den letzten vier Bits (0011) oder 3.

Daher ist es sehr schwierig, Bytes zu verstehen in diesem Stadium der Kompression. Bytes repräsentieren nicht das, was es scheint. Ich werde in diesem Artikel nicht auf die Details der Arbeit mit der Tabelle eingehen, aber es gibt genügend Materialien zu diesem Thema im Netzwerk .

Einer der interessanten Tricks, die Sie ausführen können, wenn Sie dies wissen, besteht darin, den Header vom JPEG zu trennen und separat zu speichern. Tatsächlich stellt sich heraus, dass nur Sie die Datei lesen können. Facebook tut dies, um die Dateigröße weiter zu reduzieren.

Sie können die Huffman-Tabelle auch noch ein wenig ändern. Für andere sieht es aus wie ein beschädigtes Bild. Und nur Sie kennen die magische Version der Korrektur.

Zusammenfassend: Was wird also für die JPEG-Dekodierung benötigt? Es ist notwendig:

  1. Extrahieren Sie die Huffman-Tabelle (n) aus dem Header und decodieren Sie die Bits.
  2. Extrahieren Sie diskrete Cosinustransformationskoeffizienten für jede Farb- und Helligkeitskomponente für jeden 8x8-Block, indem Sie inverse Transformationen der Codierung von Serienlängen und Deltas durchführen.
  3. , 88.
  4. , ( ).
  5. YCbCr RGB.
  6. !

Ernsthafte Arbeit zum einfachen Betrachten von Bildern mit einer Katze! Was mir jedoch gefällt, ist, dass Sie sehen können, wie menschlich die JPEG-Technologie ist. Es basiert auf den Merkmalen unserer Wahrnehmung, die es uns ermöglichen, eine viel bessere Komprimierung als bei herkömmlichen Technologien zu erzielen. Wenn Sie nun verstehen, wie JPEG funktioniert, können Sie sich vorstellen, wie diese Technologien auf andere Bereiche übertragen werden können. Beispielsweise kann die Delta-Codierung in einem Video die Dateigröße erheblich reduzieren, da es häufig ganze Bereiche gibt, die sich nicht von Bild zu Bild ändern (z. B. Hintergrund).

Der im Artikel verwendete Code ist offen und enthält Anweisungen zum Ersetzen von Bildern durch Ihre eigenen.

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


All Articles