2008年3月19日

將 YCbCr 轉成 RGB

使用 Python 將 YCbCr 的資料轉成 RGB


import sys, os
import Image

w = 640
h = 480
fn_yuv = "file.yuv"
fn_png = "file.png"

im = Image.new("RGB", (w, h))
raw = open(fn_yuv, "rb")

#
# General YCbCr to RGB matrix, Y: 16-235, C: 16-240, RGB: 888
#   R = Y + 0                 + 1.402   *(Cr-128)
#   G = Y + -0.34414*(Cb-128) + -0.71414*(Cr-128)
#   B = Y + 1.772   *(Cb-128) + 0
#

# Coefficient
C = [ [1, 0, 1.402], [1, -0.34414, -0.71414], [1, 1.772, 0] ]
# Offset
O = [ 0, 0, 0 ]

for y in range(0, h):
    for x in range(0, w, 2):
        p = raw.read(4)
        q = [0, 0, 0, 0]
        for i in range(0, 4):
            q[i] = ord(p[i])
        # For YCbCr-422 with sequence: Y0 Cb0 Y1 Cr0 Y2 Cb2 Y3 Cr2 Y4 ...
        Y = [0, 0]
        Y[0] = q[0]
        Cb   = q[1]
        Y[1] = q[2]
        Cr   = q[3]
        for i in range(0,2):
          r = C[0][0] * (Y[i] + O[0]) + C[0][1] * (Cb - 128 + O[1]) + C[0][2] * (Cr - 128 + O[2])
          g = C[1][0] * (Y[i] + O[0]) + C[1][1] * (Cb - 128 + O[1]) + C[1][2] * (Cr - 128 + O[2])
          b = C[2][0] * (Y[i] + O[0]) + C[2][1] * (Cb - 128 + O[1]) + C[2][2] * (Cr - 128 + O[2])
          if (r < 0):
              r = 0
          if (r > 255):
              r = 255
          if (g < 0):
              g = 0
          if (g > 255):
              g = 255
          if (b < 0):
              b = 0
          if (b > 255):
              b = 255
          im.putpixel((x+i,y), (int(r), int(g), int(b)))

im.save(fn_png)
raw.close()

im.show()

沒有留言: