将RGB转换为YCbCr - C代码

8

我需要将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;
}

但是它对我没用!

我正在与OpenCv库中的cvCvtColor进行比较,结果不匹配:

            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。这样可以吗?


不知道你从哪里得到 Y = 382,假设 R、G 和 B 最大值为 255,它永远不可能大于 255。我使用“口袋”计算器得到 Y = 79.816。 - Rudy Velthuis
我也一样,Rudy,我想知道这是否是类型转换的问题? - Russ Clarke
这里有一个非常相似的问题:http://stackoverflow.com/questions/6973115/opencv-convert-rgb-to-ycbcr-and-vice-versa-by-hand-visual-c - SSteve
3
我认为问题出现在你的打印代码中...(而不是发布的代码中)。 - R.. GitHub STOP HELPING ICE
当然,打印或强制转换可能会很棘手 :) - Russ Clarke
显示剩余5条评论
2个回答

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

大家好!感谢你们的帮助!我从cvCvtColor手册中获取了“delta”信息。该信息适用于8位图像。以下是手册链接:http://opencv.itseez.com/modules/imgproc/doc/miscellaneous_transformations.html?highlight=cvcvtcolor#cvCvtColor - Vinicius Garcia
1
谢谢Russ。但是我也尝试了这段代码,但是遇到了同样的问题。=( - Vinicius Garcia
2
Cr 给了我一个负值 (-127.5),难道我们不应该将 128 加到这个值上吗? - dominicbri7
嗨Dominicbri7;我看到了一种实现,确实会将128添加到cb和cr的总和中。 - Russ Clarke

3
你应该使用这个公式,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)
我已经在制作的软件中进行过测试,它们可以正常工作。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接