您的位置:首页 > 其它

ITU601 Matrix to convert between YCbCr and RGB

2009-02-07 19:39 696 查看
[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
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: