将YCbCr转换为RGB的功能?

Sun*_*hah 2 c graphics rgb

我有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++的专家

jde*_*aan 8

问题是,几乎每个人都混淆YCbCr YUV和YPbPr.所以你能找到的文献往往很糟糕.首先你必须知道你是否真的有YCbCr或者有人骗你:-).

  • YUV编码数据来自模拟信号源(PAL视频解码器,S-Video,...)
  • YPbPr编码数据也来自模拟源,但产生更好的颜色结果,如YUV(分量视频)
  • YCbCr编码数据来自数字源(DVB,HDMI,......)

YPbPr和YCbCr是相关的.这是正确的公式:

https://web.archive.org/web/20180421030430/http://www.equasys.de/colorconversion.html

(已添加archive.org以修复旧的,损坏的链接).

  • 非常有用的链接.谢谢你. (2认同)
  • 我已经用互联网存档版本@GaryO 更新了链接 (2认同)

Sun*_*hah 7

这是我对我的问题的解决方案.
这是一个全范围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)


hky*_*kyi 5

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] 内。

  • 我相信第三行是不正确的。它应该是: r = Y + ( Cr + Cr >> 2 + Cr >> 3 + Cr >> 5 ) ; (2认同)