Как написать конвертировать массив YUV в массив RGB?

У меня есть оригинальные данные, которые являются байтами данных кадра yuv420p. Я хочу преобразовать его в данные RGB, используя Numpy и Scipy. Вот мой код:

    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 ответов

Проблема в формате оригинального видео. yuv420 означает, что компоненты цветности (u и v) имеют одну четвертую пространственного разрешения компонента y. По этой причине вы видите четыре "маленьких" изображения, наложенных поверх вашего y-компонента. Следовательно, вы должны повысить дискретизацию компонентов u и v в два раза, как в горизонтальном, так и в вертикальном направлениях, чтобы каждый компонент мог соответствовать пространственному разрешению компонента y.

Другие вопросы по тегам