【问题标题】:Import YUV as a byte array将 YUV 导入为字节数组
【发布时间】:2018-11-25 12:56:28
【问题描述】:

我正在做一个项目,我必须对 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 根本不是数组!



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

【问题讨论】:

  • 如果您能给我们提供一个示例 YUV 文件就更好了
  • YUV 格式不对图像的宽度和高度进行编码,因此您需要提供示例文件以及图像的高度和宽度(以像素为单位),YUV 以每像素 1.5 个字节进行编码,所以如果您的图像是 80x40 像素,则为 3,200 像素,并且文件大小应为 4,800 字节 (3,200 * 1.5)。谢谢。
  • "...一些无用的字符序列"。我发现很难想出你可以合理预期的东西。文本形式的图像?

标签: python numpy yuv


【解决方案1】:

您确实应该提供一个示例图像,以便人们可以更好地帮助您 - 否则他们会花费大量时间来开发他们猜测的图像格式的代码,如果他们猜错了,那就是浪费精力。

假设您的数据在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、图像、图像处理。

【讨论】:

  • 我的问题的关键是 np.fromfile() 函数。我知道字节流顺序,但认为这对这个问题并不重要。我只是不知道如何将文件作为字节数组导入(表示为 0 到 255 之间的数字)。但是,仍然感谢您的结构化回答
  • 我使用此代码将 YUV 转换为 RGB。我发现提取向量 Y、U 和 V 的信息很有用,但随后按照这个问题的答案来了解如何正确获取 RGB 矩阵:stackoverflow.com/questions/23752839/…
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2012-12-19
  • 1970-01-01
  • 1970-01-01
  • 2012-10-18
  • 2018-03-02
  • 1970-01-01
  • 2016-05-18
相关资源
最近更新 更多