将YUV图像转换为灰度图像 - 与RGB到灰度相同的结果?

时间:2016-10-24 07:04:47

标签: android image yuv

我想在YUV_420_888图像上进行一些图像处理,需要一个灰度版本。当我读到关于YUV图像时,应该足以提取图像的Y平面。在Android中,我将尝试使用此工作流将Y平面转换为字节数组。

Image.Plane Y = img.getPlanes()[0];
ByteBuffer byteBuffer = Y.getBuffer();
byte[] data = new byte[byteBuffer.remaining()];
byteBuffer.get(data);

因此,我想比较这个图像,我现在得到另一个灰度图像(或者至少是图像处理的结果)我有问题,灰度图像是否提取Y平面几乎与RGB变成了灰度?或者我必须为此做一些额外的处理步骤?

2 个答案:

答案 0 :(得分:1)

是的,您从Y平面获得的data应该与您通过RGB图像时相同。

答案 1 :(得分:1)

不,我正在使用红外传感器,我正在获得一个已经是灰阶的YUV_420_888图像。但是要以字节转换它我使用了以下函数,这给了我错误。根据你的回答,我只拿了Y飞机,结果它给了我绿屏。

ByteBuffer[] buffer = new ByteBuffer[1];

            Image image = reader.acquireNextImage();
            buffer[0] = image.getPlanes()[0].getBuffer().duplicate();
            //buffer[1] = image.getPlanes()[1].getBuffer().duplicate();

            int buffer0_size = buffer[0].remaining();
            //int buffer1_size = buffer[1].remaining();

            buffer[0].clear();
            //buffer[1].clear();

            byte[] buffer0_byte = new byte[buffer0_size];
            //byte[] buffer1_byte = new byte[buffer1_size];

            buffer[0].get(buffer0_byte, 0, buffer0_size);
            //buffer[1].get(buffer1_byte, 0, buffer1_size);

            byte[] byte2 = buffer0_byte;
            //byte2=buffer0_byte;
            //byte2[1]=buffer1_byte;
            image.close();
            mArrayImageBuffer.add(byte2);

在对字节进行dequeing后转到funcion:

public static byte[] convertYUV420ToNV12(byte[] byteBuffers){
    ByteArrayOutputStream outputStream = new ByteArrayOutputStream();
    try {
        outputStream.write( byteBuffers);
        //outputStream.write( byteBuffers[1] );
    } catch (IOException e) {
        e.printStackTrace();
    }
    // outputStream.write( buffer2_byte );

    byte[] rez = outputStream.toByteArray();
    return rez;
}