Sind nicht alle digitalen Bilder letztendlich nur Pixelwerte zwischen 0 - 255?

56

Ich habe ein paar unglaublich grundlegende (dumme?) Fragen zu Bildern. insbesondere Bildformate und Pixelwerte.

Verzeih mir, ich bin kein Fotograf. Ich bin nur jemand, der mit Bildern arbeitet, und für mich sind es nur Reihen und Spalten von Zahlen.

Meine Fragen sind:

Wenn es sich bei Fotos im Kern nur um 3 Kanäle mit Pixelwerten [0, 255] X RBG handelt, wie kann es dann zu einem Unterschied zwischen zwei Bildformaten kommen? Ich meine, was unterscheidet RAW von TIFF? Sind diese Werte nicht auf Werte zwischen 0 und 255 beschränkt? Eine Zahl ist eine Zahl - sollte es nicht nur ein festgelegtes Format geben? Oder sollten nicht zwei Bilder mit derselben Höhe und Breite dieselbe Dateigröße haben?

Was unterscheidet ein 16-Bit-Bild vom numerischen Standpunkt von einem 32-Bit-Bild? Auch hier ist ein Bild nur ein Array mit ganzzahligen Werten zwischen 0 und 255.

Ausgehend von der Perspektive, dass ein Bild im Dateisystem eines Computers nur ein 3-Kanal-Array von Ganzzahlen zwischen 0 und 255 ist, was bringt es, ein Bild in ein verlustbehaftetes Format wie beispielsweise JPG zu komprimieren? Angenommen, der Komprimierungsalgorithmus ändert einige Pixelwerte von 254 auf 255 oder was auch immer. Damit? Wie kann die Dateigröße reduziert oder die visuelle Qualität beeinträchtigt werden?

Ich weiß, dass es viele verschiedene Möglichkeiten gibt, Bilddaten zu speichern. Aber ich frage nicht nach etwas anderem als einem einfachen 3-Kanal-RBC-Bild. Ich weiß nur, dass ich jetzt eine Reihe von Zahlen habe, wenn mir jemand eine davon gibt. Ich habe keinen Grund zu wissen, warum ein Array von Zahlen möglicherweise anders sein könnte als ein anderes Array von Zahlen von 0 bis 255. Ich hoffe, das macht Sinn. Diese Frage ist nicht auf das RAW-Format beschränkt! Es handelt sich vielmehr um ein beliebiges Array von Pixelwerten

Monica Heddneck
quelle
32
Ich beginne mich zu fragen, ob dieses Missverständnis von der Arbeit mit einer höheren Ebene herrührt. Lesen Sie Dateien mit Matlab oder einem anderen Tool? Vertrauen Sie mir, wenn Sie eine TIFF-, PNG- oder JPG-Datei auf Raw-Dateiebene öffnen und lesen, müssen Sie eine Menge Dinge tun, bevor Sie eine schöne und saubere RGB-Matrix erhalten.
Pipe
2
Es wäre hilfreich, wenn OP etwas mehr Kontext liefern könnte. Hat dies beispielsweise mit Bildverarbeitungscode zu tun?
Remco
1
In Bezug auf die Bearbeitung: Wenn Sie eine Reihe von Zahlen erhalten, arbeiten Sie einfach damit. Wo ist das andere Array? Wenn Sie 2 Arrays zum Vergleichen haben, ist das eine andere Geschichte. Diese können Werte enthalten, die nahe genug an einem menschlichen Auge liegen. Und wenn Sie ein Array nach einer verlustbehafteten Codierung dekodieren, erhalten Sie nie das ursprüngliche Array, sondern ein
genaues Ergebnis
3
Achten Sie auf Softwarepakete, die angeblich TIFF, FITS und andere nicht komprimierte Bilder importieren. Viele solcher Pakete, einschließlich der MATLAB- und Python-Basiswerkzeuge, kürzen die Daten unabhängig von der Quellgröße automatisch auf 8 Bit. Wenn Sie dies vermeiden möchten, müssen Sie spezielle Funktionen / Bibliotheken finden oder Ihre eigenen Werkzeuge rollen.
Carl Witthoft
2
@Monica Heddneck: Es gibt bereits eine Menge netter Antworten, die Sie auf die Idee bringen, dass ein Bild nicht einfach ein Pixelarray von RGB255-Werten ist, aber ich verstehe einfach nicht, warum Sie die Begründung nicht verstehen für komprimierte Formate. Sie sind dazu da, Daten entweder während der Speicherung oder während des Transports zu speichern. Die Komprimierung wäre auch dann von Vorteil, wenn alle Bilder nur RGB255-Triplets wären.
Gábor

Antworten:

72

Tut mir leid, aber Ihre Grundvoraussetzung ist falsch: Ein Bild kann als Array von RBG-Pixeln mit 8 Bit pro Wert codiert werden, aber es gibt viele andere Möglichkeiten:

  • ein Kanal mit einem Bit / Kanal (rein schwarz und weiß),
  • ein Kanal mit x Bit / Kanal (Graustufenformate, x ist normalerweise 8 oder 16, was 256 oder 65536 Werte ergibt),
  • verschiedene palettenbasierte Formate (vgl. GIF)
  • Vollfarbe mit (zumindest theoretisch) beliebig vielen Kanälen mit jeder gewünschten Bittiefe.

Und das gilt für das Bild, das während der Bearbeitung / Anzeige im RAM des Computers gespeichert wird. Ich ignoriere die verschiedenen RAW-Bildformate, die es gibt (hier und im Rest dieses Beitrags).

Für die Fotografie sind 3 Kanäle mit 8, 16 oder 32 Bit / Kanal am gebräuchlichsten (normalerweise eine Ganzzahl, aber zumindest einige Programme arbeiten intern mit 32-Bit-Gleitkommazahlen). Oft gibt es einen 4. Kanal (Alpha), besonders wenn das Programm die Verwendung von Ebenen erlaubt. Und irgendwo müssen die Abmessungen des Bildarrays gespeichert werden.

Für diese unterschiedlichen Formate gibt es verschiedene Gründe. Für das In-Memory-Format waren die Größe der Daten und die Geschwindigkeit (viel schneller bei der Bearbeitung eines 8-Bit-Kanals als bei 4 32-Bit-Kanälen) ein wichtiger Gesichtspunkt. Diese sind heutzutage weniger wichtig, aber wir haben ein vollständiges Farbmanagement mit verschiedenen Farbräumen. Einige davon (z. B. Prophoto RGB) benötigen mindestens 16 Bit / Kanal, um die Unterschiede zwischen benachbarten Farben so gering zu halten, dass sichtbare Streifen vermieden werden. Und da Behandlungen immer komplizierter werden, bietet die Verwendung von 32-Bit-Gleitkommazahlen Vorteile (wobei Farben mit Werten zwischen 0,0 und 1,0 codiert werden und die Behandlung Zwischenwerte außerhalb dieses Bereichs zulässt).

Wenn Sie in der Lage sein möchten, das Bild in einer Datei zu speichern und es erneut in dieselben speicherinternen Daten zu laden, müssen Sie mindestens so viele Bits pro Kanal wie das Im-Memory-Format verwenden und Informationen zu speichern Bildabmessungen, Bittiefe und Farbraum.

Benutzer dieser Bilder möchten auch einige zusätzliche Informationen über das Bild speichern (Titel, Titel, der das Bild aufgenommen hat usw.). Wieder verschiedene Möglichkeiten, diese Informationen zu speichern.

Dann gibt es verschiedene Möglichkeiten, die Bilddaten für die Dateispeicherung zu komprimieren. Eine der einfacheren ist RLE (Run Length Encoding), bei der Sie einen Zählwert und einen Pixelwert speichern, wenn Sie auf einen wiederholten Pixelwert stoßen. Andere, wie JPEG, sind viel komplizierter, bieten aber auch viel mehr Komprimierung. Beispielsweise verwendet jpeg eine Cosinus-Transformation und wirft die (weniger sichtbaren) Hochfrequenzinformationen weg, was zu hohen Komprimierungsraten auf Kosten des Informationsverlusts führt (es steckt mehr dahinter, aber dies wird zu lange).

Dies bietet bereits viele Möglichkeiten, die Informationen auf der Festplatte zu speichern. Unabhängig davon, welches Format Sie auswählen, muss es genau angegeben werden, damit das Bild beim Laden richtig interpretiert werden kann.

Dann gibt es eine ständige Entwicklung bei zB verlustfreien Komprimierungstechniken, mit denen vorhandene Formate nicht immer umgehen können.

Wir haben also eine Vielzahl von Dateiformaten mit verschiedenen Kompromissen zwischen der Genauigkeit der gespeicherten Informationen, dem belegten Speicherplatz und der Geschwindigkeit des Lesens, Schreibens und Sendens (vergleichen Sie die Größe eines nicht komprimierten TIFF und eines JPG mit anständiger Qualität). .


Nachdem Sie die bearbeitete Frage gesehen haben, einige zusätzliche Aspekte:

Wenn Sie ein In-Memory-Image bearbeiten, wird es in Form eines oder mehrerer Arrays vorliegen. Zu diesem Zeitpunkt sollte das ursprüngliche Dateiformat keine Rolle mehr spielen. Ich gehe davon aus, dass Sie Ihre Daten mit 8 Bit / Kanal verarbeiten.

Sie müssen jedoch wissen, ob Sie ein verarbeitetes Bild oder ein Rohbild haben, da zwischen diesen zwei wichtige Unterschiede bestehen:

  • Rohbilder haben normalerweise 1 Farbe pro Pixel und die Pixel sind normalerweise in einem Bayer-Array mit 2 grünen, 1 roten und 1 blauen Pixel pro Quadrat mit 4 Pixeln angeordnet. Die Werte sind proportional zur Intensität der Szene (mit Ausnahme von sehr niedrigen und sehr hohen Werten).
  • Verarbeitete Bilder können als 2D-Array von Datensätzen mit 3 numerischen Werten oder als Farbebenen (3 2D-Arrays, jeweils eines für R, G, B) angeordnet werden. Außerdem sind die Werte normalerweise nicht proportional zu den Szenenintensitäten . Schlimmer noch, das genaue Verhältnis zwischen Pixelwerten und Szenenintensität hängt von der Verarbeitung des Bildes ab. Und die Balance zwischen den Farben wurde angepasst, um der Reaktion des menschlichen Auges zu entsprechen (Weißabgleich, Rot und Blau werden relativ zum Grün verstärkt).

Wenn Sie also ein Rohbild mit 3 Farbwerten pro Pixel erhalten, wurde dieses Rohbild bereits einer Behandlung unterzogen (mindestens entweder Demosaikierung oder einfaches Binning von 4 Rohpixeln zu 1 Bildpixel). Ob dies akzeptabel ist, hängt von Ihrer Anwendung ab.

