| Operatoren |
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 int4-Bilder keine negativen Werte enthalten und real-Bilder nur Werte zwischen 0 und 1. 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.
Folgende Transformationen werden unterstützt:
(Die angegebenen Wertebereiche beziehen sich auf eine Skalierung der RGB Werte auf das Intervall [0; 1]. Der Wertebereich für die jeweiligen Bildtypen ergibt sich durch Multiplikation mit deren Maximalwerten, z.B. 255 für byte Bilder)
|Y| |0.299 0.587 0.114| |R| |I| = |0.599 -0.276 -0.324| * |G| |Q| |0.214 -0.522 0.309| |B|
Y = [0; 1], I = [-0.599; 0.599], Q = [-0.522; 0.522]
|Y| | 0.299 0.587 0.114| |R| |U| = |-0.147 -0.289 0.436| * |G| |V| | 0.615 -0.515 -0.100| |B|
Y = [0; 1], U = [-0.436; 0.436], V = [-0.615; 0.615]
|A | |0.30 0.59 0.11| |R| |Rg| = |0.50 -0.50 0.00| * |G| |Yb| |0.25 0.25 -0.50| |B|
A = [0; 1], Rg = [-0.5, 0.5], Yb = [-0.5, 0.5]
|X| |0.412453 0.357580 0.180423| |R|
|Y| = |0.212671 0.715160 0.072169| * |G|
|Z| |0.019334 0.119193 0.950227| |B|
Die verwendeten Grundfarben entsprechen sRGB bzw. der CIE Rec. 709. Als Weißpunkt wird D65 verwendet.
x y z
rot 0.6400 0.3300 0.0300
grün 0.3000 0.6000 0.1000
blau 0.1500 0.0600 0.7900
weiß 0.3127 0.3290 0.3583
X:=[0; 0.950456], Y:=[0; 1], Z:=[0; 1.088754]
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
H = [0; 2pi[, L = [0; 1], S = [0; 1]
|M1| |2/sqrt(6) -1/sqrt(6) -1/sqrt(6)| |R| |M2| = |0 1/sqrt(2) -1/sqrt(2)| * |G| |I1| |1/sqrt(3) 1/sqrt(3) 1/sqrt(3)| |B| H = atan2(M2,M1) S = sqrt(M1*M1 + M2*M2) I = I1 / sqrt(3)
H = [0; 2pi[, S= [0; sqrt(2/3)], I = [0; 1]
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
H = [0; 2pi[, S = [0; 1], V = [0; 1]
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
I = [0; 1], H = [0; 2pi[, S = [0; 1]
|X| |0.412453 0.357580 0.180423| |R| |Y| = |0.212671 0.715160 0.072169| * |G| |Z| |0.019334 0.119193 0.950227| |B| L = 116 * f(Y/Yw) - 16 a = 500 * (f(X/Xw) - f(Y/Yw)) b = 200 * (f(Y/Yw) - f(Z/Zw))
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)
L := [0; 100], a := [-86.1813; 98.2352], b := [-107.8617; 94.4758] (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.)
|X| |0.412453 0.357580 0.180423| |R| |Y| = |0.212671 0.715160 0.072169| * |G| |Z| |0.019334 0.119193 0.950227| |B| L = 116 * f(Y/Yw) - 16 a = 500 * (f(X/Xw) - f(Y/Yw)) b = 200 * (f(Y/Yw) - f(Z/Zw)) C_ab = sqrt(a^2+b^2) h_ab = atan2(b,a)
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)
L := [0; 100], C := [0; 133.8086], h := [0; 360[ (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.)
|X| |0.412453 0.357580 0.180423| |R| |Y| = |0.212671 0.715160 0.072169| * |G| |Z| |0.019334 0.119193 0.950227| |B| u' = 4*X / (X + 15*Y + 3*Z) v' = 9*Y / (X + 15*Y + 3*Z) uw' = 4*Xw / (Xw + 15*Yw + 3*Zw) vw' = 9*Yw / (Xw + 15*Yw + 3*Zw) L = 116 * f(Y/Yw) - 16 u = 13 * L * (u' - uw') v = 13 * L * (v' - vw')
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)
L := [0; 100], u := [-83.0774; 175.0148], v := [-134.1008; 107.3923] (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.)
|X| |0.412453 0.357580 0.180423| |R| |Y| = |0.212671 0.715160 0.072169| * |G| |Z| |0.019334 0.119193 0.950227| |B| u' = 4*X / (X + 15*Y + 3*Z) v' = 9*Y / (X + 15*Y + 3*Z) uw' = 4*Xw / (Xw + 15*Yw + 3*Zw) vw' = 9*Yw / (Xw + 15*Yw + 3*Zw) L = 116 * f(Y/Yw) - 16 u = 13 * L * (u' - uw') v = 13 * L * (v' - vw') C_uv = sqrt(u^2+v^2) h_uv = atan2(v,u)
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)
L := [0; 100], C := [0; 179.0402], h := [0; 360[ (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.)
|I1| | 0.333 0.333 0.333| |R| |I2| = | 1.0 0.0 -1.0 | * |G| |I3| |-0.5 1.0 -0.5 | |B|
I1 = [0; 1], I2 = [-1; 1], I3 = [-1; 1]
|X| |0.620 0.170 0.180| |R| |Y| = |0.310 0.590 0.110| * |G| |Z| |0.000 0.066 1.020| |B|
X = [0; 0.970], Y = [0; 1.010], Z = [0; 1.086]
|X| |0.618 0.177 0.205| |R| |Y| = |0.299 0.587 0.114| * |G| |Z| |0.000 0.056 0.944| |B|
X = [0; 1], Y = [0; 1], Z = [0; 1]
|X| |0.476 0.299 0.175| |R|
|Y| = |0.262 0.656 0.082| * |G|
|Z| |0.020 0.161 0.909| |B|
Grundfarben (x, y, z):
red:=(0.628, 0.346, 0.026), green:=(0.268, 0.588, 0.144),
blue:=(0.150, 0.070, 0.780), white65:=(0.313, 0.329, 0.358)
x y z
red 0.628 0.346 0.026
green 0.268 0.588 0.144
blue 0.150 0.070 0.780
white65 0.313 0.329 0.358
X:=[0; 0.951], Y:=[0; 1], Z:=[0; 1.088]
|L| |0.390469, 0.549910, 0.008901| |R| |M| = |0.070925, 0.963118, 0.001358| * |G| |S| |0.023143, 0.128013, 0.935976| |B|
Dies stellt konzeptuell eine Transformation von RGB nach CIE XYZ (siehe 'ciexyz' oben) gefolgt von einer Transformation von CIE XYZ nach LMS dar.
L:=[0; 0.949280], M:=[0; 1.035401], S:=[0; 1.087132]
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.
Eingabebild (Rot-Kanal).
Eingabebild (Grün-Kanal).
Eingabebild (Blau-Kanal).
Farbtransformiertes Ausgabebild (Kanal 1).
Farbtransformiertes Ausgabebild (Kanal 2).
Farbtransformiertes Ausgabebild (Kanal 3).
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') disp_color(Image,WindowHandle) decompose3(Image,Rimage,Gimage,Bimage) trans_from_rgb(Rimage,Gimage,Bimage,Image1,Image2,Image3,'hsv') trans_to_rgb(Image1,Image2,Image3,ImageRed,ImageGreen,ImageBlue,'hsv') compose3(ImageRed,ImageGreen,ImageBlue,Multichannel) disp_color(Multichannel,WindowHandle)
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
| Operatoren |