我需要将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.那可以吗?
答案 0 :(得分:6)
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);
答案 1 :(得分: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)
我已经在一个软件中对它们进行了测试,使它们正常工作