将 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.
我正在做一个项目,我必须将阈值应用于 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.