Du bist nicht angemeldet.

Stilllegung des Forums
Das Forum wurde am 05.06.2023 nach über 20 Jahren stillgelegt (weitere Informationen und ein kleiner Rückblick).
Registrierungen, Anmeldungen und Postings sind nicht mehr möglich. Öffentliche Inhalte sind weiterhin zugänglich.
Das Team von spieleprogrammierer.de bedankt sich bei der Community für die vielen schönen Jahre.
Wenn du eine deutschsprachige Spieleentwickler-Community suchst, schau doch mal im Discord und auf ZFX vorbei!

Werbeanzeige

Volker_Neff

Treue Seele

  • »Volker_Neff« ist der Autor dieses Themas

Beiträge: 249

Wohnort: Hamburg

  • Private Nachricht senden

1

02.02.2016, 17:19

Spektrum zu RGB

Moin,

ich war letzte Woche im Desy und habe Experimente zur Spektroskopie gemacht. Nun wollte ich ein kleines Programm schreiben mit dem man simulieren kann das unterschiedliche Gase in einer Leuchtstoffröhre leuchten. Dafür nutze ist Daten eines Spektrometers. Das zusammen rechnen läuft wunderbar doch habe ich das Gefühl das ich die Spektren am Ende nicht richtig in den RGGB-Farbraum transformiert bekomme. Dazu verwende ich im Moment untenstehende Funktion. Sie berechnet für jede Frequenz einen RGB-Wert. Mit einer einzelnen Frequenz funktioniert das sehr gut. Wenn ich nun ein ganzes Spektrum benutze berechne ich zunächst einmal sämtliche RGB-Werte und addiere die dann abhängig ihrer Intensität. Ich habe das Gefühl das die Farben die dabei rauskommen nicht dem Original entsprechen. Dazu hänge ich einmal einen geplotteten Graphen mit an.
Nun zu meiner Frage, kennt sich jemand mit dem Thema aus? Ist mein Weg richtig oder bin ich voll auf dem Holzweg und gibt es eventuell alternativen dazu?


Quellcode

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
 private Color colorFromFrequenz(float lambda)
  {
    Color c = new Color(0,0,0);
    if(lambda < 380) //Ausoritueren welche Frequenzen im UV Bereich liegen
      {
        c.r = 0;
        c.g = 0;
        c.b = 0;
      }
      else if(lambda > 780) //Ausortieren welche Frequenzen im IR Bereich liegen
      {
        c.r = 0;
        c.g = 0;
        c.b = 0;
      }
      else if(lambda >= 380 && lambda <= 440)
      {
        c.r = (440.0f - lambda)/(440.0f -380.0f);
        c.g = 0;
        c.b = 1;
      }
      else if(lambda >= 440 && lambda <= 490)
      {
        c.r = 0;
        c.g = (lambda - 440.0f)/(490.0f - 440.0f);
        c.b = 1;
      }
      else if(lambda >= 490 && lambda <= 510)
      {
        c.r = 0;
        c.g = 1;
        c.b = (510.0f - lambda)/(510.0f - 490.0f);
      }
      else if(lambda >= 510 && lambda <= 580)
      {
        c.r = (lambda - 510.0f)/(580.0f - 510.0f);
        c.g = 1;
        c.b = 0;
      }
      else if(lambda >= 580 && lambda <= 645)
      {
        c.r = 1;
        c.g = (645.0f - lambda)/(645.0f - 580.0f);
        c.b = 0;
      }
      else if(lambda >= 654 && lambda <= 780)
      {
        c.r = 1;
        c.g = 0;
        c.b = 0;
      }
    return c;
  }


Vielen Dank für eure Hilfe
»Volker_Neff« hat folgendes Bild angehängt:
  • Helium.png

dot

Supermoderator

Beiträge: 9 757

Wohnort: Graz

  • Private Nachricht senden

2

02.02.2016, 19:28

