Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Multimedia (https://www.delphipraxis.net/16-multimedia/)
-   -   Delphi RGB -> XYZ -> LAB Farbraum (Rechenformel und-oder Code) (https://www.delphipraxis.net/146700-rgb-xyz-lab-farbraum-rechenformel-und-oder-code.html)

Erebos 25. Jan 2010 18:09


RGB -> XYZ -> LAB Farbraum (Rechenformel und-oder Code
 
Hey Leute ich suche jetzt schon den ganzen Tag im Netz nach einer Formel zur umrechnung vom RGB- ins XYZ-
und schließlich ins L*A*B*-Farbsystem!

Kennt jemand eine Formel oder ein Codeschnipsel, in der die genannten Umrechnungen sind?

Photoshop kann das auch also muss es möglich sein^^... Ich habe auch schon ein paar
Quelltexte durchgeschaut, aber nix brauchbares (bzw. funktionierendes) gefunden!

Und die Formeln aus dem Wiki -> http://de.wikipedia.org/wiki/Lab-Farbraum , habe ich auch schon versucht anzuwenden ... aber es kommen zum Schluss Pseudowerte heraus... L ist dann auf einmal 129 obwohl L in % angegeben wird... und nur bis 100 geht...
a ist 199283E10 oder ähnliches...

hier mein Code damit ihr meine Anfänge nachvollziehen könnt (Die Formel ist die von Wikipedia):

die Farbe hole ich mir durch eine MouseUp procedure indem ich einen Pixel im Bild (was direkt aufs Form2 gezeichnet ist) anklicke dann wird die Farbe mit

Delphi-Quellcode:
Color2Lab(Form2.Canvas.Pixels[x,y],L2,a2,b2);
an die folgende Procedure übergeben:
(die RGB Werte stimmen! Ich habs gecheckt.)

Delphi-Quellcode:
procedure Color2Lab(Color: TColor; var L,a,b: Single);
var
x,y,z : double;
Yn,Xn,Zn : double;
sR,sG,sB : Byte;
begin
//Color zu RGB
   sR:= GetRValue(Color);
   sG:= GetGValue(Color);
   sB:= GetBValue(Color);
//Erst ins XYZ System
  X := 0.4124564*sR + 0.3575761*sG + 0.1804375*sB;
  Y := 0.2126729*sR + 0.7151522*sG + 0.0721750*sB;
  Z := 0.0193339*sR + 0.1191920*sG + 0.9503041*sB;
//Dann XYZ Koords ins LABsystem
  //CONST
  Yn := 1;
  Xn := x/y;
  Zn := z/y;
  //
L := 116*(power(Y/Yn,1/3)-16);
a := 500*((power(x/xn,1/3)-power(y/yn,1/3)));
b := 200*((power(y/yn,1/3)-power(z/zn,1/3)));
end;

Bitte findet meinen Fehler sonst könnt ihr mich einweisen :-D !!

sx2008 25. Jan 2010 23:47

Re: RGB -> XYZ -> LAB Farbraum (Rechenformel und-oder
 
Du müsstest wohl noch die RGB-Werte auf 1.0 normieren:
Delphi-Quellcode:
sR,sG,sB : Double; // 0.0 .. 1.0
begin
  //Color zu RGB
  sR:= GetRValue(Color) / 255.0;
  sG:= GetGValue(Color) / 255.0;
  sB:= GetBValue(Color) / 255.0;

Erebos 26. Jan 2010 11:45

Re: RGB -> XYZ -> LAB Farbraum (Rechenformel und-oder
 
Dankeschön für den Tipp, aber leider funktioniert es immer noch nicht die Werte aus dem XYZ System sind jetzt immer im Bereich von 0.xxx und die im L*A*B*-Bereich sind unverändert groß.

Danke trotzdem ich bin für jeden Hinweis, für jede Idee dankbar!

himitsu 26. Jan 2010 12:22

Re: RGB -> XYZ -> LAB Farbraum (Rechenformel und-oder
 
Delphi-Quellcode:
L := 116*power(Y/Yn,1/3)-16;
hier war, glaub ich, eine Klammer zuviel,

aber sonst ... :gruebel: ... sieht es eigentlich genauso aus, wie in dem Wikipedia-Artikel.

tkone 26. Jan 2010 14:01

Re: RGB -> XYZ -> LAB Farbraum (Rechenformel und-oder
 
himitsu hat schon den fehler bei L gefunden. jetzt scheinen alle funktionen richtig geschrieben zu sein.

also liegt das problem eher. ich würde mal tippen, dass dein getRvalue/getGvalue/getBvalue nicht richtig funktioniert.

ich würde die funktion getcolor verwenden.
diese liefert dir einen Tcolor wert nach dem schema $00FFEEDD

dabei steht $00 für das höchstwertige byte
Zitat:

[OH]Hat das höchstwertige Byte den Wert Null, erhalten Sie eine Farbe, die derjenigen in der Systempalette am ähnlichsten ist. Ist das höchstwertige Byte Eins ($01 bzw. 0x01), ergibt das eine Farbe, die derjenigen in der aktiven Palette am ähnlichsten ist. Wenn Sie das höchstwertige Byte auf Zwei ($02 bzw. 0x02) setzen, wird der Wert an die ähnlichste Farbe in der logischen Palette des aktuellen Gerätekontexts angepasst.[/OH]
FF ist dein hexadezimalwert für B (hier 255)
DD ist dein wert für G
EE ist dein wert für R

versuchs mal damit. müsste eigentlich klappen


Alle Zeitangaben in WEZ +1. Es ist jetzt 09:50 Uhr.

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz