Frage:
Wird bei einem JPG garantiert, dass dieselben Pixel erzeugt werden?
Wayne Werner
2016-10-16 05:27:10 UTC
view on stackexchange narkive permalink

Ich weiß, dass das Aufnehmen in RAW viele Vorteile hat, aber im Moment scheint JPG für mich gut zu funktionieren. Die Dateigrößen sind viel kleiner und darktable scheint gut mit ihnen zu funktionieren (obwohl es interessanterweise so aussieht, als ob es beim Bearbeiten von RAW-Dateien tatsächlich schneller geht, aber das könnte nur eine Halluzination sein). P. >

Soweit ich das beurteilen kann, funktioniert darktable, indem eine Sidecar-Datei erstellt wird, die die Änderungen enthält, die an der ursprünglichen JPG-Datei vorgenommen werden sollen. Theoretisch sind die Änderungen also nicht destruktiv (dh das Bild wird nicht erneut in JPG komprimiert jedes Mal).

Angesichts all dessen war ich neugierig - wird dieselbe JPG-Datei garantiert jedes Mal dieselben Pixel erzeugen, wenn sie gerendert wird? Angenommen, ich habe eine JPG-Datei, die in 98% Qualität gespeichert ist. Wenn ich das mit 100% Zoom öffne, hat es beim Öffnen in Darktable dieselben Pixel wie beim Öffnen in Google Chrome? Oder wenn Sie es in Photoshop öffnen? Was ist mit Dateien, die eine höhere Komprimierung aufweisen, z. 50% Qualität?

Einige Encoder erlauben die Wahl zwischen Gleitkomma- und Ganzzahl-DCT. Kann jemand, der weiß, wovon er spricht (in diesem Fall nicht ich!), Ansprechen, ob dies dann mit Gleitkommawerten * gespeichert * werden könnte? Oder ist das nur eine Zwischenberechnung?
Es würde Unterschiede zwischen ihnen geben, sie wären klein, aber definitiv mathematisch unterschiedlich.
Sieben antworten:
Aaganrmu
2016-10-21 13:51:07 UTC
view on stackexchange narkive permalink

Kurze Antwort

Nein, es ist nicht garantiert, dass die Decodierung immer gleich ist. Die Unterschiede sind jedoch garantiert sehr, sehr gering.

ISO-Spezifikationen

Die ISO-Spezifikationen (International Organization for Standardization) für JPEG enthalten die folgenden Spezifikationen für Decoder (Hervorhebung von mir):

Ein Decoder muss

a) mit angemessener Genauigkeit alle komprimierten Bilddaten in rekonstruierte Bilddaten konvertieren mit Parametern innerhalb des von der Anwendung unterstützten Bereichs, die der in Anhang B angegebenen Austauschformatsyntax für die vom Decodierer verkörperten Decodierungsprozesse entsprechen;

b) alle Tabellen akzeptieren und ordnungsgemäß speichern Spezifikationsdaten, die dem abgekürzten Format für die Syntax der Tabellenspezifikationsdaten entsprechen, das in Anhang B für die vom Decodierer verkörperten Decodierungsprozesse angegeben ist;

c) mit angemessener Genauigkeit konvertieren zum Rekonstruieren von Bilddaten alle komprimierten Bilddaten, die dem abgekürzten Format für die angegebene Syntax für komprimierte Bilddaten entsprechen in Anhang B für die vom Decodierer verkörperten Decodierungsprozesse, vorausgesetzt, dass die zum Decodieren der komprimierten Bilddaten erforderlichen Tabellenspezifikationsdaten zuvor in den Decodierer installiert wurden.

Angemessene Genauigkeit ist sehr streng. Jeder Konverter, der diesen Spezifikationen folgt, muss mit einem Referenzalgorithmus verglichen werden. Für ein einzelnes Pixel kann sich jede Komponente nur um ein Bit von der Referenz unterscheiden. Darüber hinaus muss der (quadratische) Fehler über jeden 8x8-Pixelblock und über das gesamte Bild sehr gering sein.

Aber warum sollte er anders sein?