remco
quelle
Ich bin ein bisschen weniger an der Vielfalt der Darstellungsmöglichkeiten von Bildern interessiert, aber wenn ich stattdessen zwei 3-Kanal-Zahlenmatrizen bekomme, was unterscheidet eine davon von der anderen? Was ist der Unterschied zwischen TIFF und RAW, wenn beide 3-dimensionale Arrays sind?
Monica Heddneck
4
Vielleicht von Interesse, ich war verwirrt, als Sie sagten, 16-Bit-Bilder sind 16 Bit pro Kanal. In der Computergrafik waren 16-Bit-Bilder 16 Bit für die Gesamtsumme aller 3 Kanäle (normalerweise 5 Rot-, 6-, Grün- und 5-Blau-Bilder). Ich wollte dies nur in einem Kommentar hervorheben, damit jemand, der 16-Bit-Farben sieht, weiß, dass es für diesen Begriff zwei Bedeutungen gibt, je nachdem, wer ihn verwendet.
Cort Ammon
msgstr "Ein 8 - Bit - Kanal lässt sich viel schneller manipulieren als 4 32 - Bit - Kanäle". Meinst du nicht "viel schneller, um einen 32-Bit-Kanal zu manipulieren als 4 8-Bit-Kanäle"?
l0b0
1
@MonicaHeddneck Wenn eine der Matrizen RGB-Daten enthält, während die andere (z. B.) HSV-Daten enthält, sind Dimension und Bittiefe beider Arrays identisch. Wenn sie auf einem Anzeigegerät gerendert werden, sehen sie gleich aus ( +) ), aber die in den beiden Arrays gespeicherten Daten sind mit Sicherheit nicht die gleichen. ( + ) Tatsächlich sehen sie nicht genau gleich aus, da 888RGB und 888HSV zwar jeweils 2 ^ 24 "Punkte" aufweisen, es aber keine Eins-zu-Eins-Zuordnung zwischen den beiden Punktmengen gibt. In der Praxis wird es jedoch wahrscheinlich sehr schwierig sein, den Unterschied mit menschlichen Augen zu erkennen.
dgnuff
Tatsächlich ist der Punkt von hdr 32 Floating-Bit-Farbe, der nicht in 0 zu 1, sondern in 0 zu irgendetwas codiert ist, wenn Sie das wirklich tun wollen, dann verwenden Sie stattdessen Ganzzahlen. Wie bei echtem Licht gibt es wirklich keine Obergrenze. Aber Sie werden nur ein Stück davon sehen. Dies ist aus vielen Gründen nützlich, aber wenn Sie sie zum Beispiel in 3D-Reflexionen verklagen, wird immer noch die wahre Energie erfasst, die für Dinge wie Himmel und eine Selektivität von zum Beispiel 20% von
großer Bedeutung ist
48

Im Kern sind Fotos nur 3 Kanäle mit Pixelwerten [0, 255] X RBG,

Aber Fotos sind nicht "nur 3 Kanäle mit Pixelwerten", auch nicht "im Kern". Computerbildschirme bestehen in der Regel aus einem Array von RGB-Pixeln. Wenn Sie also ein Bild auf einem Computerbildschirm anzeigen möchten, müssen Sie irgendwann alle Bilddaten auf ein Array von RGB-Pixeln abbilden, dies sind jedoch nur diese Daten eine bestimmte Wiedergabe der Bilddaten. Die Daten im Bild bestehen möglicherweise überhaupt nicht aus einem Strom von Pixelwerten. Um Pixelwerte aus einem Bild zu erhalten, müssen Sie wissen, wie die Daten formatiert werden.

Wie könnte es dann möglicherweise einen Unterschied zwischen zwei Bildformaten geben? Ich meine, was unterscheidet RAW von TIFF? Sind diese Werte nicht auf Werte zwischen 0 und 255 beschränkt?

Dies sind zwei gute Beispiele, da keines dieser Formate notwendigerweise ein rechteckiges Array von RGB-Werten enthält.

RAW ist überhaupt kein einzelnes Format - es ist eine Art Sammelbegriff für Dateien, die Daten enthalten, die direkt von einem Bildsensor aufgezeichnet wurden. Eine RAW-Datei kann also eine Folge von Werten enthalten, die die von den verschiedenen Sensorstellen gelesenen Spannungen darstellen. Diese Sites sind wie Bildpixel, aber keine RGB-Pixel. Um RGB-Pixel aus einer RAW-Datei zu erhalten, müssen Sie diese Daten im Kontext von Informationen zum Sensor, den aktuellen Kameraeinstellungen usw. interpretieren. Mit anderen Worten, Sie können eine RAW-Datei in einem Hex-Editor öffnen und schauen Sie, was Sie wollen, aber Sie werden keinen einzigen RGB-Wert finden.

TIFF steht für Tagged Image File Format und es ist ein sehr interessantes Format, da es viele verschiedene Darstellungen eines Bildes enthalten kann. Eine einzelne TIFF-Datei kann das "gleiche" Bild in verschiedenen Größen enthalten, z. B. eine Miniaturansicht, ein Bild mit Bildschirmauflösung und ein Bild mit Druckauflösung, und sie kann auch Farb- und Graustufenversionen enthalten. Wussten Sie, dass Faxgeräte ihre Daten normalerweise als TIFF-Dateien senden? Um RGB-Pixel aus einer TIFF-Datei zu erhalten, müssen Sie nicht nur das TIFF-Format, sondern auch das Format der jeweiligen Bilddarstellung in dieser Datei verstehen.

Eine Zahl ist eine Zahl - sollte es nicht nur ein festgelegtes Format geben?

Nein. Es gibt viele verschiedene Bildformate, da die einzelnen Personen unterschiedliche Anforderungen erfüllen. Die verlustbehaftete Komprimierung von JPEG ist großartig, um sehr kleine Bilddateien zu erhalten, aber nicht für Bilder, die mehrmals bearbeitet werden müssen. Einige Formate verwenden Interlacing , wodurch das Bild sehr schnell mit verschiedenen Auflösungen gelesen werden kann. Und so weiter ... jedes Format bietet seinen eigenen Mix aus Vorteilen und Kompromissen.

Oder sollten nicht zwei Bilder mit derselben Höhe und Breite dieselbe Dateigröße haben?

Nein, das wäre schrecklich. Wenn die Größe jeder Bilddatei im Wesentlichen width * height * 3(bei Annahme einer 24-Bit-Farbe) sein müsste, würden Sie viel Speicherplatz verschwenden . Die meisten Fotos enthalten viel Redundanz, dh Bereiche, in denen die gleiche Farbe viele Male wiederholt wird. Um Speicherplatz zu sparen, ist es oft sinnvoll, diese redundanten Informationen zu eliminieren. Eine Möglichkeit hierfür ist beispielsweise die Lauflängencodierung, oder RLE. Wenn Sie beispielsweise einen Bereich mit 4195 aufeinanderfolgenden Pixeln haben, die alle weiß sind, ist es wesentlich effizienter, zu codieren, dass "die nächsten 4195 Pixel alle {255, 255, 255} sind", anstatt einfach so viele weiße Pixel in zu speichern die Datei. RLE wird tatsächlich in einigen Bildformaten verwendet, aber in vielen Formaten gibt es viel ausgefeiltere Schemata, die viel mehr Platz einsparen. Das bedeutet, dass Sie viel mehr Bilder auf einer Festplatte oder einer Speicherkarte speichern können. Das Senden des Bilds an eine andere Person wird dadurch erheblich beschleunigt.

Ausgehend von der Perspektive, dass ein Bild im Dateisystem eines Computers nur ein 3-Kanal-Array von Ganzzahlen zwischen 0 und 255 ist, was bringt es, ein Bild in ein verlustbehaftetes Format wie beispielsweise JPG zu komprimieren?

Der Punkt ist, dass es die Datei viel kleiner macht. Die JPEG-Komprimierung reduziert häufig die Größe einer Datei um den Faktor 10 oder mehr. Das heißt, Sie können mehr Bilder auf ein bestimmtes Speichergerät kopieren, schneller öffnen und schneller hochladen und herunterladen. Wenn Sie dasselbe Bild (oder fast) auf kleinerem Raum speichern, werden die Ressourcen effizienter genutzt und die Kosten gesenkt. Denken Sie im großen Stil darüber nach: Es ist wahrscheinlich, dass ein sehr großer Prozentsatz der im Internet verfügbaren Informationen aus Bildern und Filmen besteht. Ohne Komprimierung würden wir mehr oder größere Rechenzentren benötigen und viel mehr Energie verbrauchen.

Angenommen, der Komprimierungsalgorithmus ändert einige Pixelwerte von 254 auf 255 oder was auch immer. Damit? Wie kann die Dateigröße reduziert oder die visuelle Qualität beeinträchtigt werden?

Betrachten Sie mein RLE-Beispiel oben. Angenommen, Sie haben ein Foto mit einer großen leeren Wand, sodass große Bereiche Ihres Fotos alle die gleiche Farbe haben, mit der Ausnahme, dass es eine Streuung von etwas dunkleren Pixeln gibt, die im Bild kaum wahrnehmbar ist. Diese Pixel verringern die Wirksamkeit der Komprimierung. Anstatt einfach sagen zu können, dass "die nächsten 500.000 Pixel alle {243, 251, 227} sind", müssen Sie die Längencodierung für viel mehr, viel kleinere Blöcke durchführen, da Sie von Zeit zu Zeit auf eines dieser leicht unterschiedlichen Pixel stoßen. Wenn Sie zulassen, dass der Komprimierungsalgorithmus kleine Änderungen vornimmt, möglicherweise nur Pixel um höchstens 1% oder 2%, können Sie ein viel höheres Komprimierungsverhältnis erzielen, ohne das Bild merklich zu verändern. Es ist ein Kompromiss: Sie ' Wenn Sie einen kleinen Teil der Informationen im Originalbild preisgeben, wird die Dateigröße erheblich reduziert. Wo genau Sie diese Linie zeichnen möchten, kann sich ändern. Verlustbehaftete Formate wie JPEG ermöglichen es dem Benutzer, die gewünschte Komprimierungsstufe auszuwählen.

Caleb
quelle
1
Ausgezeichnet für eine sehr klare und umfassende Erklärung eines komplexen Themas! Ich denke, ich habe viel daraus gelernt. Ich frage mich, ob eine effektive Möglichkeit zum Verwalten der verlustfreien Komprimierung darin besteht, die Länge zu codieren, aber dann im Wesentlichen einen zweiten Durchgang durch das Bild zu machen, um anschließend ungerade Ausnahmen pro Pixel einzufügen. Etwas wie "von 23 - 400 ist schwarz" und dann "302 ist weiß" überschreibt dieses eine Pixel. statt 23 - 301 ist schwarz, 302 ist schwarz, 303 - 400 ist schwarz. Ich vermute, dies ist tatsächlich, wie mindestens ein Komprimierungsformat es behandelt.
Ruadhan2300
1
@ Ruadhan2300 - in der Tat gibt es. Siehe zum Beispiel: en.wikipedia.org/wiki/Lossless_JPEG , das eine Methode zur Vorhersage der Farbe jedes Pixels verwendet (wenn auch etwas komplexer als die Lauflängencodierung) und dann die Differenz zwischen dieser Vorhersage und dem tatsächlichen Pixelwert codiert.
Jules
18

Zusätzlich zur fantastischen Antwort von @ remco möchte ich hinzufügen, warum es verschiedene Codecs für (ungefähr) den gleichen Zweck gibt.

Codecs wurden entwickelt, um:

  • Sei verlustfrei gegen verlustbehaftet
  • Kodieren Sie schnell und reduzieren Sie die Dateigröße
  • Asymmetrische versus symmetrische En- / Decodierung
  • Seien Sie kompatibel mit Software
  • Seien Sie in unterschiedlichen Komprimierungsstufen / -situationen nahezu verlustfrei
  • Haben Funktionen, die andere Codecs nicht bieten, einschließlich:
    • lizenzfrei sein
    • Unterstützung für Schichten
    • Unterstützung für Alpha-Kanal (zB RGBA) / Transparrenz
    • Bieten Sie eine schnelle Web-Ansicht
    • Unterstützt hohe (er) Bittiefe
    • Unterstützung mehrerer Farbräume (RGB / CMYK)
    • Unterstützung für Metadaten / Versionierung / ...

Einige dieser Dinge schließen sich gegenseitig aus. Und deshalb haben wir eine Vielzahl von Codecs.


Einige Beispiele

Hinweis: Weder ist die Liste der Codecs vollständig, noch werden alle Funktionen (oder das Fehlen von Codecs) erwähnt. Wenn sich diese Antwort für jemanden als nützlich erweist, füge ich möglicherweise weitere Informationen hinzu (und sei etwas präziser).

Das vielleicht bekannteste Format ist JPEG . Es ist ein sehr weit verbreitetes, aber altes Format. Es verwendet DCT (Diskrete Kosinustransformation). Während es also bei den höchsten Qualitätseinstellungen eine recht gute Qualität bietet, tritt bei den niedrigeren eine Blockierung auf.

