我有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 ++的专家
答案 0 :(得分:8)
问题在于几乎所有人都混淆了YCbCr YUV和YPbPr。所以你能找到的文献往往很糟糕。首先你必须知道你是否真的有YCbCr或者有人骗你: - )。
YPbPr和YCbCr是相关的。以下是正确的公式:
https://web.archive.org/web/20180421030430/http://www.equasys.de/colorconversion.html
(已添加archive.org以修复旧的,损坏的链接)。
答案 1 :(得分: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);
}
答案 2 :(得分: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;
}
答案 3 :(得分: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]内。