Im Gegensatz zu bmp oder png speichert ein JPEG nicht die Pixel selbst, sondern eine Beschreibung des Bildes. Zur Rekonstruktion der einzelnen Pixel wird ein komplexer mathematischer Algorithmus verwendet. Nach jedem Schritt speichert der Algorithmus das Ergebnis im Speicher. Hier kann etwas schief gehen: Ein Wert im Speicher hat eine bestimmte Genauigkeit, die Maschinengenauigkeit. Aus diesem Grund muss der Wert gerundet werden. Während die Spezifikationen sicherstellen, dass eine minimale Präzision verwendet wird, gibt es kein Maximum. Die Rundung kann daher für jede Implementierung unterschiedlich sein. Dies kann sogar von der verwendeten Hardware abhängen, da einige Prozessoren mehr Präzision als erforderlich verwenden. Einige frühe Pentium-Prozessoren haben es sogar einfach falsch gemacht.

Winziges, stark vereinfachtes Beispiel: Berechnen von 5 * 0,12 durch wiederholte Addition.

Speichern von Zwischenwerten mit einer Genauigkeit, ein Computer könnte dies tun : 0,12 + 0,12 = 0,24, Zwischenergebnis als 0,2 speichern (Abrunden). Berechnen Sie dann 0,2 + 0,12 = 0,32 und speichern Sie sie als 0,3 (erneut abgerundet). Setzen Sie dieses Muster fort und das Ergebnis ist 0,5 anstelle des erwarteten Ergebnisses von 0,6. Wenn eine höhere Genauigkeit verwendet worden wäre (z. B. zwei Ziffern), wäre das Ergebnis unterschiedlich gewesen.

Ich glaube das ist die richtige Antwort. Ich habe einige gängige Apps ausprobiert, um festzustellen, ob ich 1-Bit-Unterschiede feststellen konnte, bin aber bisher gescheitert.
Es wurde festgestellt, dass mein früherer Fehler nur auf meine Unerfahrenheit mit dem Bildeditor zurückzuführen war, den ich zur Hand habe. Nachdem ich herausgefunden hatte, wie ich die Bildunterschiede richtig verbessern kann, waren sie offensichtlich. Ich habe meine eigene Antwort hinterlassen, um zu demonstrieren.
Schön, dass du tatsächlich Beweise hast.
Dass es einen ISO-Standard gibt, bedeutet nicht, dass er üblicherweise von realen Implementierungen eingehalten wird.
Mark Ransom
2016-10-21 22:08:06 UTC
view on stackexchange narkive permalink

Nein, Sie können sich nicht darauf verlassen, dass decodierte JPEG-Bilder Bit für Bit identisch sind.

Als Beispiel habe ich versucht, das Bild oben auf dieser Seite in zwei verschiedenen Browsern anzuzeigen: Chrome 53.0.2785.143 und Internet Explorer 11.0.9600.18426. Sie sehen identisch aus, aber ich habe Screenshots in einen Bildeditor eingefügt und den Unterschied vergrößert. Sie können sehen, dass sie nicht gleich sind.

Hier ist das Originalbild:

Original image

Und hier ist das Unterschied zwischen den beiden Browser-Renderings, erweitert:

Enhanced difference

Was ist, wenn Sie es in zwei verschiedenen Registerkarten in Chrom öffnen - wird Ihnen dann ein identisches Bild angezeigt?
@WayneWerner Ich habe das gerade versucht, und ja, sie waren identisch. Wie ich es erwarten würde. Ich bin mir ziemlich sicher, dass die Unterschiede auf Details in den Decodierungsalgorithmen verschiedener Software zurückzuführen sind, wie in einer anderen Antwort beschrieben.
Haben Sie dies auch mit einem PNG versucht, falls Chrome und Internet Explorer ein unterschiedliches Farbmanagement verwenden?
@LoganPickup nein, habe ich nicht, aber das ist eine gute Idee.
null
2016-10-16 06:27:06 UTC
view on stackexchange narkive permalink

Ist dieselbe JPG-Datei garantiert, dass sie beim Rendern jedes Mal dieselben Pixel erzeugt?

Ja. Es ist nur eine Liste von Zahlen, die Farbwerte darstellen (auf clevere Weise, um sie klein zu machen). Beim Öffnen einer JPEG-Datei, die sich zwischen zwei Anwendungen unterscheiden würde, werden keine Informationen "erzeugt".

