trans_from_rgb ( ImageRed, ImageGreen, ImageBlue : ImageResult1, ImageResult2, ImageResult3 : ColorSpace : )

Transform an image from the RGB color space to an arbitrary color space .

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 following transformations are supported:

  'yiq'
     |Y|   |0.299   0.587   0.144|   |R| 
     |I| = |0.595  -0.276  -0.333| * |G| 
     |Q|   |0.209  -0.522   0.287|   |B|  

  'argyb'
     |A |   |0.30   0.59   0.11|   |R|
     |Rg| = |0.50  -0.50   0.00| * |G|
     |Yb|   |0.25   0.25  -0.50|   |B|

  'ciexyz'
     |X|   |0.476   0.299   0.175|   |R|
     |Y| = |0.262   0.656   0.082| * |G|
     |Z|   |0.020   0.161   0.909|   |B| 

  'hls'
     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) / (1 - max - min)
        else
           S = (max - min) / (max + min)
        fi
        if (R == max)
           H = ((G - B) / (max - min)) * 60
        elif (G == max)
           H = (2 + (B - R) / (max - min)) * 60
        elif (B == max)
           H = (4 + (R - G) / (max - min)) * 60
        fi
     fi

  'hsi'
     |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 = ATan(M1/M2)
     S = Sqrt(Sqr(M1) + Sqr(M2))
     I = I1 * Sqrt(3)                                           

  'hsv'
     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)) * 60
        elif (G == max)
           H = (2 + (B - R) / (max - min)) * 60
        elif (B == max)
           H = (4 + (R - G) / (max - min)) * 60
        fi
     fi

  'ihs'
     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
           A = (R + R - G - B) / 2
           B = (R - G) * (R - G) + (R - B) * (G - B)
           C = sqrt(B)
           if (C == 0)
              H = 0
           else
              H = acos(A / C)
           fi
           if (B > G)
              H = 2 * pi - H
           fi
        fi
     fi

  'isfeuklid'
     min = min(R,G,B)
     max = max(R,G,B)
     I = sqrt(R * R + G * G + B * B) / sqrt(3)
     if (I == 0)
        S = 0
        F = 0
     else
        S = acos(max(1, (R + G + B) / (I * 3))) / (pi / 2)
        if (R == min)
           F = acos(max(1, B / sqrt(G * G + B * B))) / (pi * 3 / 2) + 1 / 3
        elif (G == min)
           F = acos(max(1, R / sqrt(B * B + R * R))) / (pi * 3 / 2) + 2 / 3
        else
           F = acos(max(1, G / sqrt(R * R + G * G))) / (pi * 3 / 2)
        fi
     fi

  'isfdiff'
     if (R >= B && B >= G)
        I = R
        S = R - G
        F = (R - B) / 6
     elif (R >= G && G >= B)
        I = R
        S = R - B
        F = (2 - (R - G)) / 6
     elif (G >= R && R >= B)
        I = G
        S = G - B
        F = (2 + (G - R)) / 6
     elif (G >= B && B >= R)
        I = G
        S = G - R
        F = (4 - (G - B)) / 6
     elif (B >= G && G >= R)
        I = B
        S = B - R
        F = (4 + (B - G)) / 6
     else
        I = B
        S = B - G
        F = (6 + (B - R)) / 6
     fi

 'cielab'
     |X|   |0.476   0.299   0.175|   |R|
     |Y| = |0.262   0.656   0.082| * |G|
     |Z|   |0.020   0.161   0.909|   |B| 

     L = 116 * (Y ^ (1 / 3)) - 16
     a = 500 * (((X / 0.95) ^ (1 / 3)) - (Y ^ (1 / 3)))
     b = 200 * ((Y ^ (1 / 3)) - ((Z / 1.09) ^ (1 / 3)))

 'i1i2i3'
     |I1|   | 0.333 0.333 0.333|   |R|
     |I2| = | 1.0   0.0  -1.0  | * |G|
     |I3|   |-0.5   1.0  -0.5  |   |B|

 'ciexyz2'
     |X|   |0.620   0.170   0.180|   |R|
     |Y| = |0.310   0.590   0.110| * |G|
     |Z|   |0.000   0.066   1.020|   |B|

 'ciexyz3'
     |X|   |0.618   0.177   0.205|   |R|
     |Y| = |0.299   0.587   0.114| * |G|
     |Z|   |0.000   0.056   0.944|   |B|
If necessary, certain scalings are performed, e.g., for byte-images [0..1] -> [0..255]. In the explanation above all input and output values, including angles, are assumed to be in the range [0..1].


Parameters

ImageRed (input_object)
image(-array) -> object
Input image (red channel).

ImageGreen (input_object)
image(-array) -> object
Input image (green channel).

ImageBlue (input_object)
image(-array) -> object
Input image (blue channel).

ImageResult1 (output_object)
image(-array) -> object
Color-transformed output image (channel 1).

ImageResult2 (output_object)
image(-array) -> object
Color-transformed output image (channel 1).

ImageResult3 (output_object)
image(-array) -> object
Color-transformed output image (channel 1).

ColorSpace (input_control)
string -> string
Color space of the output image.
Default value: 'hsv'
List of values: 'cielab', 'hsv', 'hsi', 'yiq', 'argyb', 'ciexyz', 'ciexyz2', 'ciexyz3', 'hls', 'ihs', 'isfeuklid', 'isfdiff', 'i1i2i3'


Example
/* Tranformation from rgb to hsv and conversely */
read_picture(:Image:'tiff',0,0,'patras':Channels) >
disp_color(Image:::) >
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:::).

Result

trans_from_rgb returns TRUE if all parameters are correct. If the input is empty the behaviour can be set via set_system(::'no_object_result',<Result>:). If necessary, an exception is raised.


Possible Predecessors

decompose3


Possible Successors

compose3


Alternatives

rgb1_to_grey, rgb3_to_grey


See also

trans_to_rgb



Copyright © 1996-1997 MVTec Software GmbH