将 RGB 转换为 YCbCr - C 代码

Posted

技术标签:

【中文标题】将 RGB 转换为 YCbCr - C 代码【英文标题】:Convert RGB to YCbCr - C code 【发布时间】:2011-08-17 00:46:07 【问题描述】:

我需要为我的最终项目将 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。这样可以吗?

【问题讨论】:

嗯,这是奇数;即使是手动操作并使用您的方法,Y = 80(或者在转换为 int 时舍入为 80)您能否在将 Y、Cb 和 Cr 分配给 YCbCr 返回值时检查您的方法,并发布什么价值观在这里? 还有这个增量是什么?我没见过自己用过的。据我所知,我会发布转换的答案... 不知道你从哪里得到 Y = 382,它永远不会 > 255,假设 R、G 和 B 可以最大为 255。我得到 Y = 79.816,使用“袖珍”计算器。 Rudy这里也一样,不知道是不是类型转换? 我认为错误出在您的打印代码中...(不在发布的代码中)。 【参考方案1】:
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 手册opencv.itseez.com/modules/imgproc/doc/… 中获取的“delta”用于 8 位图像。 感谢拉斯。但我也尝试过这段代码,但我遇到了同样的问题。 =( Cr 给了我一个负值 (-127.5),我们不应该在那个值上加上 128 吗? 你好 Dominicbri7;我已经看到一个实现确实确实将 128 添加到 cb 和 cr 实际上的总和。【参考方案2】:

你应该使用这个公式 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)

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

【讨论】:

以上是关于将 RGB 转换为 YCbCr - C 代码的主要内容,如果未能解决你的问题,请参考以下文章

RGB通道和YCBCR通道相互转换——MATLAB实现

[#1] YCbCr与RGB的转换公式

灰度转换:RGB转YCbCr转Gray

从 RGB 到 YCbCr 的转换公式

视频图像处理基础知识5(RGB与Ycbcr相互转换公式 )

RGB转换成YCbCr