我有yuv420p帧数据字节的原始数据。 我想使用numpy和scipy将其转换为rgb数据。 这是我的代码:
yuv = np.frombuffer(data, dtype='uint8')
y = yuv[:1920*1080].reshape(1080, 1920)
v = yuv[1920*1080::2].reshape(540, 960)
u = yuv[1920*1080+1::2].reshape(540, 960)
u = ndimage.zoom(u, 2, order=0)
v = ndimage.zoom(v, 2, order=0)
y = y.reshape((y.shape[0], y.shape[1], 1))
u = u.reshape((u.shape[0], u.shape[1], 1))
v = v.reshape((v.shape[0], v.shape[1], 1))
yuv = np.concatenate((y, u, v), axis=2)
yuv[:, :, 0] = yuv[:, :, 0].clip(16, 235).astype(yuv.dtype) - 16
yuv[:, :, 1:] = yuv[:, :, 1:].clip(16, 240).astype(yuv.dtype) - 128
A = np.array([[1.164, 0.000, 1.793],
[1.164, -0.213, -0.533],
[1.164, 2.112, 0.000]])
rgb = np.dot(yuv, A.T).clip(0, 255).astype('uint8')
我用PIL打开了这个输出rgb数组,并且图像不是我期望的那样。
我的代码有什么问题吗?还是我的数据有问题?
答案 0 :(得分:0)
问题出在原始视频的格式中。 yuv420表示色度分量(u和v)的空间分辨率是y分量的四分之一。这就是为什么您会在y分量的顶部看到四个“小”图像的原因。因此,必须在水平和垂直方向上对u和v分量进行二次采样,以使每个分量都可以与y分量的空间分辨率匹配。