Was ist mit Dateien, die eine höhere Komprimierung aufweisen, z. 50% Qualität?

Dann sind die Zahlen in der Liste unterschiedlich. (mehr Nullen) Davon abgesehen gibt es keinen Unterschied.

Das gilt für den Dekompressionsteil. Es gibt jedoch eine große Einschränkung: Unterschiedlicher Farbmanagementcode kann bei der Konvertierung in den Zielfarbraum zu unterschiedlichen Ergebnissen führen - insbesondere, wenn eine App die Schwarzpunktkompensation angibt und eine andere nicht. Und das berücksichtigt nicht einmal eine Kürzung der Zwischenberechnung, die auftreten könnte oder nicht.
Bei gleicher Komprimierungsrate sollte ein MD5-Hash der generierten Bilder gleich bleiben, unabhängig davon, wie oft wir den Komprimierungsprozess für das Originalbild ausführen.
Euri Pinhollow
2016-10-16 22:17:10 UTC
view on stackexchange narkive permalink

Komprimierung und JPEG-Interna selbst haben keinen Einfluss auf die Reproduzierbarkeit bereits komprimierter Dateien. In korrekt funktionierenden Programmen wird dieselbe Pixelausgabe erzielt, da

  • der Farbraum eines Fotos mit der Farbe übereinstimmt Raum des Farbmanagementsystems
  • Sie sehen das Bild in einem Maßstab von 100%, dh Sie geben Pixel zu Pixel an den Monitor aus.

Wenn zum Beispiel das Bild Datei enthält AdobeRGB-Daten. In sRGB-Farbsystemen kann es zu unterschiedlichen Pixeldaten kommen, da für die Konvertierung von AdobeRGB in sRGB unterschiedliche Algorithmen verwendet werden können und für Berechnungen unterschiedliche Genauigkeit verwendet werden kann. In Photoshop und Chrome werden sehr wahrscheinlich unterschiedliche Algorithmen für die Farbkonvertierung verwendet.

Viele Browser sind für kolorimetrische Zwecke nicht ordnungsgemäß eingerichtet und verwenden das Monitorprofil möglicherweise überhaupt nicht und zeigen das Bild möglicherweise ganz anders als in Photoshop an.

Wenn das Bild skaliert wird, wird der Unterschied zwischen den Größenänderungsalgorithmen ähnlich angezeigt.


Das ist möglicherweise überkompliziert, aber wahrscheinlich etwas, das Sie gerne wissen würden.

James Snell
2016-10-17 18:40:16 UTC
view on stackexchange narkive permalink

Die meisten JPEG-Codierungsschemata sollen nicht genau sein, sie sind "wahrnehmungslos". Ein solches Prinzip wird bei Implementierungen sowohl von Codierer- als auch von Decodiereralgorithmen angewendet.

Es ist zu erwarten, dass in einem Decodierer einige Optimierungen implementiert werden, die die Leistung gegenüber der Genauigkeit bevorzugen und bei denen das Farbmanagement möglicherweise nicht implementiert wird all und dass die RGB-Y'CrCb-Konvertierung zwischen Decodern nicht identisch ist.

JPEG soll "gut genug" sein, Unterschiede wären subtil und das ist die Ausgabe, die man erwarten sollte. Das gleiche Prinzip würde unabhängig von der auf die Quelldatei angewendeten Komprimierungsstufe gelten.

xiota
2018-07-21 06:39:16 UTC
view on stackexchange narkive permalink

@Aaganrmu ist im Allgemeinen korrekt. Es gibt keine Garantie dafür, dass eine bestimmte JPEG-Datei bei jedem Öffnen genau so gerendert wird , auch nicht von demselben Programm

In der Praxis führt das Öffnen derselben Datei mit demselben Programm zu denselben Ergebnissen, wenn ein Programm nicht aktualisiert wurde. Viele Programme verwenden auch dieselben Decodierungsbibliotheken und produzieren die gleichen Ergebnisse. Es wäre für Programmierer zu aufwändig, den JPEG-Algorithmus absichtlich zu variieren, um bei jedem Öffnen einer Datei unterschiedliche Ergebnisse zu erzielen. Es ist auch nicht das, was Benutzer erwarten oder wollen würden. (Dies ignoriert Farbprofile und Korrekturen. Dies ist ein separater Schritt nach Decodierung.)

