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