Конвертировать RGB в YCbCr - код C - PullRequest
6 голосов
/ 17 августа 2011

Мне нужно конвертировать RGB в YCbCr для моего финального проекта, и я пытаюсь сделать это (я программирую на 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;
}

Но у меня это не работает!

Я сравнивал с cvCvtColor (из библиотеки OpenCv), и результаты не совпадают:

            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!)

Мне действительно нужна помощь в этом, я пытался сделать это долгое время, и я не мог найти ответ на свой вопрос.


Ребята, вы думаете, что я неправильно понимаю значения RGB? Я делаю так:

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

Тогда я вызываю свою функцию преобразования следующим образом:

converter_RGB_para_YCbCr(R, G, B);

Моя функция ожидает int R, int G, int B, но я передаю uchar B, uchar G, uchar R. Это нормально?

Ответы [ 2 ]

6 голосов
/ 17 августа 2011
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);
2 голосов
/ 29 ноября 2012

Вы должны использовать эту формулу Matlab использует его

Y = 0,257R´ + 0,504G´ + 0,098B´ + 16

Cb = -0,148R´ - 0,291G´ + 0,439B´ + 128

Cr = 0,439R´ - 0,368G´ - 0,071B´ + 128

и до RGB

R´ = 1,164 (Y - 16) +1,596 (Cr - 128)

G´ = 1,164 (Y - 16) - 0,813 (Cr - 128) - 0,392 (Cb - 128)

B´ = 1,164 (Y - 16)+ 2.017 (Cb - 128)

Я проверил их в программном обеспечении, которое заставляет их работать нормально

...