2016-10-24 4 views
0

Я хочу сделать некоторую обработку изображений на изображении YUV_420_888 и вам потребуется оттуда серая версия. Поскольку я читал о YUV Image, этого должно быть достаточно, чтобы извлечь Y-образ изображения. В Android я попробую, чтобы этот рабочий процесс преобразовал Y Plane в массив байтов.Преобразование изображения YUV в оттенки серого Изображение - тот же результат, что и RGB, в оттенки серого?

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

Так как я хочу, чтобы сравнить эту картинку, я получаю сейчас, с черно-белое изображение (или, по крайней мере, в результате обработки изображений) У меня есть вопрос, шкала серого изображения я получаю извлечение Y-Plane почти такой же, как RGB, который был превращен в оттенки серого? Или мне нужно сделать некоторые дополнительные шаги для этого?

ответ

1

Да, data, который вы получаете из плоскости Y, должен быть таким же, как если бы вы проходили изображение 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 байт и переходит в несильно:

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