trans_from_rgb
— Transform an image from the RGB color space to an arbitrary color space.
trans_from_rgb(ImageRed, ImageGreen, ImageBlue : ImageResult1, ImageResult2, ImageResult3 : ColorSpace : )
trans_from_rgb
transforms an image from the RGB color
space to an arbitrary color space (ColorSpace
). The
three channels of the image are passed as three separate images on
input and output.
The operator trans_from_rgb
supports the image types byte, uint2,
int4, and real. In the case of real images, all values should lay within
0 and 1. If not, the results of the transformation may not be reasonable.
Certain scalings are performed accordingly to the image type:
Considering byte and uint2 images, the domain of color space values is generally mapped to the full domain of [0..255] or [0..65535], respectively. Because of this, the origin of signed values (e.g., CIELab) may not be at the center of the domain.
Hue values are represented by angles of [0..2PI[ and are coded for the particular image types differently:
byte-images map the angle domain to [0..255].
uint2/int4-images are coded in minutes of arc [0..21600[, except for the transformations 'cielchab' and 'cielchuv' for int4-images, where they are coded in seconds of arc [0..1296000[.
real-images are coded in radians [0..2PI[, except for the transformations 'cielchab' and 'cielchuv' , where the standards ISO 11664-4:2008 and ISO 11664-5:2009 require the hue to be specified in degrees.
Saturation values are represented by percentages of [0..100] and are coded differently for the particular image type:
byte-images map the saturation values to [0..255].
uint2/int4-images map the saturation values to [0..10000].
real-images map the saturation values to [0..1].
Supported are the transformations listed below. Note, all domains are based on RGB values scaled to [0; 1]. To obtain the domain of a certain image type, they must be scaled accordingly with the value range. Due to different precision the values obtained using the given equations may slightly differ from the values returned by the operator.
Note, this implies that , , and are not independent of each other.
The primary colors used correspond to sRGB respectively CIE Rec. 709. D65 is used as white point.
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, otherwise. Black point B: (Rb, Gb, Bb) = (0, 0, 0) White point W = (Rw, Gw, Bw), according to image type: 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)
(Scaled to the maximum gray value in the case of byte and uint2. In the case of int4 L and a are scaled to the maximum gray value, b is scaled to the minimum gray value, such that the origin stays at 0.)
f(t) = t^(1/3), t > (24/116)^3 f(t) = (841/108)*t + 16/116, otherwise. h_ab lies between 0° and 90° if a and b are both positive, between 90° and 180° if a is negative and b is positive, between 180° and 270° if a and b are both negative, and between 270° and 360° if a is positive and b is negative. Black point B: (Rb, Gb, Bb) = (0, 0, 0) White point W = (Rw, Gw, Bw), according to image type: 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)
(Scaled to the maximum gray value in the case of byte and uint2. In the case of int4, L and C are scaled to the maximum gray value, while h is given in seconds of arc.)
f(t) = t^(1/3), t > (24/116)^3 f(t) = (841/108)*t + 16/116, otherwise. Black point B: (Rb, Gb, Bb) = (0, 0, 0) White point W = (Rw, Gw, Bw), according to image type: 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)
(Scaled to the maximum gray value in the case of byte and uint2. In the case of int4 L and u are scaled to the maximum gray value, v is scaled to the minimum gray value, such that the origin stays at 0.)
f(t) = t^(1/3), t > (24/116)^3 f(t) = (841/108)*t + 16/116, otherwise. h_uv lies between 0° and 90° if u and v are both positive, between 90° and 180° if u is negative and v is positive, between 180° and 270° if u and v are both negative, and between 270° and 360° if u is positive and v is negative. Black point B: (Rb, Gb, Bb) = (0, 0, 0) White point W = (Rw, Gw, Bw), according to image type: 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)
(Scaled to the maximum gray value in the case of byte and uint2. In the case of int4, L and C are scaled to the maximum gray value, while h is given in seconds of arc.)
This conceptually is a transformation from RGB to CIE XYZ (see 'ciexyz' above) followed by a transformation from CIE XYZ to LMS.
As the calculations are made with a different numerical precision, the OpenCL implementation of the cielab transformation for images of type int4 is slightly less accurate than the pure C version.
ImageRed
(input_object) singlechannelimage(-array) →
object (byte / uint2 / int4 / real)
Input image (red channel).
ImageGreen
(input_object) singlechannelimage(-array) →
object (byte / uint2 / int4 / real)
Input image (green channel).
ImageBlue
(input_object) singlechannelimage(-array) →
object (byte / uint2 / int4 / real)
Input image (blue channel).
ImageResult1
(output_object) singlechannelimage(-array) →
object (byte / uint2 / int4 / real)
Color-transformed output image (channel 1).
ImageResult2
(output_object) singlechannelimage(-array) →
object (byte / uint2 / int4 / real)
Color-transformed output image (channel 1).
ImageResult3
(output_object) singlechannelimage(-array) →
object (byte / uint2 / int4 / real)
Color-transformed output image (channel 1).
ColorSpace
(input_control) string →
(string)
Color space of the output image.
Default value: 'hsv'
List of values: 'argyb' , 'cielab' , 'cielchab' , 'cielchuv' , 'cieluv' , 'ciexyz' , 'ciexyz2' , 'ciexyz3' , 'ciexyz4' , 'hls' , 'hsi' , 'hsv' , 'i1i2i3' , 'ihs' , 'lms' , 'yiq' , 'yuv'
List of values (for 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
returns TRUE if all parameters are
correct. If the input is empty the behavior can be set via
set_system(::'no_object_result', <Result>:)
. If
necessary, an exception is raised.
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