我正在使用java开发一个应用程序,它将YUV像素(x,y)转换为RGB像素,这是我做的:(数据是YUV字节数组)
int Y = data[ y * width + x];
int U = data[ (int) (width * height + Math.floor(y/2) * Math.floor(width/2) + Math.floor(x/2) + 1)];
int V = data[ (int) (width * height + Math.floor(y/2) * (width/2) + Math.floor(x/2) + 0)];
int B = (int) (1.164*(Y - 16)+ 2.018*(U - 128));
int G = (int) (1.164*(Y - 16) - 0.813*(V - 128) - 0.391*(U - 128));
int R = (int) (1.164*(Y - 16) + 1.596*(V - 128));
但最后,我发现我得到的RGB值是负值。有人可以帮我弄这个吗? 谢谢!
答案 0 :(得分:1)
有许多口味" YUV,有时这些与YCbCr混在一起。您的公式似乎适用于Y在[16,235]中的格式,但是,我可以告诉您,这对于Android中返回的NV21图像格式(一种标准YUV平面)不正确。
答案 1 :(得分:0)
C ++中的类似转换是this YUV Wikipedia page.
在公式转换代码之后,R,G,B值被钳制为0-255。
您是否尝试过类似Java的东西?
@ MelindaGreen的answer to a different question包含一种执行yuv-> rgb转换的方法,该转换也会产生负RGB值。
将负值设置为0会产生看起来正确的颜色。
答案 2 :(得分:0)
//
// C++ code to convert between RGB and YUV where values are 0..255.
//
typedef struct XYZ {
double x,y,z;
};
XYZ rgb2yuv(double r, double g, double b)
{
XYZ xyz;
double R = r/255.0;
double G = g/255.0;
double B = b/255.0;
double Y = 0.299*R + 0.587*G + 0.114*B;
double U = -0.147*R - 0.289*G + 0.436*B;
double V = 0.615*R - 0.515*G - 0.100*B;
xyz.x = Y*255.0;
xyz.y = (U+0.5)*255.0;
xyz.z = (V+0.5)*255.0;
return xyz;
}
XYZ yuv2rgb(double y, double u, double v)
{
XYZ xyz;
double Y = y/255.0;
double U = u/255.0-0.5;
double V = v/255.0-0.5;
double R = Y + 1.140*V;
double G = Y - 0.395*U - 0.581*V;
double B = Y + 2.032*U;
xyz.x = R*255.0;
xyz.y = G*255.0;
xyz.z = B*255.0;
return xyz;
}