trans_from_rgb
— Transformation vom RGB- in einen anderen Farbraum.
trans_from_rgb(ImageRed, ImageGreen, ImageBlue : ImageResult1, ImageResult2, ImageResult3 : ColorSpace : )
trans_from_rgb
transformiert ein Bild von RGB in den
angegebenen Farbraum (ColorSpace
). Die drei Kanäle
werden als drei getrennte Bilder sowohl ein- als auch ausgegeben.
Die Bildtypen byte, uint2, int4 und real werden unterstützt. Dabei sollten real-Bilder nur Werte zwischen 0 und 1 erhalten. Andernfalls sind die Ergebnisse der Transformationen möglicherweise nicht sinnvoll.
Entsprechend des Datentyps der beteiligten Bilder werden noch Skalierungen vorgenommen, wenn eine der folgende Bedingungen zutrifft:
Der Wertebereich der Farbraumgrößen wird bei byte- und uint2-Bildern generell auf den vollen Bereich von [0..255] bzw. [0..65535] abgebildet. Bei vorzeichenbehafteten Farbraumgrößen (z.B. bei CIELab) liegt aus diesem Grund der Nullpunkt nicht in der Mitte des Bereiches.
Hue Werte werden durch Winkel im Bereich von [0..2pi[ repräsentiert, welche für die jeweiligen Bildtypen unterschiedlich kodiert werden:
byte-Bilder bilden den Winkelbereich auf [0..255] ab.
uint2/int4-Bilder werden in Winkelminuten [0..21600[ kodiert, außer für 'cielchab' und 'cielchuv' für int4-Bilder, für die sie als Winkelsekunden [0..1296000[ kodiert werden.
real-Bilder werden im Bogenmaß [0..2pi[ kodiert, außer für 'cielchab' und 'cielchuv' für die die Normen ISO 11664-4:2008 und ISO 11664-5:2009 vorschreiben, dass der Hue in Grad angegeben wird.
Sättigungswerte (Saturation) werden in Prozent angegeben, welche für die jeweiligen Bildtypen unterschiedlich kodiert werden:
byte-Bilder bilden die Sättigung auf [0..255] ab.
uint2/int4-Bilder bilden die Sättigung auf [0..10000] ab.
real-Bilder bilden die Sättigung auf [0..1] ab.
Unterstützt werden die unten folgenden Transformationen. Dabei gilt zu beachten, dass die angegebenen Wertebereiche sich auf eine Skalierung der RGB Werte auf das Intervall [0;1] beziehen. Der Wertebereich für die jeweiligen Bildtypen ergibt sich durch Skalierung mit den entsprechenden Wertebereichen. Aufgrund verschiedener Genauigkeiten können die mit den unten angegebenen Gleichungen erhaltenen Werte leicht von den Resultaten des Operators abweichen.
Es gilt zu beachten, dass , und nicht unabhängig voneinander sind.
Die verwendeten Grundfarben entsprechen sRGB bzw. der CIE Rec. 709. Als Weißpunkt wird D65 verwendet.
Min := min([R, G, B]) Max := max([R, G, B]) L := (Min + Max) / 2 if (Max == Min) H := 0 S := 0 else if (L > 0.5) S := (Max - Min) / (2 - Max - Min) else S := (Max - Min) / (Max + Min) endif if (R == Max) H := ((G - B) / (Max - Min)) * rad(60) elseif (G == Max) H := (2 + (B - R) / (Max - Min)) * rad(60) elseif (B == Max) H := (4 + (R - G) / (Max - Min)) * rad(60) endif endif
Min := min([R, G, B]) Max := max([R, G, B]) V := Max if (Max == Min) S := 0 H := 0 else S := (Max - Min) / Max if (R == Max) H := ((G - B) / (Max - Min)) * rad(60) elseif (G == Max) H := (2 + (B - R) / (Max - Min)) * rad(60) elseif (B == Max) H := (4 + (R - G) / (Max - Min)) * rad(60) endif endif
Min := min([R, G, B]) Max := max([R, G, B]) I := (R + G + B) / 3 if (I == 0) H := 0 S := 1 else S := 1 - Min / I if (S == 0) H := 0 else X := (R + R - G - B) / 2 Y := (R - G) * (R - G) + (R - B) * (G - B) Z := sqrt(Y) if (Z == 0) H := 0 else H := acos(X/ Z) endif if (B > G) H := rad(360) - H endif endif endif
f(t) = t^(1/3), t > (24/116)^3 f(t) = (841/108)*t + 16/116, sonst. Schwarzpunkt B: (Rb, Gb, Bb) = (0, 0, 0) Weißpunkt W = (Rw, Gw, Bw), je nach Bildtyp: byte:=(255, 255, 255), uint2:=(2^16-1, 2^16-1, 2^16-1), int4:=(2^31-1, 2^31-1, 2^31-1), real:=(1.0, 1.0, 1.0)
(Für byte/uint2-Bildtypen auf den maximalen Grauwert skaliert. Im Falle von int4-Bildtypen sind L und a auf den maximalen Grauwert und b auf den minimalen Grauwert skaliert, so dass der Nullpunkt erhalten bleibt.)
f(t) = t^(1/3), t > (24/116)^3 f(t) = (841/108)*t + 16/116, sonst. h_ab liegt zwischen 0° und 90° falls a und b positiv sind, zwischen 90° und 180° falls negativ ist und b positiv ist, zwischen 180° und 270° falls a und b negativ sind und zwischen 270° und 360° falls a positiv ist und b negativ ist. Schwarzpunkt B: (Rb, Gb, Bb) = (0, 0, 0) Weißpunkt W = (Rw, Gw, Bw), je nach Bildtyp: byte:=(255, 255, 255), uint2:=(2^16-1, 2^16-1, 2^16-1), int4:=(2^31-1, 2^31-1, 2^31-1), real:=(1.0, 1.0, 1.0)
(Für byte/uint2-Bildtypen auf den maximalen Grauwert skaliert. Im Fall von int4-Bildtypen sind L und C auf den maximalen Grauwert skaliert und h wird in Winkelsekunden angegeben.)
f(t) = t^(1/3), t > (24/116)^3 f(t) = (841/108)*t + 16/116, sonst. Schwarzpunkt B: (Rb, Gb, Bb) = (0, 0, 0) Weißpunkt W = (Rw, Gw, Bw), je nach Bildtyp: byte:=(255, 255, 255), uint2:=(2^16-1, 2^16-1, 2^16-1), int4:=(2^31-1, 2^31-1, 2^31-1), real:=(1.0, 1.0, 1.0)
(Für byte/uint2-Bildtypen auf den maximalen Grauwert skaliert. Im Falle von int4-Bildtypen sind L und u auf den maximalen Grauwert und v auf den minimalen Grauwert skaliert, so dass der Nullpunkt erhalten bleibt.)
f(t) = t^(1/3), t > (24/116)^3 f(t) = (841/108)*t + 16/116, sonst. Schwarzpunkt B: (Rb, Gb, Bb) = (0, 0, 0) Weißpunkt W = (Rw, Gw, Bw), je nach Bildtyp: byte:=(255, 255, 255), uint2:=(2^16-1, 2^16-1, 2^16-1), int4:=(2^31-1, 2^31-1, 2^31-1), real:=(1.0, 1.0, 1.0)
(Für byte/uint2-Bildtypen auf den maximalen Grauwert skaliert. Im Falle von int4-Bildtypen sind L und u auf den maximalen Grauwert und v auf den minimalen Grauwert skaliert, so dass der Nullpunkt erhalten bleibt.)
Dies stellt konzeptuell eine Transformation von RGB nach CIE XYZ (siehe 'ciexyz' oben) gefolgt von einer Transformation von CIE XYZ nach LMS dar.
Die OpenCL Implementierung der cielab-Transformation für int4-Bilder ist aufgrund der abweichenden numerischen Präzision bei der Berechnung etwas ungenauer als die reine C Variante.
ImageRed
(input_object) singlechannelimage(-array) →
object (byte / uint2 / int4 / real)
Eingabebild (Rot-Kanal).
ImageGreen
(input_object) singlechannelimage(-array) →
object (byte / uint2 / int4 / real)
Eingabebild (Grün-Kanal).
ImageBlue
(input_object) singlechannelimage(-array) →
object (byte / uint2 / int4 / real)
Eingabebild (Blau-Kanal).
ImageResult1
(output_object) singlechannelimage(-array) →
object (byte / uint2 / int4 / real)
Farbtransformiertes Ausgabebild (Kanal 1).
ImageResult2
(output_object) singlechannelimage(-array) →
object (byte / uint2 / int4 / real)
Farbtransformiertes Ausgabebild (Kanal 2).
ImageResult3
(output_object) singlechannelimage(-array) →
object (byte / uint2 / int4 / real)
Farbtransformiertes Ausgabebild (Kanal 3).
ColorSpace
(input_control) string →
(string)
Gewünschte Farbtransformation.
Defaultwert: 'hsv'
Werteliste: 'argyb' , 'cielab' , 'cielchab' , 'cielchuv' , 'cieluv' , 'ciexyz' , 'ciexyz2' , 'ciexyz3' , 'ciexyz4' , 'hls' , 'hsi' , 'hsv' , 'i1i2i3' , 'ihs' , 'lms' , 'yiq' , 'yuv'
Werteliste (für Compute Devices): 'cielab' , 'cielchab' , 'cieluv' , 'cielchuv' , 'hsv' , 'hsi'
* Transformation from rgb to hsv and conversely read_image(Image,'patras') dev_display(Image) decompose3(Image, Image1, Image2, Image3) trans_from_rgb(Image1,Image2,Image3,ImageH,ImageS,ImageV,'hsv') trans_to_rgb(ImageH,ImageS,ImageV,ImageR,ImageG,ImageB,'hsv') compose3(ImageR,ImageG,ImageB,Multichannel) dev_display(Multichannel)
trans_from_rgb
liefert den Wert 2 (H_MSG_TRUE), falls die
Parameter korrekt sind. Das Verhalten bei leerer Eingabe (keine
Eingabebilder vorhanden) lässt sich mittels
set_system(::'no_object_result', <Result>:)
festlegen.
Gegebenenfalls wird eine Fehlerbehandlung durchgeführt.
linear_trans_color
,
rgb1_to_gray
,
rgb3_to_gray
ITU-R BT.470-6: „Conventional Television Systems“, 1998.
ISO 11664-4:2008: „Colorimetry --- Part 4: CIE 1976 L*a*b* Colour
Space“, 2008.
ISO 11664-5:2009: „Colorimetry --- Part 5: CIE 1976 L*u*v* Colour
space and u',v' uniform chromaticity scale diagram“, 2009.
Foundation