C语言 将 RGB 转换为 YCbCr - C 代码

声明:本页面是StackOverFlow热门问题的中英对照翻译,遵循CC BY-SA 4.0协议,如果您需要使用它,必须同样遵循CC BY-SA许可,注明原文地址和作者信息,同时你必须将它归于原作者(不是我):StackOverFlow 原文地址: http://stackoverflow.com/questions/7086820/
Warning: these are provided under cc-by-sa 4.0 license. You are free to use/share it, But you must attribute it to the original authors (not me): StackOverFlow

提示:将鼠标放在中文语句上可以显示对应的英文。显示中英文
时间:2020-09-02 09:25:16  来源:igfitidea点击:

Convert RGB to YCbCr - C code

copencvrgb

提问by Vinicius Garcia

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

我需要为我的最终项目将 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;
}

But it doesn't work for me!

但这对我不起作用!

I was comparing with cvCvtColor (from OpenCv library) and the results doesn't match:

我正在与 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!)

I really need help with this, I trying do this for a long time and I couldn't find any answer for my doubt.

我真的需要这方面的帮助,我尝试这样做了很长时间,但找不到任何答案来解决我的疑问。



Do you guys think I'm getting the RGB values wrong? I'm doing this way:

你们认为我把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);

Then I'm calling my conversion function this way:

然后我以这种方式调用我的转换函数:

converter_RGB_para_YCbCr(R, G, B);

My function expects int R, int G, int B but I'm passing uchar B, uchar G, uchar R. its that ok?

我的函数需要 int R、int G、int B,但我正在传递 uchar B、uchar G、uchar R。它可以吗?

回答by Russ Clarke

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

回答by Geomorillo

you should use this formula matlab uses it

你应该使用这个公式 matlab 使用它

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

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

Cb = -0.148R′ - 0.291G′ + 0.439B′ + 128

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

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

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

and to rgb

和 rgb

R′ = 1.164(Y - 16) + 1.596(Cr - 128)

R' = 1.164(Y - 16) + 1.596(Cr - 128)

G′ = 1.164(Y - 16) - 0.813(Cr - 128) - 0.392(Cb - 128)

G′ = 1.164(Y - 16) - 0.813(Cr - 128) - 0.392(Cb - 128)

B′ = 1.164(Y - 16) + 2.017(Cb - 128)

B' = 1.164(Y - 16) + 2.017(Cb - 128)

I have tested them in a software im making they work ok

我已经在软件中对它们进行了测试,使它们可以正常工作