【问题标题】:how to write convert yuv array to rgb array?如何将 yuv 数组转换为 rgb 数组?
【发布时间】:2018-08-20 09:29:00
【问题描述】:

我有原始数据,即 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 数组,但图像不是我预期的样子。

我的代码有什么问题吗?还是我的数据有问题?

【问题讨论】:

    标签: python numpy yuv ndimage


    【解决方案1】:

    问题在于原始视频的格式。 yuv420 表示色度分量(u 和 v)的空间分辨率是 y 分量的四分之一。这就是为什么您会看到四个“小”图像覆盖在 y 组件之上的原因。因此,您必须在水平和垂直方向上将 u 和 v 分量上采样两倍,以便每个分量都可以匹配 y 分量的空间分辨率。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-07-27
      • 1970-01-01
      • 2021-12-24
      • 2011-08-23
      • 2011-12-07
      相关资源
      最近更新 更多