7
votes

Fonction pour convertir YCBCR en RVB?

J'ai Y, CB, CR Valeurs de 8 bits, pouvez-vous me donner une fonction C simple qui le convertit à R, G, B chacun de 8 bits.

Voici un prototype de celui-ci. P >

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


0 commentaires

4 Réponses :


3
votes

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

AS une mise de côté, vous pouvez retourner un INT non signé avec les valeurs de RGBA codées à partir de l'octet le plus important à l'octet moins significatif, c'est-à-dire P>

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 commentaires

Je suis à la recherche d'une conversion correcte forumla uniquement. Parce que je le trouve différent partout. Même je suis aussi expert en C, C ++. :-)


Le site que je vous ai signalé est assez définitif, mais je sais où vous venez d'en ce qui concerne différentes perspectives sur la conversion des espaces de couleur.



12
votes

Le problème vient que presque tout le monde confond ycbcr yuv et ypbpr. Donc, la littérature que vous pouvez trouver est souvent de merde. Tout d'abord, vous devez savoir si vous avez vraiment YCBCR ou si quelqu'un vous ment de vous: -).


2 commentaires

Lien très très serviable. Merci pour cela.


J'ai mis à jour le lien avec une version d'archive Internet @garyo



14
votes

Voici ma solution à ma question.
Celui-ci est une gamme complète YCBCR à la routine de conversion RVB.

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


1 commentaires

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



5
votes

Le fonctionnement entier de la norme ITU-R pour YCBCR est ( de Wikipedia ) xxx

ou de manière équivalente mais plus concise à: xxx

n'oubliez pas de pincer les valeurs de r, g et b dans [0,255].


1 commentaires

Je crois que la troisième ligne est incorrecte. Il devrait être lu: R = Y + (CR + CR >> 2 + CR >> 3 + CR >> 5);