将YCbCr转换为RGB的函数是什么?

9

我有Y、Cb和Cr值,每个值都是8位大小。有没有一个简单的C函数可以将这些值转换为R、G、B(每个值也是8位大小)?

以下是我正在寻找的函数原型:

void convertYCbCrToRGB(
    unsigned char Y,
    unsigned char cg,
    unsigned char cb,
    unsigned char &r,
    unsigned char &g,
    unsigned char &b);

附言:我只希望找到正确的转换公式,因为我在各处都找到了不同版本的公式。我对C/C++非常熟悉。

4个回答

14

这是我对我的问题的解决方案。
这是一种完整的范围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);
}

我认为转换是自动的,因此不需要明确指出。很棒的解决方案。 - qben

14
问题在于几乎每个人都将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
非常有帮助的链接。谢谢它。 - SunnyShah
2
我已经使用互联网档案馆的版本更新了链接@GaryO。 - Omar Shehata

6
ITU-R标准中的YCbCr整数运算(来源于维基百科
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) ;

或者更简洁地等价于:
Cr = Cr - 128 ;
Cb = Cb - 128 ;
r = Y + 45 * Cr / 32 ;
g = Y - (11 * Cb + 23 * Cr) / 32 ;
b = Y + 113 * Cb / 64 ;

不要忘记将 r、g 和 b 的值夹在 [0,255] 范围内。

2
我认为第三行是不正确的。它应该写成: r = Y + ( Cr + Cr >> 2 + Cr >> 3 + Cr >> 5 ) ; - Michael Steinberg

3
请查看此页面,其中包含有关转换公式的有用信息。
另外,您可以返回一个无符号整数,其中包含从最高有效字节到最低有效字节编码的RGBA值。
unsigned int YCbCrToRGBA(unsigned char Y, unsigned char Cb, unsigned char Cb) {
   unsigned char R = // conversion;
   unsigned char G = // conversion;
   unsigned char B = // conversion;

   return (R << 3) + (G << 2) + (B << 1) + 255;
}

我只是在寻找正确的转换公式,因为我发现每个地方都不一样。即使我也精通C、C++。 :-) - SunnyShah
我指给你看的网站相当权威,但我明白你对颜色空间转换不同观点的立场。 - Adrian Regan

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接