Convert RGB to YCbCr - C Code

I need to convert RGB to YCbCr for my final project, and I'm trying to do this (I'm programming in C):

/* Autor: Vinicius Garcia * Data : 09.ago.2011 * * Função que converte um pixel RGB em YCbCr * * param : int R valor do pixel no canal red * param : int G valor do pixel no canal green * param : int B valor do pixel no canal blue * return: int* vetor de inteiros com os valores H, S e V calculados - nesta ordem */ int* converter_RGB_para_YCbCr(int R, int G, int B){ int* YCbCr = (int*) malloc(3 * sizeof(int)); double delta = 128.0; //Constante necessaria para o calculo da conversão de cor double Y = (0.299 * R + 0.587 * G + 0.114 * B); double Cb = ((B - Y) * 0.564 + delta); double Cr = ((R - Y) * 0.713 + delta); YCbCr[0] = (int) Y; YCbCr[1] = (int) Cb; YCbCr[2] = (int) Cr; return YCbCr; } 

But this does not work for me!

I compared cvCvtColor (from the OpenCv library) and the results did not match:

  R = 88, G = 76, B = 78 cvCvtColor: Y = 80, Cb = 127, Cr = 134 myfunction: Y = 382, Cb = 132, Cr = 132 (cr and cr are always equal!) 

I really need help with this, I have been trying to do this for a long time, and I could not find an answer to my doubts.


Do you guys think I misunderstood the RGB values? I do like this:

 uchar B = CV_IMAGE_ELEM(img_RGB, uchar, linha, coluna * 3); uchar G = CV_IMAGE_ELEM(img_RGB, uchar, linha, coluna * 3 + 1); uchar R = CV_IMAGE_ELEM(img_RGB, uchar, linha, coluna * 3 + 2); 

Then I call my conversion function as follows:

 converter_RGB_para_YCbCr(R, G, B); 

My function expects int R, int G, int B, but I skip uchar B, uchar G, uchar R. is this normal?

+6
source share
2 answers
 int y = (int)( 0.299 * R + 0.587 * G + 0.114 * B); int cb = (int)(-0.16874 * R - 0.33126 * G + 0.50000 * B); int cr = (int)( 0.50000 * R - 0.41869 * G - 0.08131 * B); 
+6
source

you should use this formula that matlab uses

Y = 0.257R '+ 0.504G' + 0.098B '+ 16

Cb = -0.1448R'-0.291G '+ 0.439B' + 128

Cr = 0.439R'-0.368G'-0.071B '+ 128

and rgb

<p> R '= 1.164 (Y-16) + 1.596 (Cr-128) </p> <p> G1 = 1.164 (Y-16) - 0.813 (Cr-128) - 0.392 (Cb - 128)

B '= 1,164 (Y - 16) + 2,017 (Cb - 128)

I tested them in im software so that they work fine

+2
source

Source: https://habr.com/ru/post/895212/


All Articles