Die RGB Intensitäten zu einem bestimmten Spektrum ergeben sich effektiv als Faltungsintegral mit den Empfindlichkeitskurven der Farbrezeptoren in deinem Auge. Wir haben es da mit einer hochgradig nichtlinearen Abbildung zu tun. Dein Versuch, den Bereich sichtbarer Wellenlängen in drei Segmente zu Teilen und einfach, je nachdem wie weit in welchem Bereich du dich befindest, die Intensität zu skalieren, ist nett, liefert aber leider keine gute Approximation der tatsächlichen Gegebenheiten, die in etwa so aussehen:

(Link)


Stattdessen besorgst du dir besser, beispielsweise hier, die Empfindlichkeitskurven des CIE Standard Observer. Mit denen kannst du, wie beispielsweise hier beschrieben, die XYZ Tristimulus Werte zu deinem gegebenen Spektrum ausrechnen. Wenn du die hast, kannst du diese dann, wie beispielsweise hier beschrieben, in sRGB umrechnen... ;)

Volker_Neff

Treue Seele

  • »Volker_Neff« ist der Autor dieses Themas

Beiträge: 249

Wohnort: Hamburg

  • Private Nachricht senden

3

03.02.2016, 11:17

Danke für deine Links. Ich muss zugeben ich steige da gerade nicht so richtig durch. Wie kommt man auf die verschiedenen Funktionen für die mittleren Wellenlängen.
Unter der Annahme das 1 = X + Y +Z wird es nie werte geben bei den die Farbe Blau zum oder so 100% beinhaltet, sind das dann in gewisser weise Farben die es nicht gibt. Auf der anderen Seite lässt es sich ja anzeigen.
Eine letzte Frage noch, gibt es eine einfache Möglichkeit die Graphen zu Normalisieren?

Volker_Neff

Treue Seele

  • »Volker_Neff« ist der Autor dieses Themas

Beiträge: 249

Wohnort: Hamburg

  • Private Nachricht senden

4

03.02.2016, 17:19

Ich habe mich nun doch schon einige Zeit durchs Internet gesucht und noch mal meinen Physiklehrer angesprochen jedoch ist mir nicht klar geworden wie ich auf die entsprechenden X, Y, Z Funktionen kommen soll, bzw. wo ich die im Internet finde. Vielleich suche ich auch nur nach dem falschen Strichwort.
Ich bin auf diese Funktiongestoßen aber was nun s, m und l sind erschließt sich mir nicht. Irgendwie müssen die ihren Plot doch auch gerechnet haben. Wenn mir da noch jemand weiter helfen könnte wäre ich ihm da sehr dankbar

dot

Supermoderator

Beiträge: 9 757

Wohnort: Graz

  • Private Nachricht senden

5

03.02.2016, 17:38

Hab doch eh die Seite mit einer Tabelle dazu verlinked: http://www.cis.rit.edu/research/mcsl2/on…StdObsFuncs.htm ;)

Volker_Neff

Treue Seele

  • »Volker_Neff« ist der Autor dieses Themas

Beiträge: 249

Wohnort: Hamburg

  • Private Nachricht senden

6

04.02.2016, 09:19

Das heißt das es nur die Möglichkeit gibt es mit den Daten aus der Tabelle zu vergleichen es aber keine Mathematische Funktion gibt mit der ich rechnen könnte

dot

Supermoderator

Beiträge: 9 757

Wohnort: Graz

  • Private Nachricht senden

7

04.02.2016, 10:32

Du kannst versuchen, die Daten in der Tabelle mit einer Funktion zu approximieren. Diese Daten wurden aber selbstverständlich experimentell ermittelt und nicht mathematisch hergeleitet, denn eine solche theoretische Herleitung der Empfindlichkeit der durchschnittlichen, menschlichen Farbwahrnehmung gestaltet sich leider eher schwierig... ;)

Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von »dot« (04.02.2016, 10:44)


Volker_Neff

Treue Seele

  • »Volker_Neff« ist der Autor dieses Themas

Beiträge: 249

Wohnort: Hamburg

  • Private Nachricht senden

8

04.02.2016, 10:47

Ah ok dann weiß ich wo mein Fehler liegt
Vielen Dank noch mal

Werbeanzeige