Dann kam JPEG 2000 , um JPEG zu ersetzen: Es basiert auf der Wavelet-Transformation, bietet also in den höheren Qualitätseinstellungen ungefähr die gleiche Qualität wie JPEG, in den niedrigeren Qualitätseinstellungen jedoch eine viel bessere Qualität (Blöcke sind etwas unscharf) ). JPEG 2000 bietet auch Regionen von Interesse (hohe Qualität in einem Bildbereich, niedrigere Qualität an anderer Stelle) und 16-Bit-Unterstützung. (Auch einige andere Dinge.) Leider (?) Wird JPEG 2000 nicht so umfassend unterstützt wie JPEG, da es rechenintensiver als JPEG ist und aufgrund von Lizenzproblemen.

PNG ist ein weiteres allgemein bekanntes Format - es ist verlustfrei und unterstützt Alpha-Kanäle, bietet jedoch keine Unterstützung für Nicht-RGB-Farbräume (wie CMYK). Daher ist es ein "nur online" -Format.

Dann gibt es die VFX-Formate wie OpenEXR . Sie alle drehen sich um Qualität und Geschwindigkeit: OpenEXR ist verlustfrei, unterstützt bis zu 64 Bit und codiert / decodiert schnell. Es wird hauptsächlich in der VFX-Industrie als Zwischenformat verwendet.

TIFF ist ein weiteres verlustfreies Format, das bei Fotografen sehr beliebt ist. Für die Komprimierung bietet es keine / ZIP / RLE / LZW / JPEG. Es unterstützt bis zu 32bit. Mit seiner auswählbaren Komprimierung ist es ziemlich anpassungsfähig, aber wegen seiner Verlustfreiheit ist es eher ein Offline-Format.

HEIF ist einer der neuesten Bildcodecs . Es wird dieselbe Komprimierung wie bei HEVC / h.265 verwendet und daher ein besseres Komprimierungsverhältnis als bei JPEG erwartet. Da es jedoch ist recht neu und weil es Gegenstand von Patenten ist, ist es nicht so breit wie unterstützt jede der oben genannten.

RAW-Bilder Siehe auch sind keine echten Bilder, wirklich: Sie sind eher ein Container für die rohen (daher der Name) Sensor-Auslesedaten. Nur mit Software, die die Daten interpretieren kann, ist es möglich, sich ein Bild zu machen. Das ist auch der Grund, warum RAW-Konverter wie Lightroom / Capture One / DarkTable / ... Updates benötigen, um neue Kameras zu unterstützen, die bereits festgelegte Container wie * .CR2 für Canon verwenden. Dies ist auch der Grund, warum eine 14-Bit-RAW mehr Bearbeitungsoptionen bietet als eine 32-Bit-TIFF, die Sie aus derselben RAW exportiert haben.


Intermisision: Lossless vs. Lossy

Ich bin mir immer noch nicht sicher, was Sie wirklich fragen, und deshalb dachte ich, dass es nicht schaden würde, eine kleine Erklärung über lossless vs. lossy hinzuzufügen.

Die verlustfreie Komprimierung erfolgt durch RLE (Run-Length Encoding) / Huffman-Codierung / ... , um die Daten zu komprimieren. Die Daten selbst werden nicht verändert, sondern in einem kleineren Paket gespeichert. Nehmen wir zum Beispiel RLE: Angenommen, wir haben einen R-Kanal-Bitstrom (von Pixel 0,0zu Pixel 0,11) von 255,255,255,255,255,215,215,235,100,000,000,000- RLE würde dies codieren als 52552215123511003000- dies ist viel kleiner, und da wir wissen, dass es in Gruppen von 4 Stellen gespeichert ist und dass die erste Ziffer ist der Zähler und die letzten drei Ziffern sind der Wert, dann können wir den vollen Wert rekonstruieren 255,255,255,255,255,215,215,235,100,000,000,000.

Bei der verlustbehafteten Komprimierung wird dagegen versucht, die Komprimierung noch weiter fortzusetzen, als dies bei der verlustfreien Komprimierung möglich ist. Zu diesem Zweck versuchen verlustbehaftete Codecs normalerweise, Dinge zu entfernen, die unsere Wahrnehmung nicht erfasst. Nehmen wir zum Beispiel die YUV( YCbCrwirklich) Modell JPEG (und fast jedes Video - Codec) verwendet: Y = Luminance, Cb = Chrominance Blue, Cr = Chrominance Red. Ein Mensch kann den Unterschied zwischen einem 4:2:0(jedes Pixel hat einen Luminanzwert, aber Farben werden abwechselnd in Blöcken von 2 4:4:4× 2 gespeichert) und einem (jedes Pixel hat eine Luminanz und beide Farbkanäle) codierten Bild nicht erkennen. Dies ist auf die Physiologie unseres Auges zurückzuführen : Wir können keine Farbunterschiede und auch keine Helligkeitsunterschiede erkennen.

Dies funktioniert die meiste Zeit gut, aber vergleichen Sie es mit einer MP3-Datei: Fast niemand kann Unterschiede zwischen 192 kbps und 320 kbps erkennen, aber unter 64 kbps und die Dinge werden schnell hässlich. Außerdem wird die Qualität durch eine Neukodierung weiter verringert, da möglicherweise unerwünschte Artefakte auftreten (z. B. werden in JPEG kleine Blöcke aus hochwertigen Kodierungen in weiteren Kodierungen als Bilddetails betrachtet).


Endeffekt

Wenn Sie sich nicht für Bildformate oder deren Funktionen interessieren, ist eines davon in Ordnung. Mit ausreichend hohen Qualitätseinstellungen ist es möglich und zu erwarten, dass Sie nicht einmal einen Unterschied zwischen ihnen feststellen.

Wenn Sie jedoch eine bestimmte Funktion benötigen, gibt es möglicherweise (und mit ziemlicher Sicherheit) einen Codec, der diese Funktion unterstützt.

flolilo
quelle
Ich würde Ihrer Liste der Codec-Eigenschaften zwei Dinge hinzufügen: 1. progressives Rendern (wird heutzutage nicht oft verwendet, war aber ein großes Feature in PNG) 2. Animationen (es gibt animierte PNG-, JPEG-, GIF-Dateien ...).
Sulthan
@ Sulthan Ich werde darüber nachdenken, das hinzuzufügen, obwohl progressiv - wie Sie sagen - heutzutage nicht als wichtig angesehen wird und Animation kein Merkmal ist, das die Fotografie betrifft. Trotzdem: Danke für die Eingabe!
Flolilo
2
"Nur mit Software, die die Daten interpretieren kann, ist es möglich, ein Bild zu erhalten", das für jedes Bildformat gilt. Wenn die Software beispielsweise JPEG-Daten nicht interpretieren kann, kann sie sie nicht als Bild anzeigen oder verarbeiten. In Rohdateien werden Daten gespeichert, die es ermöglichen, Bilder daraus zu rekonstruieren, und sie sind auf bestimmte Weise strukturiert (möglicherweise jedoch spezifisch für das Kameramodell). Es ist also ein Bildformat, es ist nicht nur ein Format, sondern "Rohformat von Kamera X".
9.
1
Natürlich. JPEGs von meiner 5D Mk III erfüllen (scheinbar) die gleichen Spezifikationen wie die einer Nikon P7000 oder einer EOS M6. .CR2sagt wirklich nur "Schau mich an, ich bin die RAW-Datei einer Canon-Kamera! Lies mich, wenn du es wagst!" - das hätte ich sagen sollen, obwohl Sie das in einer viel klareren Sprache ausgedrückt haben.
Flolilo
In einigen Bildformaten sind LAB- und XYZ-Leerzeichen vorhanden.
Joojaa
10

Im Kern sind Fotos nur 3 Kanäle mit Pixelwerten [0, 255] X RBG

Das ist eine ernsthaft gebrochene Annahme, und der Rest Ihrer Frage kann einfach nicht beantwortet werden, ohne sich davon zu lösen.

Ich meine, was unterscheidet RAW von TIFF? Sind diese Werte nicht auf Werte zwischen 0 und 255 beschränkt?

Der Begriff "RAW" kann sich auf zwei verschiedene Dinge beziehen, ein "Camera Raw" -Bild oder eine Datei, die RAW-Bilddaten ohne Überschriften enthält.

Ein "Camera Raw" -Bild speichert die Rohdaten, sobald sie aus dem Sensor kommen. Die meisten modernen Kamerasensoren verfügen über ADCs mit mehr als 8 Bit, erfassen aber auch nur Intensitätsdaten für eine Farbkomponente an jedem Standort. Die Geometrie kann durch das Objektiv verzerrt sein, die Intensitätswerte des ADC geben möglicherweise nicht die vom Menschen wahrgenommene Intensität wieder, die Farbkomponenten stimmen möglicherweise nicht genau mit denen überein, die von Ihrem Monitor usw. verwendet werden.

Ein komplizierter Mapping-Prozess mit Interpolation ist erforderlich, um die rohen Sensordaten in ein RGB-Bild guter Qualität umzuwandeln, und es gibt keinen richtigen Weg, dies zu tun. Aufgrund der Notwendigkeit, Farbkomponenten zu interpolieren, ist das RGB-Bild möglicherweise größer als die Rohdaten.

Die Konvertierung kann (und wird oft) in der Kamera durchgeführt, aber viele Fotografen müssen die Rohdaten speichern, damit sie die Verarbeitung nachträglich optimieren können.

Tiff ist ein komplexes Dateiformat, in dem Bilder in einer Vielzahl unterschiedlicher Formate mit einer Vielzahl von Metadaten gespeichert werden können. In der Praxis wird es jedoch normalerweise verwendet, um unkomprimierte oder verlustfrei komprimierte RGB- oder CMYK-Bilder zu speichern.

Dateien, die unformatierte Bilddaten ohne Überschriften enthalten, werden selten verwendet, da Sie deren Format und Abmessungen kennen müssen, bevor Sie sie lesen können. Einige Bildverarbeitungswerkzeuge unterstützen sie jedoch.

Was unterscheidet ein 16-Bit-Bild vom numerischen Standpunkt von einem 32-Bit-Bild?

Leider kann "n Bit" zwei verschiedene Dinge bedeuten. Dies kann bedeuten, dass alle Farbkomponenten zu einer Bitnummer zusammengefasst sind (z. B. 5 Bit für Rot, 5 Bit für Blau und 6 Bit für Grün für 16 Bit oder 8 Bit für Rot, 8 Bit für Grün, 8 Bit für Blau und 8 Bit) von alpha für 32 bit) oder at kann bedeuten, dass jede Farbkomponente n Informationsbits an jeder Pixelstelle hat.

Weiter mit dieser Perspektive, dass ein Bild im Dateisystem eines Computers nur ein 3-Kanal-Array von Ganzzahlen zwischen 0 und 255 ist

Auch diese Perspektive ist einfach falsch.

Eine Datei ist eine Folge von Bytes, aber diese Bytes sind fast nie "nur ein 3-Kanal-Array von Ganzzahlen zwischen 0 und 255".

Sie könnten so ein Bild speichern. Einige Tools unterstützen sogar das Lesen und Schreiben solcher Dateien. Das Problem besteht jedoch darin, dass Sie die Datei kennen müssen, bevor Sie sie lesen können. Angenommen, Sie hatten eine solche Datei mit einer Größe von 3000 Byte. Haben Sie 1000 24-Bit-RGB-Pixel? 3000 8-Bit-Graustufen-Pixel? 3000 8 Bit Pixel von einer Palette? In welcher Reihenfolge befinden sich die Farbkomponenten? Welche Form hat das Bild? sind die Farbkomponenten in der Reihenfolge RGB oder BGR? Wenn Sie die Antworten auf diese Fragen nicht kennen, können Sie eine solche Datei nicht sinnvoll lesen.

