Farbmessung, Umrechnung Spektrum in RGB und L*a*b*

Hallo,

wir kämpfen hier momentan mit einem Minolta CM-700D.

Wenn die Doku dazu von einem anständigen Japaner gemacht wurde, müsste der sich inzwischen ein langes Messen in den Bauch gerammt haben, aber Schwamm drüber.

Jedenfalls haben wir hier ein dickes Handbuch, in dem die Kommunikation zwischen PC und dem CM-700D beschrieben ist. Warum das als "confidential" markiert ist, ist mir allerdings unverständlich.

Das Ding ist ein Farbspektrometer und liefert offenbar 32 Spektrallinien im sichtbaren Bereich. Die entsprechenden Werte können wir auch auslesen, soweit kein Problem.

Aber der Kunde will L*a*b* haben, was das Gerät auf dem internen LCD-Display auch anzeigt, was man aber anscheinend nicht auslesen kann, bzw. was in der vorliegenden Doku nicht beschrieben ist. Vieleicht gibt es ja noch eine Top-Secret Doku ;-)

Wir haben uns inzwischen die Kommunikation zwischen der Minolta Demo-Software und dem Gerät per Com-Port-Sniffer angesehen (die Kommunikation läuft über Bluetooth). Demnach bekommt auch die Demo-Software von Minolta nur die Spektren, aber keine fertigen L*a*b* Werte.

Jetzt sollte es aber je grundsätzlich kein Problem sein, das gemessene Spektrum in RGB Werte und dann in L*a*b* umzurechnen. RGB -> L*a*b* ist kein Problem, das haben wir bereits früher gemacht.

Was ich jetzt benötige sind die Filterkurven für RGB, damit ich aus dem Spektrum die RGB-Werte berechnen kann:

also etwa so: (Pseudo-Pascal)

var RR,GG,BB,W : array[0..31] of extended; R,G,B : extended;

// RR,GG,BB : Filterkurven, W: Messwerte bzw. Spektralanteile [0..31]

R := 0; G := 0; B := 0;

for i := 0 to 31 do begin R := R + RR[i] * W[i]; G := G + GG[i] * W[i]; B := B + BB[i] * W[i]; end;

Hat jemand eine gute Quelle für die Filterfunktionen, aus denen ich meine Arrays RR,GG und BB bestimmen kann?

Gruß

Stefan

Reply to
Stefan
Loading thread data ...

Am 04.07.2012 09:53, schrieb Stefan:

Habe nicht viel Ahnung in der Materie, aber hast du schon mal

formatting link
als Start für Wissen-bootstrapping versucht?

Waldemar

--
My jsme Borgové. Sklopte ¨títy a vzdejte se. Odpor je marný.
Reply to
Waldemar Krzok

Stefan schrieb:

Hallo,

vielleicht findet sich hier ein weiterführender Link:

formatting link
allerdings stellt sich beim Lesen gleich die Frage welcher RGB Farbraum es denn sein soll, ein bestimmter oder wählbar aus verschiedenen Varianten?

Bye

Reply to
Uwe Hercksen

Am Wed, 04 Jul 2012 09:53:26 +0200 schrieb Stefan:

[... ]

Vielleicht dort:

Marc

Reply to
Marc Santhoff

Am Wed, 04 Jul 2012 08:07:12 +0000 schrieb Marc Santhoff:

Oder auch da:

Marc

Reply to
Marc Santhoff

Am 04.07.2012 10:07, schrieb Marc Santhoff:

Der ist bekannt, aber die Filterkurven habe ich dort noch nicht gefunden.

Gruß

Stefan

Reply to
Stefan

Hi, ich denke, jede Spekrtallinie hat eine Farbe (a,b) und eine Helligkeit(L). RGB-Werte ihrerseits sind abhängig vom verwendeten Farbraum und ergeben entsprechend unterschiedliche Lab-Werte.

Peter

Reply to
Peter Bösche

Am Wed, 04 Jul 2012 10:34:13 +0200 schrieb Stefan:

Dann hast Du diese Seite auch schon gesehen:

Marc

Reply to
Marc Santhoff

Am 04.07.2012 11:07, schrieb Peter Bösche:

