2016-10-24 201 views
0

我想对YUV_420_888图像进行一些图像处理,并且需要灰度版本。当我读到YUV图像时,它应该足以提取图像的Y平面。在Android中,我将尝试使用此工作流将Y平面转换为字节数组。将YUV图像转换为灰度图像 - 与RGB转换为灰度相同的结果?

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

所以,我想比较这图片我现在得到与其他灰度图像(或至少图像处理的结果),我有问题,就是灰度图像我得到近提取Y平面与变成灰度的RGB相同?或者我必须为此做一些额外的处理步骤?

回答

1

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

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