Praktische Bildformate beginnen daher in der Regel mit einem oder mehreren Kopfzeilen, die den Dateityp, die Abmessungen des Bildes und die Art der Speicherung der tatsächlichen Bilddaten angeben. Sie können auch optionale Metadaten enthalten.

Was bringt es, ein Bild in ein verlustbehaftetes Format zu komprimieren, beispielsweise JPG? Angenommen, der Komprimierungsalgorithmus ändert einige Pixelwerte von 254 auf 255 oder was auch immer. Damit? Wie kann die Dateigröße reduziert oder die visuelle Qualität beeinträchtigt werden?

Komprimierungsalgorithmen "ändern" nicht nur Werte, sie codieren die Informationen auf eine völlig andere Weise, zum Beispiel kann JPEG grob als beschrieben werden

  • Konvertieren Sie die Daten von RGB nach YUV
  • (Optional) Reduzieren Sie die Auflösung der Chroma-Kanäle um den Faktor 2 in einer oder beiden Dimensionen
  • Teilen Sie die Daten für jeden Kanal in 8x8 Blöcke auf.
  • Konvertieren Sie die Blöcke mit einer diskreten Cosinustransformation in den Frequenzbereich
  • Quantisieren Sie die Ergebnisse, wobei die Niederfrequenzinformationen erhalten bleiben, während die Präzision der Hochfrequenzinformationen verringert wird.
  • Codieren Sie die resultierenden Zahlen als eine Folge von Bytes unter Verwendung eines Codierschemas mit variabler Länge (entweder Huffman-Codierung oder arithmetische Codierung).
  • Speichern Sie diese Bytes in der Datei zusammen mit den entsprechenden Headern.

Verlustfrei komprimierte Formate bauen dagegen häufig auf allgemeinen Datenkomprimierungsalgorithmen auf, ergänzen diese jedoch manchmal um bildspezifische Vorverarbeitungen, wie z. B. PNG.

  • Konvertieren Sie die Daten in eines der unterstützten Formate (z. B. jeweils ein Bit für Rot, Grün und Blau in dieser Reihenfolge).
  • Für jede Bildzeile wird ein "Filter" -Prozess ausgeführt. Es gibt mehrere Filteroptionen (einschließlich überhaupt keiner Filterung). Das allgemeine Ziel besteht jedoch darin, die bildspezifischen Informationen zu erfassen, die ein Pixel wahrscheinlich seinen Nachbarn ähnelt, und zu codieren es auf eine Art und Weise, die "entleeren" kann.
  • Komprimieren Sie die gefilterten Daten mit dem Allzweck-Komprimierungsalgorithmus "Deflate".
  • Speichern Sie diese Bytes in der Datei zusammen mit den entsprechenden Headern.
Peter Green
quelle
1
Dies ist wahrscheinlich die beste Antwort hier. Es geht sowohl um die verschiedenen Dateiformate zum Speichern und Komprimieren von Bildern als auch darum, wie die Annahme, dass ein Bild eine Reihe von Zahlen von
0
Gut, um die Reihenfolge der Komponenten zu erwähnen. Ich vermute, Dinge wie opengl 2 hatten gute Gründe, Funktionen zum Lesen verschiedener Permutationen der RGB-Ordnung zu haben. Ehrlich gesagt, ohne Standard oder Metadaten wissen Sie nicht einmal, woher oder in welche Richtung das Bild stammt, geschweige denn, wie lang die Linien sind. Wenn Sie ein Doom-Sprite geladen haben, obwohl Sie sich mit der Palette befasst haben, sollten die Farben links unten beginnen. Gehen Sie nach Spalten und dann nach Zeilen
aufwärts
Ich habe den Eindruck, dass die Komponentenreihenfolge ein bisschen wie Endian ist. Einige Systemanbieter entschieden sich für RGB, andere (insbesondere Windows) für BGR.
Peter Green
9

Es gibt mehrere Gründe, warum diese Annahme falsch ist, und alle kommen auf eine Sache zurück:

Welche Waage benutzt du eigentlich?

Und das lässt sich noch etwas weiter aufschlüsseln:

Was ist 255?

"Farbe" ist keine Eigenschaft des physikalischen Universums. Es ist eine Empfindung, die im Kopf entsteht. Dazu gehören Dinge wie "blau", "grün" und "rot". Eine Skala von 0 bedeutet "überhaupt kein Blau" bis 255 bedeutet "alles Blau!" kann 255 eigentlich nicht das platonische Ideal von Blau darstellen , weil ... es in der realen Welt keine so perfekte Sache gibt. Also heißt es:

  • die bläulichste Art von Dingen, die Sie auf dem Gerät vor Ihnen machen können?
  • Wie nah an der idealen Übereinstimmung mit reinem Blau aus Sicht des menschlichen Sichtsystems, auch wenn die meisten Bildschirme und Drucker / Tinte / Papier-Kombinationen dies nicht darstellen können?
  • Ein ziemlich gutes Blau, das wahrscheinlich auf einer Vielzahl von Geräten angemessen dargestellt wird?
  • Ein Blau, das außerhalb des Sichtbereichs des Menschen liegt, das es jedoch ermöglicht, dass Ihr RGB-Triple die meisten Farben abdeckt, die sich in Reichweite befinden?

Sound erfunden? Nee! Dies sind echte Beispiele. Schauen Sie sich diese Darstellungen jeder Wahl an. Der gekrümmte Bereich ist ein 2D-Ausschnitt aus dem Farbraum des menschlichen Sehens, und das Dreieck zeigt den Bereich, der bei einer bestimmten Auswahl für Rot, Grün oder Blau dargestellt werden kann.

Hier ist zunächst das Profil für meinen Laptop-Bildschirm, das für aktuelle Geräte der Mittelklasse ziemlich repräsentativ ist:

ThinkPad X260

Hier ist der Adobe RGB-Bereich. Beachten Sie, wie viel größer das ist, als mein Bildschirm anzeigen kann!

AdobeRGB

Hier ist also sRGB - der Defacto-Standard und der Standardspeicherplatz, der normalerweise angenommen wird, wenn nichts angegeben ist. Es soll in den meisten Situationen "gut genug" sein.

sRGB

Und schließlich ProPhoto RGB, bei dem imaginäre Farben als Primärfarben verwendet werden, um das Dreieck so groß zu machen, dass es für fast alle menschlichen Visionen geeignet ist.

ProPhoto RGB

Jetzt werfen Sie die Farbe des Lichts selbst und die chromatische Anpassung ein - die Fähigkeit des menschlichen Sehsystems, die Wahrnehmung an die Umgebung anzupassen. In der Tat, nicht nur die Fähigkeit: etwas, das passiert, ob Sie es wollen oder nicht . Bedeutet "reines Blau", dass das Ding unter diesem Glühlicht so blau aussieht, wie es nur sein kann? Was soll der Wert sein, wenn wir stattdessen im Sonnenlicht fotografieren?

"255" kann also viele verschiedene Dinge bedeuten.

Was ist 0

Das ist ziemlich einfach - wie schwarz muss 0 sein? Ist es vantaschwarz schwarz? Wenn dies der Fall ist, aber alle tatsächlichen Schattierungen in Ihrer Szene viel weniger extrem sind , möchten Sie wirklich eine Reihe potenzieller Werte für einen Dynamikbereich "verschwenden", der nicht in Ihrer Szene vorhanden ist - und der wie Farbe kann Sie können sich nicht einmal von einem Gerät oder Drucker vertreten lassen, auf den Sie Zugriff haben?

Was ist deine Kurve?

Also, wenn Sie Ihre Endpunkte haben, wie kommen Sie von einem zum anderen? Die menschliche Wahrnehmung von Helligkeit ist eindeutig nichtlinear . Sollte 100 auf Ihrer Skala von 0 bis 255 doppelt so hell sein wie 50, oder sollte es ein größerer Faktor sein? Sollte der wahrgenommene Unterschied zwischen beispielsweise 3 und 4 der gleiche sein wie der zwischen 203 und 204?

Wenn Sie sich für ein Protokollspeichersystem entscheiden, sollte diese Kurve für die menschliche Sicht oder für die Datenoptimierung oder für etwas anderes optimiert werden?

Es gibt viele Möglichkeiten für viele unterschiedliche Bedürfnisse.

Bei Komprimierung

Du fragst.

Angenommen, der Komprimierungsalgorithmus ändert einige Pixelwerte von 254 auf 255 oder was auch immer. Damit? Wie kann die Dateigröße reduziert oder die visuelle Qualität beeinträchtigt werden?

Moderne Komprimierungsalgorithmen sind komplizierter, aber dies ist ein gutes Beispiel. Ich verwende hexadezimal FF, um 255 und FE254 darzustellen, und stelle mir vor, wir verwenden die Lauflängencodierung als Form der Komprimierung. Nehmen wir der Einfachheit halber Schwarzweiß statt Farbe an. Wenn wir also eine Datenzeile haben, die so aussieht:

FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF 

wir können das zu einem sehr einfachen komprimieren

16×FF 

... das ist eine ziemlich offensichtliche Ersparnis. Grundsätzlich können 16 Bytes in zwei gespeichert werden (eins für die Zählung, zwei für die Daten). Aber sagen wir, wir haben:

FF FF FE FF FE FF FF FF FF FF FE FE FE FF FE FE

Nun gibt uns die Lauflängencodierung:

2×FF 1×FE 1×FF 1×FE 5×FF 3×FE 1×FF 2×FE

... was überhaupt keine Einsparungen darstellt und in der Tat die Dateigröße hätte erhöhen können. Wenn wir jedoch alle FEWerte auf runden FF, kehren wir zum ersten Fall mit einer erheblichen Größenreduzierung zurück, wobei die Auswirkungen auf die Dateiqualität zwar gering, aber wahrscheinlich kaum zu bemerken sind.

Das ist natürlich ein triviales, ausgeklügeltes Beispiel, aber alle verlustbehafteten Komprimierungsalgorithmen haben diese grundlegende Eigenschaft gemeinsam: Der Datenverlust erleichtert die Verwendung eines kompakteren Speicherformats mit hoffentlich nicht zu viel wahrgenommener Veränderung.

Auf Bittiefe

Was unterscheidet ein 16-Bit-Bild vom numerischen Standpunkt von einem 32-Bit-Bild? Auch hier ist ein Bild nur ein Array mit ganzzahligen Werten zwischen 0 und 255.

Ein Array von Integer-Werten zwischen 0 und 255 ist also ein 8-Bit- Array. (2⁸ = 256.) Bei drei Kanälen handelt es sich um ein 24-Bit-Bild. Einige Formate haben auch einen Transparenzkanal ("Alpha") für 32 Bit. Man kann auch einen höheren Wert pro Kanal verwenden, was wir normalerweise mit einer "16-Bit-Tiefe" meinen. Das bedeutet, dass das Array von 0-65535 (2¹⁶ = 65536) anstatt von 0-255 reicht. In einem solchen Schema ist dies im Allgemeinen nur ein Multiplikator, bei dem der höchste Wert auf jeder Skala dasselbe darstellt, die höhere Bittiefe jedoch eine größere Nuance ermöglicht. (Weitere Informationen hierzu finden Sie in dieser Antwort .) Es gibt auch einige spezielle Dateiformate, die 64-Bit-Floats (!) Anstelle von Ganzzahlen für die Werte oder andere Datentypen verwenden, je nach Anwendungsfall, aber das Grundkonzept ist dasselbe .

mattdm
quelle
s / 0-65536 / 0-65535 /
Ruslan
1
@ Ruslan Guter Fang. Entschuldigung für den Pufferüberlauf. :)
mattdm
Auch eine gute Erklärung, warum das Kleid so polarisierend war, FWIW
Wayne Werner
8

