2010-10-28 4 views
2

J'ai Y, Cb, Cr valeurs chacun de 8 bits, pouvez-vous me donner une fonction C simple qui le convertit en R, G, B chacun de 8 bits.Fonction pour convertir YCbCr en RGB?

Voici un prototype de celui-ci.

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

P.S
Je cherche la formule de conversion correcte seulement. Parce que je le trouve différent partout. Même je suis également expert en C, C++

Répondre

7

Le problème vient que presque tout le monde confond YCbCr YUV et YPbPr. Donc, la littérature que vous pouvez trouver est souvent merdique. Vous devez d'abord savoir si vous avez vraiment YCbCr ou si quelqu'un vous ment :-).

  • YUV données codées provient de sources analogiques (décodeur PAL vidéo, S-Vidéo, ...)
  • YPbPr données codées provient également de sources analogiques, mais produit de meilleurs résultats couleur YUV (vidéo composante)
  • Les données codées YCbCr proviennent de sources numériques (DVB, HDMI, ...)

YPbPr et YCbCr sont liés. Voici les bonnes formules:

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

+2

Très très lien utile. Merci pour cela. – SunnyShah

2

Consultez ce page. Il contient des informations utiles sur les formules de conversion.

En aparté, vous pouvez retourner un entier non signé avec les valeurs RGBA codées à partir de l'octet le plus significatif au moins octet significatif, à savoir

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

Je cherche la conversion correcte forumla seulement. Parce que je le trouve différent partout. Même moi je suis aussi expert en C, C++. :-) – SunnyShah

+0

Le site que je vous ai indiqué est assez définitif, mais je sais d'où vous venez en ce qui concerne les différentes perspectives sur la conversion de l'espace de couleur. –

7

Voici ma solution à ma question.
Celui-ci est une routine de conversion YCbCr à RGB pleine plage.

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

Je pense que la conversion est automatique, donc ce n'est pas nécessaire explicitement. Belle solution. – qben

1

fonctionnement entier de la norme UIT-R pour YCbCr est (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) ; 

ou de manière équivalente mais de façon plus concise à:

Cr = Cr - 128 ; 
Cb = Cb - 128 ; 
r = Y + 45 * Cr/32 ; 
g = Y - (11 * Cb + 23 * Cr)/32 ; 
b = Y + 113 * Cb/64 ; 

ne pas oublier de serrer les valeurs de r, g et b dans [0,255].

+0

Je crois que la troisième ligne est incorrecte. Il devrait indiquer: r = Y + (Cr + Cr >> 2 + Cr >> 3 + Cr >> 5); –

Questions connexes