Kennt jemand eine Formel zur Umwandlung einer Lichtfrequenz in einen RGB-Wert?
algorithm
language-agnostic
rgb
formula
approximation
Shaul Behr
quelle
quelle
Antworten:
Hier finden Sie eine detaillierte Erläuterung des gesamten Konvertierungsprozesses: http://www.fourmilab.ch/documents/specrend/ . Quellcode enthalten!
quelle
Für faule Leute (wie mich) gibt es hier eine Implementierung des Codes in Java, der in der Antwort von @ user151323 enthalten ist (dh nur eine einfache Übersetzung des Pascal-Codes aus Spectra Lab Report ):
quelle
Wavelength<=439
zuWavelength<440
.Grund Idee:
Die Schritte 1 und 2 können variieren.
Es gibt verschiedene Farbanpassungsfunktionen, die als Tabellen oder als analytische Näherungswerte verfügbar sind (vorgeschlagen von @Tarc und @Haochen Xie). Tabellen sind am besten geeignet, wenn Sie ein glattes, präzises Ergebnis benötigen.
Es gibt keinen einzelnen RGB-Farbraum. Es können mehrere Transformationsmatrizen und verschiedene Arten der Gammakorrektur verwendet werden.
Unten ist der C # -Code, den ich mir kürzlich ausgedacht habe. Es verwendet eine lineare Interpolation über die Tabelle "CIE 1964 Standard Observer" und eine sRGB-Matrix + Gammakorrektur .
Ergebnis für den Bereich von 400-700 nm:
quelle
Obwohl dies eine alte Frage ist und bereits eine Handvoll guter Antworten erhält, war ich beim Versuch, eine solche Konvertierungsfunktion in meiner Anwendung zu implementieren, mit den hier bereits aufgeführten Algorithmen nicht zufrieden und habe meine eigenen Untersuchungen durchgeführt, die mir einige gute Ergebnisse gebracht haben. Also werde ich eine neue Antwort posten.
Nach einigen Recherchen stieß ich auf dieses Papier, Einfache analytische Annäherungen an die CIE XYZ-Farbanpassungsfunktionen , und versuchte, den eingeführten stückweisen Gaußschen Anpassungsalgorithmus mit mehreren Lappen in meine Anwendung zu übernehmen. In diesem Artikel wurden nur die Funktionen zum Konvertieren einer Wellenlänge in die entsprechenden XYZ-Werte beschrieben . Daher habe ich eine Funktion zum Konvertieren von XYZ in RGB im sRGB-Farbraum implementiert und kombiniert. Das Ergebnis ist fantastisch und es lohnt sich, es zu teilen:
Mein Code ist in Java 8 geschrieben, aber es sollte nicht schwierig sein, ihn auf niedrigere Versionen von Java und anderen Sprachen zu portieren.
quelle
transfer
DoubleUnaryOperator getan hat (daher sind die Erklärungen in meinem vorherigen Kommentar nicht korrekt). Überprüfen Sie daher den neuen Code.1.
ist nur 1, aber der Typ wirddouble
anstelle vonint
Sie sprechen über die Konvertierung von Wellenlänge in einen RGB-Wert.
Schauen Sie hier, wird wahrscheinlich Ihre Frage beantworten. Sie haben ein Dienstprogramm, um dies mit dem Quellcode zu tun, sowie einige Erklärungen.
WaveLengthToRGB
quelle
Ich denke, ich könnte meinem Kommentar genauso gut eine formelle Antwort geben. Die beste Option ist die Verwendung des HSV-Farbraums. Obwohl der Farbton die Wellenlänge darstellt, handelt es sich nicht um einen Eins-zu-Eins-Vergleich.
quelle
Ich habe eine bekannte Anpassung bekannter Farbtonwerte und Frequenzen durchgeführt (Rot und Violett fallen gelassen, weil sie sich in Frequenzwerten so weit erstrecken, dass sie die Dinge ein wenig verzerren), und ich habe eine grobe Umrechnungsgleichung erhalten.
Es geht wie
Frequenz (in THz) = 474 + (3/4) (Farbtonwinkel (in Grad))
Ich habe versucht, mich umzuschauen und festzustellen, ob sich jemand diese Gleichung ausgedacht hat, aber bis Mai 2010 habe ich nichts gefunden.
quelle
Methode 1
Dies ist etwas bereinigt und getestet C ++ 11-Version von @ haochen-xie. Ich habe auch eine Funktion hinzugefügt, die den Wert 0 in 1 in eine Wellenlänge im sichtbaren Spektrum umwandelt, die mit dieser Methode verwendet werden kann. Sie können einfach unten in eine Header-Datei einfügen und diese ohne Abhängigkeiten verwenden. Diese Version wird beibehalten hier .
Die Darstellung der Farben von 375 nm bis 725 nm sieht wie folgt aus:
Ein Problem bei dieser Methode ist die Tatsache, dass sie nur zwischen 400 und 700 nm funktioniert und außerhalb davon scharf auf Schwarz abfällt. Ein weiteres Problem ist das schmalere Blau.
Zum Vergleich sind unten die Farben aus den Vision-FAQ auf maxmax.com aufgeführt:
Ich habe dies verwendet, um eine Tiefenkarte zu visualisieren, bei der jedes Pixel den Tiefenwert in Metern darstellt. Dies sieht wie folgt aus:
Methode 2
Dies wird als Teil der Nur- Datei-Header-Bibliothek bitmap_image von Aeash Partow implementiert:
Die Darstellung der Wellenlänge von 375-725 nm sieht wie folgt aus:
Dies ist also in 400-725nm besser verwendbar. Wenn ich dieselbe Tiefenkarte wie in Methode 1 visualisiere, komme ich unten. Es gibt ein offensichtliches Problem mit diesen schwarzen Linien, von denen ich denke, dass sie auf einen kleinen Fehler in diesem Code hinweisen, den ich nicht genauer untersucht habe. Auch Veilchen sind bei dieser Methode etwas schmaler, was für weit entfernte Objekte weniger Kontrast verursacht.
quelle
Projizieren Sie den CIExy der Wellenlänge in Richtung des D65-Weiß auf den sRGB-Farbumfang
quelle