Nein, ein Bild besteht nicht nur aus RGB-Werten im Bereich von 0 bis 255. Auch wenn Sie die Speicherformate ignorieren, gibt es viele Möglichkeiten, Farben zu beschreiben. Hier sind einige Beispiele:

  • Rote, grüne und blaue Komponenten (RGB)
  • Komponenten in Cyan, Magenta, Gelb und Schwarz (CMYK)
  • Farbton, Sättigung und Helligkeit / Wert (HSL / HSV)
  • Die Lichtmenge, die auf eine Gruppe von Sensoren in einer Kamera trifft
  • Die Lichtmenge und ihre Richtung beim Auftreffen auf Sensoren (in einer Lichtfeldkamera )

Die ersten beiden werden am häufigsten für die Anzeige auf Monitoren bzw. zum Drucken verwendet.

Darüber hinaus besteht ein Bild nicht nur aus Pixeln, sondern auch aus Metadaten. Dies kann beispielsweise die Breite in Pixel, die physische Breite beim Drucken, ein Miniaturbild oder sogar der geografische Standort der Kamera beim Aufnehmen des Bildes sein.

Fax
quelle
6
Und selbst bei so etwas "Einfachem" wie RGB gibt es unterschiedliche Farbräume. Eine einfache 24-Bit-RGB-Bitmap kann zum Beispiel gammakorrigiert sein - und ohne Umkehrung dieser Korrektur erscheint sie viel zu dunkel. Die Intensitätsverteilung kann linear oder alles andere als linear sein. Adobe RGB und sRGB sind beide 24-Bit-RGB-Bitmaps, weisen jedoch eine sehr unterschiedliche Darstellung der "gleichen" Farben auf. Genau wie "Es gibt keine reine Textdatei", gibt es kein "einfaches Bild" -Format. Das beste, was Sie bekommen können, ist das "native Bildformat für dieses spezielle System / diese spezielle Anwendung".
Luaan
1
Nie ein Format gesehen, das hsv / hsl-Daten enthält, aber ich habe diejenigen gesehen, die
LAB-
2
@Luaan Du solltest das zu einer Antwort erweitern. Gamma-Unterschiede waren eine Sache, die sonst niemand in ihren Antworten angesprochen hat.
Tim Seguine
5

Ihre Prämisse ist nicht falsch: Jedes Bild kann mit einem N-dimensionalen Array endlicher Werte dargestellt werden. Persönlich verallgemeinere ich, dass diskrete Geometrie anstelle einer Matrix verwendet wird, aber das Wesentliche ist dasselbe. Aber das ist der Inhalt, nicht die Datei.

Die Dateiformate sind jedoch unterschiedlich. Grundsätzlich gibt es verschiedene Möglichkeiten, um dasselbe Bild darzustellen, wie die genannten Personen: bmp, png, jpg usw. Wenn Sie sie einmal dekodieren, führen zwei verlustfrei kodierte Versionen desselben Bildes natürlich zu denselben Matrizen.
Stellen Sie es sich als TXT-Datei vor, die Sie mit zip komprimiert haben. Mit der zusätzlichen Verrücktheit, dass eine verlustfreie Codierung einen Text zurückgeben würde, der nicht mit dem Original identisch ist, aber wirklich nah ist, fast wie eine heruntergekommene Version des Texts.

Nehmen wir an, Sie haben denselben Text, der als .txt, .docx, .pdf usw. gespeichert ist. Warum sind nicht alle Dateien genau gleich, wenn der Inhalt gleich ist? (Ok, txt hat keine Formatierung, aber die anderen haben).

Überprüfen Sie übrigens, wie sich die Netpbm-Codierung wirklich von JPEG unterscheidet .

Fábio Dias
quelle
3

Für RAW- und TIFF-Formate lautet die Antwort (wie bereits erwähnt), dass sie nicht immer dieselben Farbräume verwenden (z. B. können RAW-Dateien mehr Bits pro Pixel verwenden, um feinere Farbinformationen zu speichern). .

Aber um auf den Kern Ihrer Frage zu kommen: Manchmal gibt es Bilder, die in verschiedenen Formaten gespeichert sind, aber letztendlich genau die gleiche Zahlenreihe darstellen.

Ein gutes Beispiel dafür sind die Unterschiede in der Komprimierung zwischen einer PNG-Datei und einer TIFF-Datei.

PNG-Dateien verwenden einen bestimmten Komprimierungsalgorithmus. Das heißt, ein Bild wird nicht nur als große Zahlenliste für jedes Pixel gespeichert. Vereinfachtes Beispiel: Es kann etwas gespeichert werden, das besagt, dass in diesem 10x10-Pixelblock alle Pixel die Farbe XYZ haben. Anstatt diese Informationen 100 Mal zu speichern, werden sie einmal gespeichert, plus ein bisschen Information über die Region, auf die sich diese Informationen beziehen.

Das Problem besteht dann darin, das ursprüngliche Array von Zahlen (die Farben darstellen) zurückzugewinnen, damit Sie es anzeigen oder bearbeiten können.

PNG-Dateien verwenden immer den gleichen Komprimierungsalgorithmus, sodass die Software problemlos alle gültigen PNG-Dateien unterstützt. Auf der anderen Seite haben einige Bilder eine Struktur, die sich nicht für den Komprimierungsalgorithmus von PNG eignet, sodass einige Ihrer PNG-Dateien möglicherweise recht groß sind.

TIFF-Dateien unterstützen dagegen viele verschiedene Komprimierungsalgorithmen. Tatsächlich können sogar verschiedene Teile des Bildes unterschiedlich komprimiert gespeichert werden. UND es unterstützt "Erweiterungen", so dass Sie Bilder auf proprietäre Weise komprimieren können. Vielleicht wird die obere Hälfte Ihres Bildes mit einer ähnlichen Methode wie PNG komprimiert, aber dadurch wird die untere Hälfte nicht sehr gut komprimiert, sodass die untere Hälfte mit einer anderen Methode komprimiert wird.

TIFF-Dateien sind also flexibler - Sie können möglicherweise genau das gleiche Zahlenfeld mit weniger Bytes speichern. Die zum Dekodieren des Abbilds erforderliche Software ist jedoch komplizierter und funktioniert möglicherweise nicht mit jeder TIFF-Datei, die Sie darauf werfen, konsistent. Sie können beispielsweise eine TIFF-Datei in einer Software speichern und sie nicht mit einer anderen Software öffnen, obwohl dies der Fall ist funktioniert immer noch im original.

Also fragst du

Aber ich frage nicht nach etwas anderem als einem einfachen 3-Kanal-RBC-Bild. Ich weiß nur, dass ich jetzt eine Reihe von Zahlen habe, wenn mir jemand eine davon gibt. Ich habe keinen Grund zu wissen, warum sich ein Array von Zahlen möglicherweise von einem anderen Array von Zahlen von 0 bis 255 unterscheidet.

Um es Ihnen zu übergeben, musste jemand wissen, wie das Bild gespeichert wurde und wie man es in eine Reihe von Zahlen übersetzt. (Oder möglicherweise macht eine Software diese Übersetzung für Sie, ohne dass Sie es merken).

Sie können versuchen, ein Bild als PNG und erneut als TIFF oder GIF zu speichern und es in einem Hexadezimal-Viewer zu betrachten, um zu sehen, wie sie jeweils dasselbe Zahlenarray unterschiedlich darstellen. Oder informieren Sie sich darüber, wie PNG- und TIFF-Dateien intern dargestellt werden, um eine Vorstellung davon zu erhalten, was in die Software integriert werden muss, um identische Zahlenfelder unterschiedlich zu lesen.

LangeHaare
quelle
1
But to get to the crux of your question - sometimes there are images which are stored in different formats, but each ultimately represents exactly the same array of numbers.Das mag für verlustfreie Bilder zutreffen - aber es ist völlig falsch, wenn Sie z. B. ein HEIF-Bild mit niedriger Bitrate mit einem JPEG mit niedriger Bitrate vergleichen .
Flolilo
1
@flolilolilo yep, deshalb sagte ich "manchmal" - meine Interpretation der Frage war, dass sie fragten "ob ich genau das gleiche Farbraster habe, was ist der Unterschied zwischen den Dateien". Ich habe also von verlustfreier Komprimierung als einem vereinfachten Fall gesprochen, in dem Sie mit verschiedenen Komprimierungsmethoden genau dasselbe Zahlenraster aus verschiedenen Dateitypen erstellen können.
LangeHaare
Raw verwendet fast nie mehr Bits pro "Pixel", aber RAW beschreibt auch keine Pixel, sondern Fotoseiten. RAW-Bilder sind die rohen Sensordaten vom Sensor, und jede bestimmte Fotoseite hat nur 1 Kanal, nicht 3. Die RGB-Kanäle werden durch Betrachten benachbarter Fotoseiten mit anderen Farben bestimmt. RAW-Dateien sind in der Regel kleiner als ein unkomprimiertes Bild, das das Ergebnis der RAW-Verarbeitung ist.
AJ Henderson
1
16-Bit-Rohdaten verwenden beispielsweise nur 16 Bit pro "Pixel", aber ein unkomprimierter 8-Bit-Farb-BMP verwendet 24 Bit pro Pixel, da 8 Bit an Informationen für Rot, Grün und Blau gespeichert werden müssen. Der Grund, warum RAW weiter angepasst werden kann, ist, dass die Farbinformationen noch nicht kombiniert wurden. Sie können Dinge wie den Weißabgleich (der den Einfluss der einzelnen Farbfotoseiten bei der Bestimmung der Farbinformationen für jedes der resultierenden Pixel ändert) ändern.
AJ Henderson
3

Bitmaps

Eine Bitmap (BMP) ist im Wesentlichen das, was Sie beschreiben, ein Array von Zahlen, die Pixelfarben darstellen. ZB sowas

1, 1, 1, 0, 1, 1, 1, 1, 1, 1, 1

Verlustfreie Kompression

Definieren wir nun ein Komprimierungsschema. In unserem Komprimierungsschema haben wir ein Array von Zahlenpaaren. Z.B

3, 1, 1, 0, 7, 1

Als erstes möchte ich darauf hinweisen, dass dieses Komprimierungsschema die gleichen Pixel wie das erste Array darstellt. Das erste Array hat drei Einsen, gefolgt von einer einzelnen 0 und dann sieben Einsen. Und genau das vertreten wir hier. Dieses Format ist kürzer, da es mehrere Pixel mit zwei Zahlen darstellt. Das Bitmap-Format muss eine Zahl für jedes Pixel verwenden.

Offensichtlich ist dies eine etwas vereinfachte Ansicht eines Bildes (z. B. nur eine Zeile) und ein Komprimierungsschema. Hoffentlich können Sie so sehen, wie ein Komprimierungsschema das Format eines Bildes ändert. So bezieht sich ein GIF auf ein BMP. GIF verwendet ein Komprimierungsschema namens Lempel-Ziv-Welch anstelle dieses vereinfachten.

Was wir hier beschrieben haben, ist ein verlustfreies Komprimierungsschema. Ein Problem bei verlustfreien Komprimierungsschemata besteht darin, dass bei einigen Eingaben die codierte Form möglicherweise länger als das Original ist. ZB für

1, 0, 1, 0, 1

Die Kodierung ist

1, 1, 1, 0, 1, 1, 1, 0, 1, 1

Nun, das war nutzlos. Wir haben die Eingabe doppelt so lang gemacht.

Eine weitere verlustfreie Komprimierung

Betrachten wir nun ein anderes Komprimierungsschema. In diesem Beispiel stellen wir das Bild als überlagerte Kreise dar. Für jeden Kreis definieren wir einen Mittelpunkt, einen Radius und eine Farbe.

Unsere erste Bitmap würde werden

5, 5, 1, 3, 0, 0

Dies entspricht der Länge unserer ersten Komprimierungsmethode.

Und unsere zweite könnte beides sein

2, 2, 1, 2, 1, 0, 2, 0, 1