Die Möglichkeit für Variationen ergibt sich aus unterschiedlichen Eingaben, die möglicherweise dazu führen Dieselbe Ausgabe als Ergebnis der Transformationen, Rundungen und Quantisierungen, die als Teil des JPEG-Algorithmus auftreten. Diese Operationen sind auch die Quelle für JPEG-Artefakte.

JPEG variations

Die JPEG-Decoder knusperli und jpeg2png dienen dazu, JPEG-Artefakte innerhalb der vom JPEG-Algorithmus zugelassenen Einschränkungen zu reduzieren. Sie erzeugen eine Ausgabe, die dieselben Daten liefern sollte, die eingegeben wurden, wenn sie mit denselben Einstellungen neu quantisiert wurden. (Wenn ich ihre Funktionsweise richtig verstehe, ignorieren sie Unterschiede, die durch Rundungsfehler entstehen können.) Die Dekodierung dauert daher länger und ihre Ausgabe unterscheidet sich (besser?) Von der anderer Decoder.

Hier sind 100% Ernten, um den Unterschied zwischen libjpeg (links) und jpeg2png (rechts) zu zeigen:

jpeg2png example

WayneF
2016-10-16 21:02:35 UTC
view on stackexchange narkive permalink

Ein Pixel ist nur eine Farbe, eine durchschnittliche Farbe, die aus diesem winzigen Pixelbereich abgetastet wurde. Farbe ist, wie wir Details sehen. Wir sehen ein schwarzes Stromkabel über ein Bild eines blauen Himmels laufen, nur weil die Farbe unterschiedlich ist. Farbe ist das Detail.

JPG-Qualität 50 ist nur 50, nur eine Zahl, es ist NICHT 50%.
JPG 100 ist nicht 100% von allem. 100 ist ziemlich gutes JPG, aber es ist immer noch JPG.

JPG-Artefakte (verursacht durch einen niedrigeren Qualitätsfaktor) verändern die Pixelfarbe. Das Pixel hat eine andere Farbe, und ein Pixel ist nur eine Farbe, sodass es sich um ein anderes Pixel handelt.

Das Codieren (Erstellen) von JPG ist in jedem Programm häufig unterschiedlich. Es gibt verschiedene Optionen, die in verschiedenen Programmen unterschiedlich angenommen werden. Die Qualität 80 in einem Programm stimmt wahrscheinlich nicht mit der Qualität 80 in einem anderen Programm überein.

Ich vermute, dass das Dekodieren (Anzeigen) von JPG Standard ist und zeigt, was codiert wurde.

JPG ist heute besser als es Früher gab es JPG-Artefakte, aber es gibt immer noch JPG-Artefakte.

Eine Art von JPG-Artefakten besteht darin, dass JPG versucht, die Farbe in 8x8-Pixelblöcken so zu gestalten, dass alle 64 dieselbe Farbe haben, wenn sie bereits eine ähnliche Farbe haben. Niedrige JPG-Qualität zeigt diese 8x8-Pixelblöcke in Bereichen ähnlicher Farbe (Himmel, Wände usw.).

Eine andere Art von JPG-Artefakt ist eine Unschärfe oder ein Echo scharfer Kanten, die etwas von der ursprünglichen Kante versetzt sind

Einige Beispiele für JPG-Artefakte finden Sie unter http://www.scantips.com/basics09b.html.

Eine niedrige JPG-Qualität kann E-Mails und E-Mails verursachen Internet kleiner und schneller, aber für unsere tatsächlichen Fotos scheint es einfach keinen guten Grund zu geben, warum wir eine niedrige JPG-Qualität wünschen würden. :)



Diese Fragen und Antworten wurden automatisch aus der englischen Sprache übersetzt.Der ursprüngliche Inhalt ist auf stackexchange verfügbar. Wir danken ihm für die cc by-sa 3.0-Lizenz, unter der er vertrieben wird.
Loading...