3

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

4

3 回答 3

1

YUV 有很多“味道”,有时会与 YCbCr 混淆。您的公式似乎适用于 Y 在 [16,235] 中的格式,但是,我可以告诉您,这对于 Android 中返回的 NV21 图像格式(一种标准 YUV 平面)不正确。

于 2012-12-07T01:03:17.717 回答
0

这个 YUV Wikipedia 页面上有一个类似的 C++ 转换。

在公式转换代码之后,R、G、B 值被限制在 0-255 之间。

你在Java中尝试过类似的东西吗?

@MelindaGreen对另一个问题的回答包括一种进行 yuv->rgb 转换的方法,该方法也会产生负 RGB 值。

将负值设置为 0 会产生对我来说看起来正确的颜色。

于 2016-08-02T17:25:46.270 回答
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;
}
于 2019-08-16T06:19:02.657 回答