Dies sind drei Kreise, die in der Mitte des Elements zentriert sind (was bei der Computerzählung die Nummer 2 ist, da Computer bei 0 zu zählen beginnen). Ein Kreis hat Radius 2 und Farbe 1. Dann fügen wir einen Kreis mit Farbe 0 und Radius 1 hinzu. Schließlich haben wir einen Kreis mit Farbe 1 und Radius 0. In Schritten wäre dies

1, 1, 1, 1, 1
, 0, 0, 0, 1
1, 0, 1, 0, 1

Oder

2, 2, 1, 1, 0, 0, 3, 0, 0

Dies ist der gleiche Anfangskreis, der jedoch durch zwei Punktkreise abgedeckt ist. In Schritten wäre es

1, 1, 1, 1, 1
, 0, 1, 1, 1
1, 0, 1, 0, 1

Diese sind beide eine kürzer als die erste codierte Version, aber immer noch länger als das Original.

Sie fragen sich vielleicht, warum ich von Kreisen und nicht von Bereichen spreche. Der Hauptgrund ist, dass Kreise näher an den tatsächlichen zweidimensionalen Bildern liegen.

Verlustbehaftete Kompression

Wir haben auch das Konzept der verlustbehafteten Komprimierung. Diese verlustfreien Komprimierungsschemata können wieder in das ursprüngliche Bitmap-Array umgewandelt werden. Verlustbehaftete Komprimierungsschemata sind möglicherweise nicht umkehrbar.

Betrachten wir eine verlustbehaftete Version unserer Kreise-Methode. In diesem Beispiel verwenden wir eine einfache Regel. Wir werden keine Kreise mit einem Radius von weniger als 1 speichern. In unseren letzten beiden Codierungen hätten wir also stattdessen

2, 2, 1, 2, 1, 0

und

2, 2, 1

die wieder in pixel konvertiert sind

1, 0, 0, 0, 1

und

1, 1, 1, 1, 1

Die erste Version ist nur ein Element länger als das Original. Die zweite Version ist kürzer. Beide sind gültig, daher kann der Algorithmus beide entwickeln und den kürzeren auswählen.

Wir beschreiben Bilder mit restriktiveren Regeln als von geringerer Qualität.

Diese Darstellung von Bildern als überlagerte Sammlungen kreisförmiger Formen ähnelt der Funktionsweise der Joint Photographic Experts Group oder des JPEG- Formats. Seine Formen sind eher Ellipsen als Kreise, aber die Idee ist ähnlich. Anstelle unserer simplen Methode wird die diskrete Cosinustransformation zum Codieren von Bildern verwendet.

Im Gegensatz zu GIF ist JPEG eine andere Art, das Bild darzustellen. GIF ist immer noch Pixel. Sie werden nur auf andere Weise gespeichert. JPEG ist Formen. Um ein JPEG anzuzeigen, konvertieren wir die Formen in Pixel, da die Bildschirme so funktionieren. Theoretisch könnten wir einen Bildschirm entwickeln, der so nicht funktioniert. Anstelle von Pixeln könnten Formen erzeugt werden, die dem JPEG-Format besser entsprechen. Natürlich kann dieser Bildschirm keine Bitmaps anzeigen. Um ein BMP oder GIF anzuzeigen, müssten wir in JPEG konvertieren.

Wenn Sie ein Standard-GIF konvertieren, z. B. 300 x 300 Pixel, es in ein JPEG konvertieren und die Qualität nach unten drehen, sollten die verwendeten Basisformen sichtbar sein. Viele JPEGs vermeiden diese Artefakte, indem sie mit einem Bild mit einer viel höheren Auflösung beginnen.

JPEGs lassen sich gut skalieren, da es sich eher um Formen als um Pixel handelt. Wenn Sie also mit einem 8000 x 8000-Bild beginnen, es in JPEG konvertieren und als 300 x 300-Bild anzeigen, wäre ein Großteil der verloren gegangenen Details ohnehin verloren gegangen. Wenn Sie die 8000 x 8000-Bitmap zuerst in eine 300 x 300-Bitmap und dann in JPEG konvertiert haben, sind die Ergebnisse häufig von geringerer Qualität.

MPEG

Wir haben über Standbilder gesprochen. Das Moving Picture Experts Group- oder MPEG-Format verwendet dieselbe Komprimierungsart wie JPEG, aber es wird auch etwas anderes verwendet. Während eine einfache Methode zum Erstellen von Videos das Senden einer Sequenz von Standbildern ist, sendet MPEG tatsächlich ein Bild, gefolgt von einer Reihe von Bildern, in denen Änderungen aufgelistet sind, und endet mit einem Endbild. Da die meisten Bilder dem vorherigen Bild ähnlich sind, ist die Liste der Änderungen häufig kleiner als ein zweites Bild.

Die Sequenz ist normalerweise nicht so lang, sagen wir fünf Frames. Aber es hilft, den Stream kleiner zu machen, als es sonst der Fall wäre.

Vereinfachungen

Ich habe viel ignoriert. Meine Bilder haben nur zwei Farben (1 Bit), nicht die 256 eines 8-Bit-Bildes und schon gar nicht die 4 294 967 296 eines 32-Bit-Bildes. Beachten Sie auch bei 8-Bit-Bildern, dass Sie häufig unterschiedliche Paletten für das Bild auswählen können. Daher können zwei 8-Bit-Bitmaps mit derselben Sequenz Bilder darstellen, die unterschiedlich aussehen (gleiche Form, aber unterschiedliche Farben).

Meine Bilder sind einzelne Reihen, nicht zweidimensional. Bei den meisten Bildern wird eine bestimmte Zeilengröße gespeichert, wodurch die Arrays zweidimensional werden.

Ich habe nicht versucht, die tatsächlichen Kodierungen überhaupt darzustellen. Sie sind viel komplexer als die einfachen, die ich verwendet habe. Ich tat dies, weil ich die Kodierungen in diesem Beitrag beschreiben wollte. Ich bin nicht davon überzeugt, dass ich Lempel-Ziv noch viel weniger erklären könnte, als die komplexere Lempel-Ziv-Welch-Verfeinerung in einer einzigen Antwort. Und ich verstehe Fourier-Transformationen nicht gut genug, um sie ausführlich zu erklären.

Dies ist eine stark vereinfachte Version der eigentlichen Bildverarbeitung. Ich bin jedoch der Meinung, dass es aus didaktischen Gründen einfacher ist, die komplexere Realität zu verstehen, ohne dabei die wesentlichen Punkte außer Acht zu lassen.

Brythan
quelle
3

Angenommen, es stimmte, dass jedes Pixel nur drei Zahlen (rot, grün und blau) im Bereich von 0 bis 255 enthielt. Andere Antwortende haben diese Annahme (richtig) in Frage gestellt, aber der Einfachheit halber sagen wir einfach, dass sie wahr ist.

Ich erinnere mich (kann aber leider nicht online finden) an eine Karikatur aus einem Sprachlehrbuch: Zwei alte ägyptische Steinmetzarbeiten sitzen erschöpft am Boden einer massiven Wand, auf der sie eine sehr große Anzahl von Marschfiguren gemeißelt haben. Der eine sagt zum anderen: "Es muss doch einen einfacheren Weg geben, zu schreiben:" Der Pharao hatte 100.000 Soldaten? ". Behalte diese Idee im Hinterkopf.

Angenommen, die erste Zeile Ihres Bildes enthält 1800 schwarze Pixel. Wie würde das dargestellt werden?

0 0 0    0 0 0     0 0 0   ....

Wie viel Speicherplatz würde das erfordern? Jeder Wert ist ein Byte. Drei Bytes pro Pixel, 1800 Pixel in der Zeile, also schon 5400 Bytes pro Zeile. Ein Bild mit den Abmessungen 1800 x 1200 muss also 1200-mal so viel aufnehmen, was mehr als 6 Megabyte entspricht. Führen Sie jetzt eine Google-Bildsuche durch und laden Sie ein paar Bilder im Format 1800 x 1200 herunter, z. B. ein .pngBild und ein .jpgBild. Schauen Sie sich die Dateigröße an: ist es 6 MB? Auf keinen Fall, es ist normalerweise viel kleiner als das. Und das ist natürlich wünschenswert, da so viel Platz gespart und die Download-Zeit verkürzt wurde ....

So was ist los? Der Schlüssel ist, dass es auch bei so vielen zu speichernden Zahlen verschiedene Darstellungsmöglichkeiten gibtdiese Nummern in der Datei. In meiner Antwort vor zwei Absätzen finden Sie hier ein Beispiel für eine effizientere Darstellung. Ich schrieb die Wörter "1800 schwarze Pixel". Das sind 17 Zeichen und müssen daher nicht mehr als 17 Bytes belegen. Es beschreibt jedoch genau die Informationen, für die wir 5400 Bytes benötigt haben. Und Sie könnten mit Sicherheit mehr als 17 Bytes erreichen (und auch viel Aufwand bei der Codierung / Decodierung sparen), wenn Sie nicht die englische Sprache zum Codieren dieser Informationen verwenden, sondern eine speziellere Sprache. Wir haben also bereits mehr als ein Bildkomprimierungsformat festgelegt: eines, das englische Wörter verwendet, und eines, das effizienter ist. Sehen Sie, wohin das führt?

OK, sagen Sie, das funktioniert, wenn eine ganze Reihe benachbarter Pixel zufällig dieselbe Farbe haben. Aber was ist, wenn sie es nicht tun? Das hängt natürlich vom Inhalt des jeweiligen Bildes ab: Je mehr Redundanz vorhanden ist, desto einfacher ist es, die Informationen zu komprimieren . Redundanz bedeutet, dass Teile des Bildes ziemlich gut vorhergesagt werden können, wenn Sie bereits andere Teile kennen. Komprimierung bedeutet, nur das Nötigste aufzuschreiben, um die Informationen zu rekonstruieren. Nicht jedes mögliche Bild weist Redundanz auf, aber jedes reale Bild, das für das menschliche Auge und das Gehirn von Bedeutung ist, obwohl es komplexer ist als mein reinschwarzes Beispiel, weist immer noch eine große Redundanz auf. Und es gibt viele verschiedene Möglichkeiten zum Komprimieren. Einige Komprimierungsmethoden sind verlustfreiDies bedeutet, dass die Informationen so rekonstruiert werden können, dass sie mathematisch mit dem Original identisch sind, wie in meinem Beispiel mit der schwarzen Pixelreihe. Die meisten .pngDateien verwenden eine verlustfreie Komprimierungsmethode. Einige Methoden sind verlustbehaftet : Die Rekonstruktion ist nicht perfekt, aber die Fehler sind so versteckt, dass das menschliche Auge und das Gehirn sie kaum bemerken. Die meisten .jpgDateien sind verlustbehaftet.

Die Details, wie Sie komplizierte Redundanzmuster erkennen und wie Sie effiziente komprimierte Beschreibungen von ihnen schreiben, sind hoch mathematisch - und nicht trivial, weshalb es Platz für so viele verschiedene Formate gibt, die unterschiedlichen Komprimierungsstrategien entsprechen. Aber hoffentlich bekommst du das Prinzip.

Einige der oben genannten Kommentatoren haben vernünftige Vermutungen angestellt, wo Ihr Missverständnis entstanden sein könnte. In Ihrer Frage scheinen Sie zu glauben, dass die Komprimierung die Pixelwerte nur geringfügig ändert (und zwar stellenweise, jedoch nur als unerwünschter Nebeneffekt, verlustbehaftete Komprimierungsmethoden), ohne das Informationslayout zu ändern. Wenn Sie die Datei öffnen und den Bildinhalt betrachten (z. B. als Zahlenreihe in Matlab oder als Bild auf dem Bildschirm in Photoshop), sehen Sie nicht den Inhalt der komprimierten Datei, sondern die Rekonstruktion, die das gleiche Layout wie das Original hat (es wäre keine große Rekonstruktion, wenn das Layout nicht korrekt erstellt würde). Durch das Öffnen der Datei wurden die Informationen aus der Datei in eine vollständig unkomprimierte Darstellung im Speicher dekomprimiert. Wenn Sie zwei unkomprimierte Rekonstruktionen vergleichen , gibt es in der Tat keine Unterscheidung zwischen den beiden unterschiedlichen Bildformaten, aus denen sie stammen (mit Ausnahme der etwaigen Rekonstruktionsfehler).

