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
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
相关文章推荐
- MS Matrix to convert between YCbCr and RGB
- ITU709 Matrix to convert between YCbCr and RGB
- EBU Matrix to convert between YCbCr and RGB
- Matrix to convert between HSL and RGB
- Matrix to convert between HSV and RGB
- Part 59 to 60 Difference between Convert ToString and ToString,String and StringBuilder
- How to make conversion between RGB and HSV? [Python sourcecode]
- How to make conversion between RGB and HSV? [Python sourcecode]
- How to Convert Temperature (K) to RGB: Algorithm and Sample Code
- YCbCr to RGB and RGB toYCbCr
- How To Convert Virtual Machines Between VirtualBox and VMware[测试可行]
- Algorithm to convert RGB to HSV and HSV to RGB in range 0-255 for both
- YCbCr to RGB and RGB toYCbCr
- C++ String: How to convert between 'CString' and 'std::string'?
- How To Pass Arrays Between Visual Basic and C
- Excel Destination Error: Column"xx" cannot convert between unicode and non-unicode string data types
- How to create and publish Windows Azure WebSite and difference between the three Modes .
- How to convert web pages and word doc to PDF files?
- Convert Between char* string to wchar_t* string
- The best way to convert and burn videos to dvd