Wenn wir mit einem Spektrometer Licht messen, erhalten wir in der Regel intensitätsbasierte Spektraldaten über einen Wellenlängenbereich, der auch Teile des sichtbaren Spektralbereichs enthalten kann (ca. 380–800 nm). Diese Daten liefern dann zwar präzise Informationen über die Zusammensetzung des Lichts, enthalten aber keine direkt wahrnehmbaren Farben – wir ersehen also aus den rohen Messwerten noch nicht, wie das Licht für das menschliche Auge aussieht.
Für viele Anwendungen, insbesondere im Kontext von Visualisierungen, GUI-Darstellungen oder interaktiven Lernsoftware, ist es jedoch sehr nützlich, Spektren im sichtbaren Bereich in Farbwerte im RGB-Farbraum umzuwandeln. Auf diese Weise kann ein Computerbildschirm die gemessenen Farben annähernd so darstellen, wie sie vom Menschen wahrgenommen werden.
Die Umrechnung von Spektraldaten in RGB-Farbwerte erlaubt beispielsweise
Kurz gesagt: Die RGB-Umrechnung ist der Brückenschlag zwischen präziser spektraler Messung und menschlicher Farbwahrnehmung. Sie macht aus trockenen Zahlen ein anschauliches Bild, das direkt interpretierbar ist und das Lernen oder die Analyse unterstützt.
Für eine wissenschaftlich präzise Umrechnung von Spektraldaten in Farbwerte existieren die Normen der CIE (Commission Internationale de l'Éclairage). Dabei werden die gemessenen Spektren mit den CIE-Standardbeobachterfunktionen und Normlichtquellen kombiniert, um die Farbraumkoordinaten X,Y,Z zu berechnen. Diese können anschließend in standardisierte RGB- oder Lab-Werte umgerechnet werden. Dieses Verfahren liefert exakte, reproduzierbare Farbwerte, ist aber für schnelle Visualisierungen oder einfache Anwendungsbeispiele oft zu aufwendig.
Es gibt eine sehr nützliche Python-Bibliothek im Umfeld der CIE-Farbmetrien (also die Standards der Commission Internationale de l'Éclairage) mit Namen colour-science
(oft einfach als colour
importiert). Diese Bibliothek implementiert CIE-Standards: CIE 1931 XYZ, CIE 1976 u'v', Farbabstände ΔE, Metamerie, Farbtemperaturberechnungen, Spektral-zu-Farbwert-Transformationen usw. Damit kann man also Spektraldaten, wie sie aus dem DIY-Spektrometer kommen, in Farbkoordinaten umrechnen, z. B. in xy-Chromatizitätskoordinaten oder in standardisierte Farbräume wie sRGB.
Wer die wissenschaftlichen Details hierzu genauer kennenlernen möchte, hat z. B. auch im Rahmen unserer regelmäßig stattfindenden Seminare die Möglichkeit, die vollständigen CIE-Umrechnungen praxisnah zu erlernen und dann auch eigene Experimente mit exakten Farbberechnungen durchführen zu können.
Für unsere Zwecke im Rahmen der DIY-Spektrometer reicht aber in der Praxis eine anschauliche Näherung nach Dan Bruton, welche die Wellenlängen direkt in RGB-Farben umwandelt. Diese Methode ist leicht verständlich, sofort umsetzbar und macht die Farben direkt auf einem Bildschirm sichtbar – ideal für Demonstrationen, GUI-Darstellungen oder den Einsatz im Unterricht.
Die Idee hierbei: für einzelne Wellenlängenbereiche werden R/G/B-Anteile linear interpoliert, am Rand des sichtbaren Spektrums wird eine Intensitätsabschirmung (eine gezielte Dämpfung der Spektralintensität, um realistischere Bildschirmfarben zu erzeugen) angewendet und schließlich noch eine Gamma-Korrektur durchgeführt. Sehr einfach zu implementieren – liefert plausible Bildschirmfarben.
Vorteil: schnell, keine Tabellen/Integrale. Nachteil: nicht CIE-genau, evtl. ungenau bei Farbvergleich/Metamerie.
Als Wellenlängenbereiche nutzte Dan Bruton:
Die Grenzen 380, 440, 490, 510, 580, 645 und 780 nm stammen nicht aus einer physikalischen Gesetzmäßigkeit, sondern aus einer praktischen Approximation des sichtbaren Spektrums, die das menschliche Auge wahrnimmt:
Kurz: Diese »Grenzwerte« sind empirische Brüche des sichtbaren Spektrums, so dass man eine einfache lineare Interpolation zwischen den Basisfarben machen kann. Sie sind also nicht exakt die Peak-Absorptionen der Zapfen im Auge oder CIE-Funktionen, sondern eine praktische Näherung, die auf einer subjektiven Farbwahrnehmung beruht.
Wissenswertes zur Bruton-Variante: Die hier vorgestellte Methode zur Umrechnung von Wellenlängen in RGB-Werte wurde von Dan Bruton entwickelt, einem Physiker an der Texas A&M University. Die Methode basierte ursprünglich auf einem Fortran-Programm und wurde erstellt, um eine Spektralanzeige zu generieren und hierbei die Farbwahrnehmung des menschlichen Auges zu simulieren.
Obwohl die Originalquelle im Moment offenbar nicht mehr online verfügbar ist, wird die Bruton-Methode weiterhin in verschiedenen wissenschaftlichen Arbeiten und Projekten verwendet. Beispielsweise wurde sie in der Studie »Performing Calibration of Transmittance by Single RGB-LEDs« von D. Carreres-Prieto et al. verwendet, um die RGB-Werte für sichtbare Wellenlängen zu approximieren: Performing Calibration of Transmittance by Single RGB-LED within the Visible Spectrum.
Für die Implementierung in modernen Programmiersprachen wie Python oder R gibt es auch zahlreiche Ressourcen, die auf der Bruton-Methode basieren. Ein Beispiel ist die R-Funktion wavelength2col
aus dem Paket cooltools
, die die ursprüngliche Fortran-Implementierung von Dan Bruton nutzt: search.r-project.org.
Wir nutzen die Bruton-Näherung aufgrund ihrer einfachen Implementierung auch in den Skripten zu unseren DIY-Spektrometern.
Hier die entsprechende Funktion (auch als Download):
# Approximates the screen color of a wavelength (380–780 nm) with brightness based on the sensor signal.
# Parameters:
# wavelength : float : Wavelength in nm
# intensity : float : Sensor signal (0–65536)
# gamma : float : Gamma correction (standard 0.8)
#
# Returns:
# str : RGB-Hex string as e.g. '#rrggbb'
# --- Bruton Color assignment ---
if wavelength < 380 or wavelength > 780:
R = G = B = 0.0
elif 380 <= wavelength < 440:
R = -(wavelength - 440) / (440 - 380)
G = 0.0
B = 1.0
elif 440 <= wavelength < 490:
R = 0.0
G = (wavelength - 440) / (490 - 440)
B = 1.0
elif 490 <= wavelength < 510:
R = 0.0
G = 1.0
B = -(wavelength - 510) / (510 - 490)
elif 510 <= wavelength < 580:
R = (wavelength - 510) / (580 - 510)
G = 1.0
B = 0.0
elif 580 <= wavelength < 645:
R = 1.0
G = -(wavelength - 645) / (645 - 580)
B = 0.0
else: # 645–780
R = 1.0
G = 0.0
B = 0.0
# --- Intensity correction at the spectrum edges ---
if 380 <= wavelength < 420:
factor = 0.3 + 0.7*(wavelength - 380)/(420 - 380)
elif 420 <= wavelength < 701:
factor = 1.0
elif 701 <= wavelength <= 780:
factor = 0.3 + 0.7*(780 - wavelength)/(780 - 700)
else:
factor = 0.0
# --- Logarithmic brightness scale ---
# Minimum value 1, to avoid log(0)
intensity = max(intensity, 1)
brightness = math.log(intensity) / math.log(65536) # 0..1
brightness *= factor # Factor from Bruton correction
# --- Gamma correction und 0–255 scaling ---
def adjust(c):
return int(round((c * brightness) ** gamma * 255))
r, g, b = adjust(R), adjust(G), adjust(B)
return f'#{r:02x}{g:02x}{b:02x}'
Als Beispiel zeigen wir hier dann noch das Spektrum einer Weißlicht-LED-Lampe, welches mit der Bruton-Näherung visualisiert ist. Man sieht in dieser Abbildung sehr schön, dass die Übergänge zwischen den einzelnen Farben ohne größere Sprünge dargestellt werden.
Hier können Sie unkompliziert eine Frage oder Anfrage zu unseren Produkten stellen:
Aktualisiert am: 08.09.2025