jez
quelle
1

Ja, aber wie man zu diesen Einsen und Nullen kommt, ist sehr unterschiedlich.

Ich werde ein Beispiel zeigen, aber es ist falsch und soll mehr veranschaulichen als genau sein. Denken Sie daran, dass alle digitalen Bilder auf einer bestimmten Ebene binär dargestellt werden.

Um die Sache zu komplizieren, gibt es verschiedene Kanäle. CMYK, RGB, B & W, um nur einige zu nennen. Wir werden nicht darauf eingehen. Es gibt auch verschiedene Stufen wie Erfassung, Speicherung und Anzeige. Wir werden darauf eingehen, obwohl das Beispiel erneut zeigen soll, dass es nicht genau ist. Wenn Sie genaue Beispiele wünschen, müssen Sie eine Menge technischer Dokumente nachschlagen.

In unserem Beispiel sehen wir uns also ein Schwarzweißbild an.

00067000
00067000
00567800
04056090
40056009

Die Zahlen geben an, wie stark das "Schwarze" ist. So hat die Kamera das Bild aufgenommen. Es ist eine anständige Kamera, also speichert sie auch das Bild.

Jetzt wird das Bild auf einem Computer gespeichert, nimmt jedoch viel Platz in Anspruch, sodass wir es komprimieren werden. Wir wissen, dass die meisten Menschen nicht nur einen Unterschied von 1 Schwarzwert feststellen können, sondern auch, dass wir einige davon ausgleichen werden.

302730
302730
204820
*04056090
1420262019

So speichern wir das Image auf der Festplatte. Es nimmt weniger Platz ein und lässt uns einen Großteil des Originalbildes produzieren.

Nehmen wir nun an, wir möchten es auf einem Drucker drucken. Der Drucker druckt nur eine Schwarzstufe, sodass ein Computer das gespeicherte komprimierte Bild in druckerspezifisch umsetzt.

00011000
00011000
00111100
01011010
10011001

Dies druckt ein vernünftig aussehendes Bild aus, aber Sie können sogar in dem Beispiel einen extremen Qualitätsmangel sehen. Aber hey, es ist die Schuld des Druckers.

Zum Schluss drucken Sie das Bild auf einem guten Drucker mit 10 Schwarzstufen. Wie deine Kamera. Sie verwenden also das gespeicherte und komprimierte Bild.

00077000
00077000
00888800
04056090
40066009

Wie Sie sehen, ist das Bild "besser", wurde aber etwas vom Original geändert.

Zu jeder Zeit korrigieren Sie, dass es sich nur um die Stärke eines Kanals handelt. Und abgesehen von dem komprimierten Bild, das ohnehin dekomprimiert werden muss, bleibt es dem ziemlich treu.

Das komprimierte Format verliert jedoch viele "Informationen". Sind diese Informationen wichtig? Nun, das liegt an dem Künstler und dem Publikum. Es gibt verschiedene Kompromisse zwischen Platzersparnis, Verarbeitungszeit, Qualität des endgültigen / gespeicherten Bildes und Bedarf. Ich scanne die meisten meiner Dokumente in einer schwarzen Farbe, weil das alles ist, was ich brauche. Meine Hochzeitsfotos sind jedoch im RIESIGEN RAW-Format, weil ich nie weiß, wann ich eine großartige Neuauflage davon haben möchte. Das heißt, wenn ich sie (Fotos) auf einen digitalen Bilderrahmen übertrage, konvertiere ich sie in JPEG, um Platz zu sparen. Unterschiedliche Kanäle, unterschiedliche Filter und unterschiedliche Komprimierungsmethoden sind eine Reihe von Kompromissen. Es ist wie eine digitale Version des Druckerdreiecks.

coteyr
quelle
Ihr 2. Codeblock (komprimiert) zeigt RLE, richtig? Sie sollten wahrscheinlich sagen, dass Sie Samples durch Repeat-Count + Sample-Value ersetzen, damit die Leute wissen, welche Art von Komprimierung es ist, denn es ist absolut nicht offensichtlich, wenn Sie keine RLE erwarten.
Peter Cordes
1

Ich werde mit ein paar zusätzlichen Informationen aufwarten, da ich mit Bilderkennung und Kodierung / Komprimierung gearbeitet habe, wenn auch hauptsächlich mit bewegten Bildern.

In seiner Grundform ist ein Bild (JEDES Bild), das auf einem bestimmten Bildschirm angezeigt wird, in der Tat nur eine identische Anordnung von Zahlen. Diese Zahlen können alle 0-255 oder 0-65535 oder 0-was auch immer-32-Bit-ist-ich-vergaß-go-google-es sein.

ABER es gibt so viele Möglichkeiten, Informationen zu SPEICHERN und ZU TRANSPORTIEREN, dass viele von ihnen einfach Produkte von Technologien sind, die dem Nebel der Zeit verloren gegangen sind.

Ein Detail, das ich bei keinem der anderen hier erwähnten Pedanten gesehen habe, ist, dass echte RAW-Bildsensordaten von einer Digitalkamera möglicherweise RGrGbB in einem übergeordneten Muster oder in einem ähnlichen Format sind, das mindestens ein wenig verarbeitet werden muss, um dies zu erreichen jeder Sinn für den menschlichen Augapfel Mk.1. Selbst in einem RAW-Format, das von Ihrer DSLR gespeichert wurde, ist dies wahrscheinlich nie der Fall, da es unbrauchbar ist, bis Sie es in ein schönes Raster aus RGB- oder YUV-Pixeln konvertieren, seien es 8, 16, 32 oder elf Billionen Bits.

Das Material, an dem ich gearbeitet habe, verwendet YUV aus irgendeinem Grund intern. Ich gehe davon aus, dass es von den Codecs einfacher verarbeitet wird, da Menschen Helligkeit mit einer viel höheren Empfindlichkeit als Farbe wahrnehmen.

Informationen zum Lesen vor dem Schlafengehen finden Sie im Abschnitt "Frame-Bildformat": http://focus.ti.com/lit/ug/sprufg8b/sprufg8b.pdf

Wie auch immer ... zurück zu Ihrer ursprünglichen Frage zum Unterschied zwischen unkomprimierten Bilddateien wie TIFF / RAW / IFF / PNG.

Im Allgemeinen liegt dies daran, dass vor vielen Monden jeder Computer- / Betriebssystem- / Druckerhersteller seine eigenen, leicht unterschiedlichen Anforderungen für das Speichern / Senden von Bildern stellte.

RAW, wie von anderen in diesem Thread erörtert, ist ein Oberbegriff für verschiedene Dinge, die von verschiedenen Digitalkameras gespeichert wurden. Dabei wird die Datenmenge verwendet, die der Hersteller der Kamera aufgrund der Funktionen der Kamera für wichtig hielt oder in Zukunft haben könnte. Obwohl das Hauptbilddatenbit möglicherweise sehr ähnlich ist, beschreibt die "Verpackung" das Bild und alle Kameraeinstellungen usw., sodass eine Datei nicht von einem anderen Hersteller verstanden wird.

Auf diese Weise können Sie (oder mit größerer Wahrscheinlichkeit auch professionelle Fotografen) Ihre proprietäre (und manchmal teure) Software verwenden, um Bilder mit höherer Qualität zu verarbeiten. Andernfalls können Sie möglicherweise die teure Software anderer verwenden. Vielleicht möchte Adobe Photoshop auch ihr Format unterstützen, sodass sie möglicherweise Adobe $$$ für diese Informationen verlangen können, damit professionellere Fotografen PS und möglicherweise diesen Kameramark kaufen, da PS dies jetzt unterstützt. Gemütlich!

RAW speichert auch Informationen darüber, wie dieses bestimmte Datenbündel wieder in ein für den Menschen sichtbares Bild umgewandelt werden kann. Sie müssen lediglich alle erforderlichen Änderungen an den Daten vornehmen, damit das Bild "richtig" aussieht.

TIFF war ein frühes Bildformat, das unter anderem verwendet wurde, um Grafikdaten an Drucker zu senden (als grafikfähige Drucker erschwinglich wurden). Es war ziemlich einfach, es mit dem kleinen billigen Mikroprozessor im Drucker zu verarbeiten.

