我有8位的Y,Cb,Cr值,你能给我简单的C函数,它将它转换为8位的R,G,B.
这是它的原型.
void convertYCbCrToRGB(
unsigned char Y,
unsigned char cg,
unsigned char cb,
unsigned char &r,
unsigned char &g,
unsigned char &b);
Run Code Online (Sandbox Code Playgroud)
PS
我正在寻找正确的转换公式.因为我发现它到处都是不同的.即使我也是C,C++的专家
问题是,几乎每个人都混淆YCbCr YUV和YPbPr.所以你能找到的文献往往很糟糕.首先你必须知道你是否真的有YCbCr或者有人骗你:-).
YPbPr和YCbCr是相关的.这是正确的公式:
https://web.archive.org/web/20180421030430/http://www.equasys.de/colorconversion.html
(已添加archive.org以修复旧的,损坏的链接).
这是我对我的问题的解决方案.
这是一个全范围YCbCr到RGB转换例程.
Color GetColorFromYCbCr(int y, int cb, int cr, int a)
{
double Y = (double) y;
double Cb = (double) cb;
double Cr = (double) cr;
int r = (int) (Y + 1.40200 * (Cr - 0x80));
int g = (int) (Y - 0.34414 * (Cb - 0x80) - 0.71414 * (Cr - 0x80));
int b = (int) (Y + 1.77200 * (Cb - 0x80));
r = Max(0, Min(255, r));
g = Max(0, Min(255, g));
b = Max(0, Min(255, b));
return Color.FromArgb(a, r, g, b);
}
Run Code Online (Sandbox Code Playgroud)
YCbCr ITU-R 标准的整数运算是(来自维基百科)
Cr = Cr - 128 ;
Cb = Cb - 128 ;
r = Y + ( Cr >> 2 + Cr >> 3 + Cr >> 5 ) ;
g = Y - ( Cb >> 2 + Cb >> 4 + Cb >> 5) - ( Cr >> 1 + Cr >> 3 + Cr >> 4 + Cr >> 5) ;
b = Y + ( Cb + Cb >> 1 + Cb >> 2 + Cb >> 6) ;
Run Code Online (Sandbox Code Playgroud)
或等效但更简洁地:
Cr = Cr - 128 ;
Cb = Cb - 128 ;
r = Y + 45 * Cr / 32 ;
g = Y - (11 * Cb + 23 * Cr) / 32 ;
b = Y + 113 * Cb / 64 ;
Run Code Online (Sandbox Code Playgroud)
不要忘记将 r、g 和 b 的值限制在 [0,255] 内。