Nein, jede Spektrallinie entspricht einer Wellenlänge, d.h. einer monochromatischen Farbe bzw. einem Wellenlängenintervall.

L*a*b* ist eine Farbdarstellung, mit der der Farbeindruck, also das Gefühl des Betrachters durch die drei Parameter L*a*b* ausgedrückt wird.

Daneben gibt es andere Farbdarstellungen, z.B. RGB, bei denen eine Farbe durch die Überlagerung von drei Spektralanteilen Rot Grün und Blau erzeugt wird.

Dahinter steht, dass man zumindest theoretisch für die Erzeugung jedes beliebigen Farbeindruckes nicht das komplette Spektrum benötigt, sondern lediglich drei Spektrallinien überlagern muss. Maßstab ist dabei das menschliche Auge bzw. das menschliche Farbempfinden.

Wenn man nun ein Farbspektrum in eine Darstellung wie RGB oder L*a*b* umrechnen will, benötigt man Filterkurven, die das menschliche Auge nachbilden. Und genau diese Filterkurven suche ich.

Gruß

Stefan

Reply to
Stefan

Am 04.07.2012 11:13, schrieb Marc Santhoff:

Hm, ich habs noch nicht ganz verstanden, könnte aber genau das sein, was ich suche. Muss ich aber erstmal ausprobieren.

Danke erstmal

Gruß

Stefan

Reply to
Stefan

Am Wed, 04 Jul 2012 14:24:59 +0200 schrieb Stefan:

Nun ja, die Kernaussagen sind:

- da gibt es den Quelltext zum download

- "The purpose of this program is to display RGB colors as a function of wavelength for visible light (380 to 780 nm)."

- "There is no unique one-to-one mapping between wavelength and RGB values."

Was draus machen mußt Du natürlich selbst. ;)

Marc

Reply to
Marc Santhoff

Am 04.07.2012 14:20, schrieb Stefan:

Hallo Stefan, ...googeln oder so nach "RGB LAB" ist Dein Freund...

- Du musst im CIE Farbraum "ja nur" von Lab nach RGB umrechnen, um mit Deinem Minolta gluecklich zu werden ("de.wikipedia.org/wiki/Lab-Farbraum"). Deine gesuchte Augenempfindlichkeitskurve ist die V-Lambda Beziehung. Für erstere Umrechnung wird der CIE Farbraum aber, soweit ich das sehe, gar nicht verlassen, und es nur eine Farbkoordinatenumrechnung erforderlich. siehe hierzu die Wikipediaseite. Als ich vor kurzem ein (anderes) Minolta Photometer mit einem Tek J16 mit radiometrischem Kopf verglichen habe, war deutlich mehr Umrechnung notwendig, weil der Herr Lambert und die V-Lambda Bez. auch noch beruecksichtigt werden mussten. Gruß Peter

Reply to
gupemo

Nachtrag: Pardon, man sollte den Ursprungstext doch nochmals lesen. Also benötigst Du "nur" die V-Lambda Kurve. Googeln hilft hier aber auch, ich habe nur die passende URL nicht mehr hier. Es gibt im Net eine numerische Tabelle der V-Lambda Kurve zu finden, wie Du sie suchst. Gruß Peter

Reply to
gupemo

Am 04.07.2012 16:58, schrieb gupemo:

Prima, danke für die Info. Die Bezeichnung V-Lambda Kurve fehlte mir. Werd ich gleich mal nach googeln.

Gruß

Stefan DF9BI

Reply to
Stefan

Am 04.07.2012 17:20, schrieb Stefan:

Roger. Zum Bleistift hier:

formatting link

73, Peter, DK8ZG
Reply to
gupemo

Am 04.07.2012 18:38, schrieb gupemo:

formatting link

Hallo,

auf den ersten Blick sehe ich da noch ein kleines Problem, und zwar benötige ich drei Kurven, jeweils für R G und B. Momentan sehe ich nur eine Gesamtkurve für das gesamte Spektrum des sichtbaren Lichts.

Gruß

Stefan DF9BI

Reply to
Stefan

