2010-10-28 3 views
2

У меня есть Y, Cb, Cr значения каждый из 8 бит, можете ли вы дать мне простую функцию C, которая преобразует ее в R, G, B каждый из 8 бит.Функция преобразования YCbCr в RGB?

Вот прототип его.

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

P.S
Ищу единственно правильной формулы преобразования. Потому что я нахожу его повсюду. Даже я также эксперт в области C, C++

ответ

7

Проблема возникает, что почти все путает YCbCr YUV и YPbPr. Так что литература, которую вы можете найти, часто дерьмовая. Сначала вы должны знать, действительно ли у вас YCbCr или кто-то лжет вам :-).

  • YUV закодированы данные поступают от аналоговых источников (PAL декодер видео, S-Video, ...)
  • YPbPr кодированные данные также исходит из аналоговых источников, но дает лучшие результаты, как цвет YUV (Component Video)
  • Кодированные данные YCbCr поступают из цифровых источников (DVB, HDMI, ...)

YPbPr и YCbCr связаны между собой. Вот правильные формулы:

http://www.equasys.de/colorconversion.html

+2

Очень Очень полезная ссылка. Спасибо за это. – SunnyShah

2

Отъезд page. Он содержит полезную информацию о формулах преобразования.

Как и в стороне, вы можете вернуть неподписанные 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; 
} 
+0

Я искал правильное изменение форума. Потому что я нахожу его повсюду. Даже я также эксперт в C, C++. :-) – SunnyShah

+0

Сайт, на котором я указывал вас, довольно определенно, но я знаю, откуда вы пришли, в отношении разных точек зрения на преобразование цветового пространства. –

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

Я думаю, что преобразование является автоматическим, поэтому оно не требуется явно. Хорошее решение. – qben

1

операции Целое число стандарта ITU-R для YCbCr является (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 ; 

не забудьте зажать значения г, g и b в [0,255].

+0

Я считаю, что третья строка неверна. Его следует читать: r = Y + (Cr + Cr >> 2 + Cr >> 3 + Cr >> 5); –

Смежные вопросы