Hiromi1623
@Hiromi1623

Are you sure you want to delete the question?

Leaving a resolved question undeleted may help others!

YUV⇒RGB変換プログラムについて

Q&A

Closed

解決したいこと

最近pythonを始めた者です。
Pythonを使用して任意の画像に対してYUV⇒RGB変換を行いたいです。
https://qiita.com/chilchil0/items/4e553bead1270054de1d#%E7%9B%AE%E7%9A%84』
のURLのプログラムを使用したいのですが、任意の画像に対して設定する場合はどの部分を変更すれば良いのでしょうか?
今まで画像の読み込みにはopencvのimreadしか使ったことが無く、独学で理解するのが難しかったため質問させていただきました。

発生している問題・エラー

任意の画像に対する処理を行いたいです。

import sys
import numpy as np
import time


class YUVData:
    def __init__(self):
        self.Y = 0
        self.U = 0
        self.V = 0


def clip(pix):
    if pix < 0:
        pix = 0
    elif pix > 255:
        pix = 255

    return pix


def set_rgbbuf(yuv):
    R = clip((298 * (yuv.Y - 16) + 409 * (yuv.V - 128) + 128) >> 8)
    G = clip(
        (298 * (yuv.Y - 16) - (100 * (yuv.U - 128) + 208 * (yuv.V - 128) - 128)) >> 8
    )
    B = clip((298 * (yuv.Y - 16) + 516 * (yuv.U - 128)) >> 8)

    return R, G, B


def main():
    start = time.clock()
    yuv_image = sys.argv[1]  # YUV420 file
    rgb_image = sys.argv[2]  # RGB888 file
    width = int(sys.argv[3])  # width
    height = int(sys.argv[4])  # height

    # Expand the yuv file to an array
    yuv_array = np.fromfile(yuv_image, np.uint8)

    # Setting uv offset
    u_data = width * height
    v_data = (width * height) + ((width * height) >> 2)

    # Initialize RGB buffer
    rgb_buf = [None] * (width * height * 3)
    id_1 = 0
    id_2 = width * 3

    yuv = YUVData()

    for row_cnt in range(0, height, 2):
        for col_cnt in range(0, width, 2):
            yuv.U = int(yuv_array[u_data])
            yuv.V = int(yuv_array[v_data])
            u_data += 1
            v_data += 1

            for cnt in range(0, 2):
                yuv.Y = int(yuv_array[row_cnt * width + col_cnt + cnt])
                rgb_buf[id_1], rgb_buf[id_1 + 1], rgb_buf[id_1 + 2] = set_rgbbuf(yuv)
                id_1 += 3
                yuv.Y = int(yuv_array[(row_cnt + 1) * width + col_cnt + cnt])
                rgb_buf[id_2], rgb_buf[id_2 + 1], rgb_buf[id_2 + 2] = set_rgbbuf(yuv)
                id_2 += 3

        id_1 += 3 * width
        id_2 += 3 * width

    with open(rgb_image, "wb") as f_rgb:
        for i in range(0, (width * height * 3)):
            f_rgb.write(rgb_buf[i].to_bytes(1, "little"))

    end = time.clock()
    print(end - start)


if __name__ == "__main__":
    main()
0

1Answer

    yuv_image = sys.argv[1]  # YUV420 file
    rgb_image = sys.argv[2]  # RGB888 file
    width = int(sys.argv[3])  # width
    height = int(sys.argv[4])  # height

ですから、パラメータで任意の画像が渡せるのでは?

#別件ですが、前回の質問は解決したのでしょうか?

0Like

Comments

  1. @Hiromi1623

    Questioner

    自分の理解不足でお手数をおかけして申し訳ありません。
    []の中身の値を任意の画像に合わせて変更すればいいのでしょうか?

    ※前回質問させていただいた問題は無事解決いたしました。ありがとうございます。
  2. python sys.argvで検索したら答えが見つかるかと。

Your answer might help someone💌