Вы действительно должны предоставить пример изображения, чтобы люди могли помочь вам лучше - иначе они потратят целую вечность на разработку кода, который, как они полагают, соответствует формату изображения, который вы имеете в виду, и если они ошибаются, это пустая трата усилий.
Предполагая, что ваши данные выглядят так из Википедии , вы можете видеть, что все выборки Y идут первыми, затем идут все выборки U и все V выборки.Однако есть только 1/4 столько U / V выборок, сколько Y выборок, потому что эти два компонента субдискретизированы с соотношением 2: 1 по горизонтали и вертикали:
Итак, идея состоит в том, чтобы прочитать весь набор выборок YUV, затем взять первые w*h
байты в качестве значений Y, следующие w*h/4
выборки в качестве U и следующие w*h/4
выборки в качестве V:
import numpy as np
# Guess a width and height and derive number of pixels in image
w,h = 2048,1536
px = w*h
# Read entire file into YUV
YUV = np.fromfile('NV21_2048x1536.yuv',dtype='uint8')
# Take first h x w samples and reshape as Y channel
Y = YUV[0:w*h].reshape(h,w)
# Take next px/4 samples as U
U = YUV[px:(px*5)//4].reshape(h//2,w//2)
# Take next px/4 samples as V
V = YUV[(px*5)//4:(px*6)//4].reshape(h//2,w//2)
# Undo subsampling of U and V by doubling height and width
Ufull = U.copy().resize((w,h))
Vfull = V.copy().resize((w,h))
Я понятия не имею, что вы планируете делать дальше, поэтому я пока оставлю это здесь!
Ключевые слова : NV21, YUV, YUV420, Android, YUV430P, Подушка, PIL, Python, изображение, обработка изображений.