IFF (yeah, das ist eine Sache) war ein ähnliches Format, das auf Amiga-Computern verwendet wurde. Ich glaube, es wurde von ihnen oder einem der populären Malpakete erfunden. Aber ich verwende es hier als Beispiel, weil es, obwohl es Bitmap-Bilddaten wie die anderen speichert, unkomprimierte oder RLE-Daten unterstützt, variable Bittiefen von 1-Bit-Mono bis 8-Bit-256-Farbe (aber mit eine 3x8-Bit-RGB-Palette zur Auswahl für jede der Farben sowie spezielle Modi namens Halbton und Halten und Ändern, die viel mehr Farben zulassen, als andere Maschinen der Ära verwalten könnten. Oh, und es unterstützte auch Animation (wie GIF), so dass eine IFF-Datei eine beliebige Anzahl von Bildern mit variablen Verzögerungen zwischen den Bildern speichern und jedes Bild eine eigene Palette haben konnte. IFF würde also zusätzliche Daten enthalten, um all dies zu handhaben, beispielsweise im Vergleich zu einer TIFF-Datei.

PNG ist ein weiteres verlustfreies Bildformat, in dem wieder Bitmap-Daten gespeichert werden, das jedoch einige unkonventionelle Funktionen unterstützt, z. B. einen 8-Bit-Alpha-Kanal für variable Transparenz über ein Bild (nützlich auf Webseiten) Der Wrapper ist jedoch anders, und die Nutzdaten enthalten möglicherweise RGBA und nicht nur RGB-Daten pro Pixel.

Das sind also 4 verschiedene Bilddateiformate - Sie könnten ein Beispiel eines HD-Bildes in Farbe einer Katze in einem der 4 speichern und es würde identisch aussehen, jedes Pixel auf Ihrem Bildschirm hätte den GENAUEN GLEICHEN Wert und es würde NEIN geben Qualitätsunterschied zwischen den 4 ... aber die 4 Dateien unterscheiden sich wahrscheinlich in Größe, Layout und sind für die Software einfacher oder schwerer zu laden und zu verarbeiten.

Ich hoffe, das hilft!

John U.
quelle
0

Ich dachte nur, ich würde mich mit den Informationen hier melden, die in der allerersten Antwort auf diese Frage enthalten sein sollten.

Pixel in einem Bild werden nicht in einem Byte gespeichert - es sei denn, das Bild ist einfarbig, dh nur schwarzweiß.

Wenn Sie ein Echtfarbenbild haben, wird jedes Pixel durch 16 Bits oder 2 Bytes dargestellt - als ein Wert. Wenn Sie ein 32-Bit-Bild haben, benötigt jedes Pixel 32 Bit oder 4 Byte, ebenfalls als Einzelwert.

Interessanterweise beschränken sich Bild- und Tondateien sowie alle anderen Datentypen in einem Computer auf Bits von 1 und 0. Nur durch Interpretation in richtig großen Blöcken wird ihnen die Bedeutung entzogen.

Ein Bild, ein Word-Dokument und eine MP3-Datei haben beispielsweise alle denselben grundlegenden Dateninhalt (eine Reihe von Bytes), und jeder von ihnen kann als einer der anderen Typen interpretiert werden. Sie können ein Word-Dokument als Sound interpretieren Datei und Sie würden etwas hören, aber es wäre keine Musik. Sie könnten eine Audiodatei definitiv als ein Bild interpretieren und es würde etwas anzeigen, aber es wäre kein zusammenhängendes Bild.

Zusammenfassend kann man sagen, dass ein Computer nur Bits kennt - ein Bit ist entweder 1 oder 0. Alle Bilder, Töne, Dokumente, Filme, Videos, Aufzeichnungen, Spiele, Telefonanrufe, Textnachrichten und alles andere, was als digital gekennzeichnet ist, haben genau dasselbe Inhalt - ein Bündel von Einsen und Nullen. Die Einsen und Nullen werden zu Bildern, Tönen und Dokumenten und allem anderen, weil der Code, der sie liest, diese Bits in Gruppen liest und sie entsprechend verarbeitet.

Deshalb gibt es 16-Bit- und 32-Bit-Bilder sowie 16-Bit- und 24-Bit-Audiodateien. Je mehr Bits Sie für ein Pixel oder ein Klangbeispiel verwenden, desto aussagekräftiger können Sie sein - 16 Bits können nur 64.000 eindeutige Farben definieren, 32 Bits können jedoch über 4 Millionen eindeutige Farben definieren. Ein monochromes Bild verwendet 1 Bit pro Pixel - entweder ein oder aus.

Bei Audiodateien kann die Aufnahme umso detaillierter und nuancierter sein, je mehr Bits Sie pro Sample verwenden.

Rodney P. Barbati
quelle
0

Ich habe nicht den ganzen Thread gelesen, aber es scheint, dass viele Leute vektorisierte Bildformate vergessen. Dies sind keine Pixel-Arrays, da das Konzept eines Pixels in einem solchen Format nicht existiert. Der Renderer muss herausfinden, wie das Bild auf einem Bildschirm oder einem anderen Medium erstellt werden kann.

Auch ohne Berücksichtigung von Farbdomänen, Komprimierung, Bitgröße und Kanalformat gibt es eine Reihe von Dateiformaten, die sich von Pixelmaps völlig unterscheiden. Vektorformate können jedoch auch bestimmte Arten von Bildern "besser" darstellen, die normalerweise von einem Computer und nicht von einer Kamera erzeugt werden.

Kafein
quelle
1
Dies ist eine Fotografieseite, und da Digitalkameras Pixel-Arrays statt Vektoren aufnehmen, würde ich nicht sagen, dass es in diesem Zusammenhang so viel "Vergessen" bedeutet, wie es nicht normal ist.
Mattdm
0

Diese Frage wurde bereits ausführlich beantwortet. Obwohl in den Antworten eine Menge Theorie enthalten ist, glaube ich, dass es einige grundlegende Themen gibt, die in der Regel mit der Computerprogrammierung zusammenhängen und eine genauere Klärung erfordern. Ich muss sagen, ich bin ein Software-Ingenieur. Nachdem ich die Frage gelesen hatte, stellte ich fest, dass es ein völliges Missverständnis der grundlegenden Programmierdatentypen gibt, die diese Frage erzeugt haben.

Die erste Frage hier ist:

Was unterscheidet ein 16-Bit-Bild vom numerischen Standpunkt von einem 32-Bit-Bild? Auch hier ist ein Bild nur ein Array mit ganzzahligen Werten zwischen 0 und 255.

Wie schon gesagt: Nein, ist es nicht. Ein Bild ist nicht nur ein Array von ganzzahligen Werten zwischen 0 und 255. Tatsächlich kann es sich um ein ein- oder mehrdimensionales Array von 0 bis 65535 Werten handeln, ein Array von 0 bis 4294967295 oder sogar ein Array von Bits (ein Bit kann 0 oder 1 Werte enthalten, das ist alles), das von der Software konvertiert wird, die in der Lage ist Lesen Sie die Bilddateien nach verschiedenen Kodierungsregeln in ganze Zahlen.

Um dies weiter zu verstehen, halte ich, wie bereits erwähnt, eine Diskussion über grundlegende Programmierdatentypen für erforderlich. Ich werde versuchen, sie so einfach wie möglich zu erklären, damit jeder die Probleme versteht, die mit dem Speichern von Ganzzahlwerten in Computerdateien verbunden sind.

In der Computerprogrammierung verwenden wir einige grundlegende primitive Datentypen, um Werte in Dateien zu schreiben, sie aus Dateien in den Computerspeicher zu lesen, diese Werte unter Verwendung verschiedener spezifischer Programmiersprachen-Datentypen zu bearbeiten und sie schließlich wieder in Dateien zu speichern. Ganzzahlen in der Computerprogrammierung sind nicht nur Ganzzahlen. Es gibt alle Arten von Ganzzahlen, abhängig von der verwendeten Programmiersprache und dem Speicherbedarf. In den meisten Programmiersprachen gibt es normalerweise die folgenden Datentypen (und Möglichkeiten, sie zu bearbeiten):

  • BIT - 0 oder 1 halten
  • UINT8 - 8-Bit-Ganzzahl ohne Vorzeichen - Sie können Werte zwischen dem Intervall [0 bis 255] enthalten.
  • INT8 - 8-Bit-Ganzzahl mit Vorzeichen - sie können Werte zwischen [-126 und 127] enthalten.
  • UINT16 - 16-Bit-Ganzzahl ohne Vorzeichen - sie können Werte zwischen dem Intervall [0 bis 65535] enthalten.
  • INT16 - 16-Bit-Ganzzahl ohne Vorzeichen - sie können Werte zwischen [−32768 und 32767] enthalten.
  • UINT32 - 32-Bit-Ganzzahl ohne Vorzeichen - sie können Werte zwischen dem Intervall [0 bis 4294967295] enthalten.
  • INT32 - 32-Bit-Ganzzahl ohne Vorzeichen - sie können Werte zwischen [−2147483648 und 2147483647] enthalten.
  • ODER eine Kombination all dieser Datentypen in einem komplexeren Format. Zum Beispiel eine UINT16 (16 BIT) mit 3 verschiedenen Werten, erste 4 BIT mit Werten zwischen 0 und 127, nächste BIT mit 0 oder 1 und so weiter.

Außerdem müssen sich Programmierer mit dem Lesen oder Schreiben von Integer-Datentypen aus Dateien befassen. Die Endianess.Endianness bezieht sich auf die sequentielle Reihenfolge, in der Bytes (UINT8 aus unserer Tabelle) in größeren numerischen Werten angeordnet werden, wenn sie im Speicher oder in Dateien gespeichert werden. Endianness ist in der Informatik von Interesse, da zwei widersprüchliche und inkompatible Formate gebräuchlich sind: Werte können im Big-Endian- oder Little-Endian-Format dargestellt werden, abhängig davon, ob Bits oder Bytes oder andere Komponenten vom Big-End (höchstwertig) geordnet sind Bit) oder das kleine Ende (niedrigstwertiges Bit). Einfach ausgedrückt können Sie einen Wert wie diesen 0000000011011111 oder ... wie diesen 1101111100000000 in Abhängigkeit von der von Ihnen gewählten Endian-Reihenfolge speichern. Es steht Ihnen frei, eine Bestellung zu wählen, die Ihrem Zweck entspricht. Es gibt keine anderen Regeln, die Sie beim Entwerfen eines Bilddateiformats festlegen.

Bitte beachten Sie, dass in der Computerprogrammierung Ganzzahlen je nach Wert mehr oder weniger Speicherplatz belegen. Wenn Sie mehr Papier zum Schreiben von 255255255 benötigen, benötigen Sie mehr BITs, um einen größeren Wert zu schreiben. Wenn Sie den Wert später lesen möchten, müssen Sie genau die Regeln kennen, die Sie beim Schreiben erstellt haben. Andernfalls können Sie nicht herausfinden, wie Sie nur ein Array mit ganzzahligen Werten zwischen 0 und 255 lesen, da Sie einfach nicht wissen, wo diese Zahlen gespeichert sind und wie diese Zahlen gespeichert sind, wenn Sie so viele Möglichkeiten haben (BIT, UINT8) , UINT16, UINT32 oder eine Kombination all dieser Computerdatentypen). Und vergiss nicht, Endianness. Wenn Sie nicht wissen, dass die Daten in Big-Endian- oder Little-Endian-Reihenfolge geschrieben wurden, können Sie den richtigen Wert nicht lesen.

Aufgrund dessen sind Bilder NIEMALS nur ein Array mit ganzzahligen Werten zwischen 0 und 255. Einige von ihnen sind Arrays von UINT16 (16-Bit-Bilder), andere sind Arrays von UINT32 (32-Bit-Bilder) oder andere sind Arrays von UINT8 (8-Bit-Bilder). Einige sehr kreative Computerprogrammierer können sogar vorzeichenbehaftete Typen verwenden, die Sie mit INT8-Arrays ausstatten, dh Arrays mit Werten zwischen -126 und 127.

Tatsächlich sind beim Lesen einer Bilddatei einige BITs, die die Bildbreite und -höhe darstellen, eines der ersten Daten, auf die Sie stoßen. Und das sind nicht nur einige 0-255-Werte. Dies sind auch einige vom Programmierer ausgewählte Datentypen. Einige Programmierer glauben, dass 16 BITs ausreichend sind, um eine maximale Bildbreite von 65535 Pixeln zu speichern, da sie ein Bildformat entwerfen, das in einem Spiel verwendet wird, um einige Bilder mit kleinen Knöpfen zu speichern. Einige andere Programmierer verwenden hier möglicherweise einen 32-Bit-Wert, mit dem Sie Bilder bis zu einer Breite und Höhe von 4294967295 speichern können. Einige verrückte NASA-Programmierer verwenden möglicherweise sogar 64-Bit, um ein riesiges Foto der Galaxie mit bis zu 18446744073709551615 Pixel zu speichern.Wenn Sie die Regeln nicht kennen, können Sie diese "Werte" nicht lesen, wie Sie sie nennen. Weil Sie nicht wissen, wo sie in der Bilddatei beginnen und wo sie enden. Sie haben also eine Menge BITs, von denen Sie nichts verstehen.

Deshalb ist das Universum voll mit so vielen verschiedenen Bildformaten. Weil es keine Standardlösung gibt, um einige ganzzahlige Werte in eine Datei zu schreiben . Es ist die Wahl des Programmierers, die ausschließlich auf vielen Faktoren wie der Endianess der Maschine, an der Sie arbeiten, der Programmiersprache, die Sie zum Entwerfen der ursprünglichen Dateiformatimplementierung verwenden, und vielen anderen Dingen wie dem Zweck des Bildformats (wie zuvor von klar angegeben) basiert Andere Antwort).

Ein praktisches einfaches Dateiformat für ein Schwarzweißbild, das nur einen einzelnen Wert 166 enthält, um ein Bild mit 4 x 2 Pixeln darzustellen:

Das Bild (1 - schwarzes Pixel, 0 - weißes Pixel):

1010 
0110

Dieses Dateiformat verwendet 1 BIT pro PIXEL, das als SINGLE 8-Bit-Integer-Wert 166 (10100110) gespeichert ist. Das ist alles. Es wird kein Array mit 0-255 Werten verwendet, sondern es werden 8 verschiedene 0- oder 1-Werte als Wert 166 gespeichert.

Wenn Sie für RGB ein Array von 0 bis 255 Werten für jedes Pixel * 3-mal verwendet haben, erhalten Sie ein 24-mal größeres Bild. Dieses Dateiformat sparte gerade das 24-fache des Speicherplatzes, den Sie zum Speichern eines solchen Bildes benötigen, oder das 24-fache des Computerspeichers, der zum Lesen und Speichern dieses Bildes im RAM des Computers erforderlich ist, wenn Sie dieses Bild beispielsweise in Ihrer leistungsstarken 3D-Game-Engine verwenden Zeichnen Sie damit etwas auf den Bildschirm (die Texturierung Tausender herumfliegender Staubpartikel könnte ein guter Kandidat sein :)).

Grigore Madalin
quelle