YUV TO RGB结果为负值

时间:2012-12-07 00:39:12

标签: java android image rgb yuv

我正在使用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值是负值。有人可以帮我弄这个吗? 谢谢!

3 个答案:

答案 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;
}