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
quelle
Antworten:
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:
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:
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.
quelle
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.
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.
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.
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.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.
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.
quelle
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:
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,0
zu Pixel0,11
) von255,255,255,255,255,215,215,235,100,000,000,000
- RLE würde dies codieren als52552215123511003000
- 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 rekonstruieren255,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
(YCbCr
wirklich) Modell JPEG (und fast jedes Video - Codec) verwendet:Y = Luminance
,Cb = Chrominance Blue
,Cr = Chrominance Red
. Ein Mensch kann den Unterschied zwischen einem4:2:0
(jedes Pixel hat einen Luminanzwert, aber Farben werden abwechselnd in Blöcken von 24: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.
quelle
.CR2
sagt 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.Das ist eine ernsthaft gebrochene Annahme, und der Rest Ihrer Frage kann einfach nicht beantwortet werden, ohne sich davon zu lösen.
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.
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.
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.
Komprimierungsalgorithmen "ändern" nicht nur Werte, sie codieren die Informationen auf eine völlig andere Weise, zum Beispiel kann JPEG grob als beschrieben werden
Verlustfrei komprimierte Formate bauen dagegen häufig auf allgemeinen Datenkomprimierungsalgorithmen auf, ergänzen diese jedoch manchmal um bildspezifische Vorverarbeitungen, wie z. B. PNG.
quelle
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:
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:
Hier ist der Adobe RGB-Bereich. Beachten Sie, wie viel größer das ist, als mein Bildschirm anzeigen kann!
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.
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.
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.
Moderne Komprimierungsalgorithmen sind komplizierter, aber dies ist ein gutes Beispiel. Ich verwende hexadezimal
FF
, um 255 undFE
254 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:wir können das zu einem sehr einfachen komprimieren
... 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:
Nun gibt uns die Lauflängencodierung:
... was überhaupt keine Einsparungen darstellt und in der Tat die Dateigröße hätte erhöhen können. Wenn wir jedoch alle
FE
Werte auf rundenFF
, 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
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 .
quelle
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:
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.
quelle
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.
Überprüfen Sie übrigens, wie sich die Netpbm-Codierung wirklich von JPEG unterscheidet .
quelle
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
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.
quelle
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 .Bitmaps
Eine Bitmap (BMP) ist im Wesentlichen das, was Sie beschreiben, ein Array von Zahlen, die Pixelfarben darstellen. ZB sowas
Verlustfreie Kompression
Definieren wir nun ein Komprimierungsschema. In unserem Komprimierungsschema haben wir ein Array von Zahlenpaaren. Z.B
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
Die Kodierung ist
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
Dies entspricht der Länge unserer ersten Komprimierungsmethode.
Und unsere zweite könnte beides sein
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
Oder
Dies ist der gleiche Anfangskreis, der jedoch durch zwei Punktkreise abgedeckt ist. In Schritten wäre es
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
und
die wieder in pixel konvertiert sind
und
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.
quelle
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?
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
.png
Bild und ein.jpg
Bild. 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
.png
Dateien 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.jpg
Dateien 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).
quelle
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.
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.
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.
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.
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.
quelle
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!
quelle
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.
quelle
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.
quelle
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:
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):
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):
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 :)).
quelle