ITU601 Matrix to convert between YCbCr and RGB

 

[ITU 601: YCbCr <-> RGB]
0    <= Y, R, G, B <= 1
-0.5 <= Cb, Cr     <= 0.5
Y  =  0.299 * R + 0.587 * G + 0.114 * B
Cb = -0.169 * R - 0.331 * G + 0.500 * B
Cr =  0.500 * R - 0.419 * G - 0.081 * B

R  = Y + 0.000 * Cb + 1.403 * Cr
G  = Y - 0.344 * Cb - 0.714 * Cr
B  = Y + 1.773 * Cb + 0.000 * Cr

[ITU 601 Revision: YCbCr <-> RGB]
0 <= Y, Cb, Cr, R, G, B <= 255

Y  =  0.299 * R + 0.587 * G + 0.114 * B
Cb = -0.169 * R - 0.331 * G + 0.499 * B + 128
Cr =  0.499 * R - 0.418 * G - 0.0813 * B + 128

R  = Y + 0.000 * (Cb – 128) + 1.402 * (Cr – 128)
G  = Y - 0.344 * (Cb – 128) - 0.714 * (Cr – 128)
B  = Y + 1.772 * (Cb - 128) + 0.000 * (Cr – 128)

 

#define CLIP( v, min, max )                                                                        /
    I_MACRO_BEGIN                                                                                /
    if ( (v) < (min) )                                                                            /
        (v) = (min);                                                                            /
    else if ( (v) > (max) )                                                                        /
        (v) = (max);                                                                            /
    I_MACRO_END

// r, g, b, y, u, v are [0, 255]
// Cb = u
// Cr = v
#define ITU601_REV_RGB2YUV444( r, g, b, y, u, v )                                                /
    I_MACRO_BEGIN                                                                                /
    (y) = (int) (0.299 * (r) + 0.587 * (g) + 0.114 * (b) + 0.5);                                /
    (u) = (int) (-0.169 * (r) - 0.331 * (g) + 0.499 * (b) + 128.5);                                /
    (v) = (int) (0.499 * (r) - 0.418 * (g) - 0.0813 * (b) + 128.5);                                /
    CLIP( y, 0, 255 );                                                                            /
    CLIP( u, 0, 255 );                                                                            /
    CLIP( v, 0, 255 );                                                                            /
    I_MACRO_END

// r, g, b, y, u, v are [0, 255]
// Cb = u
// Cr = v
#define ITU601_REV_YUV4442RGB( y, u, v, r, g, b )                                                /
    I_MACRO_BEGIN                                                                                /
    (r) = (int) ((y) + 1.402 * ((v) - 128) + 0.5);                                                /
    (g) = (int) ((y) - 0.344 * ((u) - 128) - 0.714 * ((v) - 128) + 0.5);                        /
    (b) = (int) ((y) + 1.772 * ((u) - 128) + 0.5);                                                /
    CLIP( r, 0, 255 );                                                                            /
    CLIP( g, 0, 255 );                                                                            /
    CLIP( b, 0, 255 );                                                                            /
    I_MACRO_END

// r, g, b, y are [0, 1]
// u, v are [-0.5, 0.5]
// Cb = u
// Cr = v
#define ITU601_RGB2YUV444( r, g, b, y, u, v )                                                    /
    I_MACRO_BEGIN                                                                                /
    (y) = 0.299 * (r) + 0.587 * (g) + 0.114 * (b);                                                /
    (u) = -0.169 * (r) - 0.331 * (g) + 0.500 * (b);                                                /
    (v) = 0.500 * (r) - 0.419 * (g) - 0.081 * (b);                                                /
    CLIP( y, 0, 1.0 );                                                                            /
    CLIP( u, -0.5, 0.5 );                                                                        /
    CLIP( v, -0.5, 0.5 );                                                                        /
    I_MACRO_END

// r, g, b, y are [0, 1]
// u, v are [-0.5, 0.5]
// Cb = u
// Cr = v
#define ITU601_YUV4442RGB( y, u, v, r, g, b )                                                    /
    I_MACRO_BEGIN                                                                                /
    (r) = (y) + 1.403 * (v);                                                                    /
    (g) = (y) - 0.344 * (u) - 0.714 * (v);                                                        /
    (b) = (y) + 1.773 * (u);                                                                    /
    CLIP( r, 0, 1.0 );                                                                            /
    CLIP( g, 0, 1.0 );                                                                            /
    CLIP( b, 0, 1.0 );                                                                            /
    I_MACRO_END

你可能感兴趣的:(Matrix)