将 YUV 导入为字节数组

Import YUV as a byte array

我正在做一个项目,我必须将阈值应用于 YUV420_SP_NV21 图像(从 Android 相机拍摄)以确定哪些像素是 'black',哪些是'white'.

因此,我想将其作为字节数组导入 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 根本就不是数组!



谁能告诉我我做错了什么? 提前致谢!

你真的应该提供一个样本图像,这样人们就可以更好地帮助你 - 否则他们会花费很长时间来开发代码来猜测你所指的图像格式,如果他们猜错了,那就是在浪费精力。

假设 Wikipedia 中的数据看起来像这样,您可以看到所有 Y 样本排在第一位,然后是所有 U 样本和所有 V 样本。然而,U/V 个样本只有 Y 个样本的 1/4,因为这两个分量在水平和垂直方向上以 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, Pillow, PIL, Python, image, image processing.