Импортировать YUV как байтовый массив - PullRequest
0 голосов
/ 25 ноября 2018

Я работаю над проектом, в котором мне нужно применить порог к изображению YUV420_SP_NV21 (взятому с камеры Android), чтобы определить, какие пиксели являются «черными», а какие «белыми».

Следовательно,Я хочу импортировать его в Python как байтовый массив (используя OpenCV, NumPy, PIL, ...), чтобы я мог выполнять некоторые быстрые побитовые операции над значениями Y.



ОднакоКогда я пытаюсь импортировать изображение, используя следующие методы, я получаю бесполезные выходные данные:

Когда я печатаю

import cv2
import numpy as np

img = cv2.imread('test.yuv')
imgArr = np.array(img)

print(img)
print(imgArr)

, я получаю в качестве вывода:

None
None



И когда я набираю

import numpy as np

f = open('test.yuv', 'rb')
img = f.read()
imgArr = np.array(img)

, я получаю некоторую бесполезную последовательность символов.
И когда я набираю сейчас (например)

print(imgArr[0])

, я получаю в качестве вывода:

IndexError: too many indices for array

Это означает, что imgArr вообще не массив!



Может кто-нибудь сказать, пожалуйста, что я делаю не так?Заранее спасибо!

1 Ответ

0 голосов
/ 25 ноября 2018

Вы действительно должны предоставить пример изображения, чтобы люди могли помочь вам лучше - иначе они потратят целую вечность на разработку кода, который, как они полагают, соответствует формату изображения, который вы имеете в виду, и если они ошибаются, это пустая трата усилий.

Предполагая, что ваши данные выглядят так из Википедии , вы можете видеть, что все выборки Y идут первыми, затем идут все выборки U и все V выборки.Однако есть только 1/4 столько U / V выборок, сколько Y выборок, потому что эти два компонента субдискретизированы с соотношением 2: 1 по горизонтали и вертикали:

enter image description here

Итак, идея состоит в том, чтобы прочитать весь набор выборок 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, изображение, обработка изображений.

...