Was an sich ja sinnvoll ist, da man ja vielleicht den Farbwiedergabeindex einer Lichtquelle bestimmen will und daf=C3=BCr braucht man das ganze Spektrum, nicht nur ein Farbtriplett.

Welches RGB? Es gibt so viele verschiedene RGB-Farbr=C3=A4ume, das man da leicht den =C3=9Cberblick verliert.

Ausserdem deckt RGB nicht den gesamten von L*a*b abgedeckten Farbraum ab? =20

aus

Wieso? Wieso gehst Du nicht direkt nach L*a*b? L*a*b ist ein Kontaktfarbraum, d.h. aus I(\lambda) kann man direkt nach CIE XYZ oder eben L*a*b umrechnen. F=C3=BCr jede der Spektrallinien gibt es eine Position in der a*b-Ebene. Durch ein gewichtetes Mittel kommt man am entsprechenden Punkt in a*b heraus. Die totale Intensit=C3=A4t ist dann L.

formatting link

Wolfgang

Reply to
Wolfgang.Draxinger

Am 2012-07-04 09:53, schrieb Stefan:

Der Standardweg geht über CIE 1931 (richtig, 1931; es gibt modernere Versionen des CIE-Standardfarbraums, aber der alte gilt nach wie vor als Referenz für z.B. alle photometrischen Größen).

Um aus dem Spektrum die Koordinaten X,Y,Z zu gewinnen, benötigt man die CIE Color Matching Functions, die Du auf

formatting link

als downloadbare ASCII-Dateien findest (auch fast alles andere, nebenbei). Diese werden numerisch intergriert (d.h. bei 32 Spektral-Bins einfach aufsummiert), und daraus die Chromatizitäten x,y,z (kleingeschrieben) bestimmt:

x = X/(X+Y+Z), y=Y/(X+Y+Z) z = 1-x-y

formatting link

Dies ist bereits der wichtigste und rechenaufwendigste Schritt. Daraus kann man die RGB-Werte und die L*a*b*-Werte über analytische Formeln gewinnen:

formatting link
formatting link

Für RGB würde ich nicht die Wikipedia-Matrizen nehmen (auch wenn die aus offiziellen Quellen stammen), sondern die von Bruce Lindbloom:

formatting link

Da findet man unter Math alles, was man braucht. Anschließend die Gammakorrektur (steht auch bei Wikipedia unter SRGB) nicht vergessen. L*a*b* aus X,Y,Z funktioniert ähnlich, allerdings braucht man da nicht mal Matrixrechnung.

Die Formeln kann man ggf. sogar in einem Excel-Spreadsheet unterbringen (Integration entweder durch einfaches Summieren oder ggf. über Simpsonregel; komplexere Algorithmen wären hier totaler Overkill), oder sich ein eigenes Programm schreiben. Evtl. geistert sogar der eine oder andere (dann vermutlich eher C/C++ als Pascal)-Code dazu herum.

Der Umweg über XYZ wirkt zunächst mal unintuitiv (intuitiv wäre es eher, R,G,B direkt aus den Spektren herzuleiten, aber das hat andere Nachteile), aber er hat den Vorteil, dass die Luminanz in einer einzigen Variablen (Y; die Y-CMF ist zugleich die photopische Empfindlichkeitskurve des Durschnittsauges). Zumindest hat der CIE-1931-Farbraum eine gewisse Prominenz (jeder dürfte dieses "Farb-Steak" schonmal gesehen haben).

HTH,

Ingo

Reply to
Ingo Thies

Am 2012-07-04 18:42, schrieb Stefan:

Dazu noch ein Nachtrag zu meinem Posting (Links siehe dort) gerade eben. Was Du suchst sind die color matching functions (CMFs) für X, Y, Z, wovon die Y-CMF gerade die V-Lambda-Kurve ist. Mit X, Y, Z kann man direkt L*a*b* berechnen, RGB braucht man dazu gar nicht. Wobei XYZ durchaus entfernt mit RGB vergleichbar (aber eben nicht gleich) ist.

Gruß, Ingo

Reply to
Ingo Thies

ElectronDepot website is not affiliated with any of the manufacturers or service providers discussed here. All logos and trade names are the property of their respective owners.