将YCbCr转换为RGB的功能?

问题描述 投票:2回答:4

我有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);

P.S 我正在寻找正确的转换公式。因为我发现它到处都是不同的。即使我也是C,C ++的专家

c graphics rgb
4个回答
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以修复旧的,损坏的链接)。


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);
}

3
投票

看看这个page。它包含有关转换公式的有用信息。

顺便说一句,你可以返回一个unsigned int,其中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;
}

2
投票

YCbCr的ITU-R标准的整数运算是(from Wikipedia

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

© www.soinside.com 2019 - 2024. All rights reserved.