548 lines
21 KiB
Python

import numpy as np
import math
def pack_image(image, file, pack_fmt):
## txt
if pack_fmt.lower() in ['txt']:
image = np.array(image).reshape((-1,1))
if 'U' in str(image.dtype):
index = np.where(image=='xx')[0]
if len(index) > 0:
image[index] = 0
np.savetxt(file,image.astype('float'),fmt="%.8f")
## bin
elif pack_fmt.lower() in ['bin']:
image = np.array(image).reshape((-1,1))
if 'U' in str(image.dtype):
index = np.where(image=='xx')[0]
if len(index) > 0:
image[index] = 0
image.astype("uint8").tofile(file)
## hex
elif pack_fmt.lower() in ['hex']:
byte_per_line=16
if(image.ndim >= 3):
h, w, c = image.shape
size = int(h*w)
elif(image.ndim == 2):
h, w = image.shape
size = int(h*w)
c = 1
elif(image.ndim == 1):
size = int(image.shape[0])
c = 1
pix_per_line = int(byte_per_line / c)
output_line = math.ceil((size) / pix_per_line)
image_f = image.reshape((size, c))
with open(file, "w") as f:
for i in range(output_line):
pixels = ""
# ... | pixel 3 | pixel 2 | pixel 1 | pixel 0
for j in range((i+1)*pix_per_line-1, i*pix_per_line-1, -1):
# c3 -> byte 3 | c2 -> byte 2 | c1 -> byte 1 | c0 -> byte 0
for k in range(c-1, -1, -1):
if j >= image_f.shape[0]:
pixels = pixels + '00'
elif image_f[j, k] == 'xx':
pixels = pixels + 'xx'
else:
pixels = pixels + str_fill(hex((image_f[j, k]).astype('uint8')).lstrip("0x"))
f.write(pixels + "\n")
def str_fill(value):
if len(value) == 1:
value = "0" + value
elif len(value) == 0:
value = "00"
return value
def reorder_image(image, image_fmt, order=None):
# ============================================================================================
# c3 c2 c1 c0
# RGBA A B G R -> np.array
#
# byte3 byte2 byte1 byte0
# order 0: R G B A
# order 1: R B G A
# order 2: G R B A
# order 3: G B R A
# order 4: B R G A
# order 5: B G R A -> IE ARGB Mode
# order 8: A R G B
# order 9: A R B G
# order 10: A G R B
# order 11: A G B R
# order 12: A B R G
# order 13: A B G R -> IE RGBA Mode
# ============================================================================================
if image_fmt.lower() in ['rgba','rgba8888']:
if order is None:
order = 13
assert(image.ndim == 3)
if image.shape[2]==3:
image = np.concatenate((image, np.zeros((image.shape[0], image.shape[1], 1), dtype=np.uint8)), axis=2)
assert(image.shape[2] == 4)
h,w,c = image.shape
image_f = image.reshape((h*w,c))
image_out = []
for i in range(h*w):
if order == 0:
byte0 = image_f[i,3]
byte1 = image_f[i,2]
byte2 = image_f[i,1]
byte3 = image_f[i,0]
elif order == 1:
byte0 = image_f[i,3]
byte1 = image_f[i,1]
byte2 = image_f[i,2]
byte3 = image_f[i,0]
elif order == 2:
byte0 = image_f[i,3]
byte1 = image_f[i,2]
byte2 = image_f[i,0]
byte3 = image_f[i,1]
elif order == 3:
byte0 = image_f[i,3]
byte1 = image_f[i,0]
byte2 = image_f[i,2]
byte3 = image_f[i,1]
elif order == 4:
byte0 = image_f[i,3]
byte1 = image_f[i,1]
byte2 = image_f[i,0]
byte3 = image_f[i,2]
elif order == 5:
byte0 = image_f[i,3]
byte1 = image_f[i,0]
byte2 = image_f[i,1]
byte3 = image_f[i,2]
elif order == 8:
byte0 = image_f[i,2]
byte1 = image_f[i,1]
byte2 = image_f[i,0]
byte3 = image_f[i,3]
elif order == 9:
byte0 = image_f[i,1]
byte1 = image_f[i,2]
byte2 = image_f[i,0]
byte3 = image_f[i,3]
elif order == 10:
byte0 = image_f[i,2]
byte1 = image_f[i,0]
byte2 = image_f[i,1]
byte3 = image_f[i,3]
elif order == 11:
byte0 = image_f[i,0]
byte1 = image_f[i,2]
byte2 = image_f[i,1]
byte3 = image_f[i,3]
elif order == 12:
byte0 = image_f[i,1]
byte1 = image_f[i,0]
byte2 = image_f[i,2]
byte3 = image_f[i,3]
elif order == 13:
byte0 = image_f[i,0]
byte1 = image_f[i,1]
byte2 = image_f[i,2]
byte3 = image_f[i,3]
image_out.append(byte0)
image_out.append(byte1)
image_out.append(byte2)
image_out.append(byte3)
image_out = np.array(image_out,dtype='uint8')
return image_out
# ============================================================================================
# c3 c2 c1 c0
# RGB565 A B5 G6 R5 -> np.array
#
# byte3 byte2 byte1 byte0
# order 0: R1[4:0],G1[5:3] G1[2:0],B1[4:0] R0[4:0],G0[5:3] G0[2:0],B0[4:0]
# order 1: B1[4:0],G1[5:3] G1[2:0],R1[4:0] B0[4:0],G0[5:3] G0[2:0],R0[4:0] -> IE RGB565 Mode
# order 2: R0[4:0],G0[5:3] G0[2:0],B0[4:0] R1[4:0],G1[5:3] G1[2:0],B1[4:0]
# order 3: B0[4:0],G0[5:3] G0[2:0],R0[4:0] B1[4:0],G1[5:3] G1[2:0],R1[4:0]
# order 4: G1[2:0],B1[4:0] R1[4:0],G1[5:3] G0[2:0],B0[4:0] R0[4:0],G0[5:3]
# order 5: G1[2:0],R1[4:0] B1[4:0],G1[5:3] G0[2:0],R0[4:0] B0[4:0],G0[5:3]
# order 6: G0[2:0],B0[4:0] R0[4:0],G0[5:3] G1[2:0],B1[4:0] R1[4:0],G1[5:3]
# order 7: G0[2:0],R0[4:0] B0[4:0],G0[5:3] G1[2:0],R1[4:0] B1[4:0],G1[5:3]
# ============================================================================================
if image_fmt.lower() in ['rgb565']:
if order is None:
order = 0
assert(image.ndim == 3)
assert((image.shape[2] == 4) | (image.shape[2] == 3))
h,w,c = image.shape
image_f = image.reshape((h*w,c))
image_out = []
for i in range(0,h*w,2):
if order == 0:
byte0 = ( (image_f[i,1] & 0x07) << 5 ) + image_f[i,2]
byte1 = ( image_f[i,0] << 3 ) + ( image_f[i,1] >> 3 )
if i+1 < h*w:
byte2 = ( (image_f[i+1,1] & 0x07) << 5 ) + image_f[i+1,2]
byte3 = ( image_f[i+1,0] << 3 ) + ( image_f[i+1,1] >> 3 )
else:
byte2 = 'xx'
byte3 = 'xx'
elif order == 1:
byte0 = ( (image_f[i,1] & 0x07) << 5 ) + image_f[i,0]
byte1 = ( image_f[i,2] << 3 ) + ( image_f[i,1] >> 3 )
if i+1 < h*w:
byte2 = ( (image_f[i+1,1] & 0x07) << 5 ) + image_f[i+1,0]
byte3 = ( image_f[i+1,2] << 3 ) + ( image_f[i+1,1] >> 3 )
else:
byte2 = 'xx'
byte3 = 'xx'
elif order == 2:
byte2 = ( (image_f[i,1] & 0x07) << 5 ) + image_f[i,2]
byte3 = ( image_f[i,0] << 3 ) + ( image_f[i,1] >> 3 )
if i+1 < h*w:
byte0 = ( (image_f[i+1,1] & 0x07) << 5 ) + image_f[i+1,2]
byte1 = ( image_f[i+1,0] << 3 ) + ( image_f[i+1,1] >> 3 )
else:
byte0 = 'xx'
byte1 = 'xx'
elif order == 3:
byte2 = ( (image_f[i,1] & 0x07) << 5 ) + image_f[i,0]
byte3 = ( image_f[i,2] << 3 ) + ( image_f[i,1] >> 3 )
if i+1 < h*w:
byte0 = ( (image_f[i+1,1] & 0x07) << 5 ) + image_f[i+1,0]
byte1 = ( image_f[i+1,2] << 3 ) + ( image_f[i+1,1] >> 3 )
else:
byte0 = 'xx'
byte1 = 'xx'
elif order == 4:
byte0 = ( image_f[i,0] << 3 ) + ( image_f[i,1] >> 3 )
byte1 = ( (image_f[i,1] & 0x07) << 5 ) + image_f[i,2]
if i+1 < h*w:
byte2 = ( image_f[i+1,0] << 3 ) + ( image_f[i+1,1] >> 3 )
byte3 = ( (image_f[i+1,1] & 0x07) << 5 ) + image_f[i+1,2]
else:
byte2 = 'xx'
byte3 = 'xx'
elif order == 5:
byte0 = ( image_f[i,2] << 3 ) + ( image_f[i,1] >> 3 )
byte1 = ( (image_f[i,1] & 0x07) << 5 ) + image_f[i,0]
if i+1 < h*w:
byte2 = ( image_f[i+1,2] << 3 ) + ( image_f[i+1,1] >> 3 )
byte3 = ( (image_f[i+1,1] & 0x07) << 5 ) + image_f[i+1,0]
else:
byte2 = 'xx'
byte3 = 'xx'
elif order == 6:
byte2 = ( image_f[i,0] << 3 ) + ( image_f[i,1] >> 3 )
byte3 = ( (image_f[i,1] & 0x07) << 5 ) + image_f[i,2]
if i+1 < h*w:
byte0 = ( image_f[i+1,0] << 3 ) + ( image_f[i+1,1] >> 3 )
byte1 = ( (image_f[i+1,1] & 0x07) << 5 ) + image_f[i+1,2]
else:
byte0 = 'xx'
byte1 = 'xx'
elif order == 7:
byte2 = ( image_f[i,2] << 3 ) + ( image_f[i,1] >> 3 )
byte3 = ( (image_f[i,1] & 0x07) << 5 ) + image_f[i,0]
if i+1 < h*w:
byte0 = ( image_f[i+1,2] << 3 ) + ( image_f[i+1,1] >> 3 )
byte1 = ( (image_f[i+1,1] & 0x07) << 5 ) + image_f[i+1,0]
else:
byte0 = 'xx'
byte1 = 'xx'
image_out.append(byte0)
image_out.append(byte1)
image_out.append(byte2)
image_out.append(byte3)
image_out = np.array(image_out)
return image_out
# ============================================================================================
# c3 c2 c1 c0
# YUV A V U Y -> np.array
# YCBCR A Cr Cb Y -> np.array
#
# byte3 byte2 byte1 byte0
# order 0: Y U/Cb V/Cr A
# order 1: Y V/Cr U/Cb A
# order 2: U/Cb Y V/Cr A
# order 3: U/Cb V/Cr Y A
# order 4: V/Cr Y U/Cb A
# order 5: V/Cr U/Cb Y A
# order 8: A Y U/Cb V/Cr
# order 9: A Y V/Cr U/Cb
# order 10: A U/Cb Y V/Cr
# order 11: A U/Cb V/Cr Y
# order 12: A V/Cr Y U/Cb
# order 13: A V/Cr U/Cb Y
# ============================================================================================
if image_fmt.lower() in ['ycbcr','ycbcr444','yuv','yuv444'] :
if order is None:
order = 13
assert(image.ndim == 3)
if image.shape[2]==3:
image = np.concatenate((image, np.zeros((image.shape[0], image.shape[1], 1), dtype=np.uint8)), axis=2)
assert(image.shape[2] == 4)
## yuv : y~[0,255]; u,v~[-128,128]
if image_fmt.lower() in ['yuv', 'yuv444'] :
image[:,:,1:3] += 128
h,w,c = image.shape
image_f = image.reshape((h*w,c))
image_out = []
for i in range(h*w):
if order == 0:
byte0 = image_f[i,3]
byte1 = image_f[i,2]
byte2 = image_f[i,1]
byte3 = image_f[i,0]
elif order == 1:
byte0 = image_f[i,3]
byte1 = image_f[i,1]
byte2 = image_f[i,2]
byte3 = image_f[i,0]
elif order == 2:
byte0 = image_f[i,3]
byte1 = image_f[i,2]
byte2 = image_f[i,0]
byte3 = image_f[i,1]
elif order == 3:
byte0 = image_f[i,3]
byte1 = image_f[i,0]
byte2 = image_f[i,2]
byte3 = image_f[i,1]
elif order == 4:
byte0 = image_f[i,3]
byte1 = image_f[i,1]
byte2 = image_f[i,0]
byte3 = image_f[i,2]
elif order == 5:
byte0 = image_f[i,3]
byte1 = image_f[i,0]
byte2 = image_f[i,1]
byte3 = image_f[i,2]
elif order == 8:
byte0 = image_f[i,2]
byte1 = image_f[i,1]
byte2 = image_f[i,0]
byte3 = image_f[i,3]
elif order == 9:
byte0 = image_f[i,1]
byte1 = image_f[i,2]
byte2 = image_f[i,0]
byte3 = image_f[i,3]
elif order == 10:
byte0 = image_f[i,2]
byte1 = image_f[i,0]
byte2 = image_f[i,1]
byte3 = image_f[i,3]
elif order == 11:
byte0 = image_f[i,0]
byte1 = image_f[i,2]
byte2 = image_f[i,1]
byte3 = image_f[i,3]
elif order == 12:
byte0 = image_f[i,1]
byte1 = image_f[i,0]
byte2 = image_f[i,2]
byte3 = image_f[i,3]
elif order == 13:
byte0 = image_f[i,0]
byte1 = image_f[i,1]
byte2 = image_f[i,2]
byte3 = image_f[i,3]
image_out.append(byte0)
image_out.append(byte1)
image_out.append(byte2)
image_out.append(byte3)
image_out = np.array(image_out,dtype='uint8')
return image_out
# ============================================================================================
# YUV422 & YCBCR422
# c3 c2 c1 c0
# YUV A V U Y -> np.array
# YCBCR A Cr Cb Y -> np.array
#
# byte3 byte2 byte1 byte0
# order 0: Y0 U/Cb Y1 V/Cr
# order 1: Y0 V/Cr Y1 U/Cb
# order 2: U/Cb Y0 V/Cr Y1
# order 3: V/Cr Y0 U/Cb Y1
# order 4: Y1 U/Cb Y0 V/Cr
# order 5: Y1 V/Cr Y0 U/Cb -> IE UYVY Mode
# order 6: U/Cb Y1 V/Cr Y0
# order 7: V/Cr Y1 U/Cb Y0 -> IE YUYV Mode
# ============================================================================================
if image_fmt.lower() in [ 'ycbcr422','yuv422'] :
if order is None:
order = 7
assert(image.ndim == 3)
assert((image.shape[2] == 4) | (image.shape[2] == 3))
## yuv : y~[0,255]; u,v~[-128,128]
if image_fmt.lower() in ['yuv422'] :
image[:,:,1:3] += 128
h,w,c = image.shape
image_f = image.reshape((h*w,c))
image_out = []
image_planar_Y = []
image_planar_U = []
image_planar_V = []
##
for i in range(0,h*w,2):
if order == 0:
if i+1 < h*w:
byte0 = image_f[i+1,2]
byte1 = image_f[i+1,0]
byte2 = image_f[i,1]
byte3 = image_f[i,0]
else:
byte0 = image_f[i,2]
byte1 = 'xx'
byte2 = image_f[i,1]
byte3 = image_f[i,0]
elif order == 1:
if i+1 < h*w:
byte0 = image_f[i+1,1]
byte1 = image_f[i+1,0]
byte2 = image_f[i,2]
byte3 = image_f[i,0]
else:
byte0 = image_f[i,1]
byte1 = 'xx'
byte2 = image_f[i,2]
byte3 = image_f[i,0]
elif order == 2:
if i+1 < h*w:
byte0 = image_f[i+1,0]
byte1 = image_f[i+1,2]
byte2 = image_f[i,0]
byte3 = image_f[i,1]
else:
byte0 = 'xx'
byte1 = image_f[i,2]
byte2 = image_f[i,0]
byte3 = image_f[i,1]
elif order == 3:
if i+1 < h*w:
byte0 = image_f[i+1,0]
byte1 = image_f[i+1,1]
byte2 = image_f[i,0]
byte3 = image_f[i,2]
else:
byte0 = 'xx'
byte1 = image_f[i,1]
byte2 = image_f[i,0]
byte3 = image_f[i,2]
elif order == 4:
if i+1 < h*w:
byte0 = image_f[i,2]
byte1 = image_f[i,0]
byte2 = image_f[i+1,1]
byte3 = image_f[i+1,0]
else:
byte0 = image_f[i,2]
byte1 = image_f[i,0]
byte2 = image_f[i,1]
byte3 = 'xx'
elif order == 5:
if i+1 < h*w:
byte0 = image_f[i,1]
byte1 = image_f[i,0]
byte2 = image_f[i+1,2]
byte3 = image_f[i+1,0]
else:
byte0 = image_f[i,1]
byte1 = image_f[i,0]
byte2 = image_f[i,2]
byte3 = 'xx'
elif order == 6:
if i+1 < h*w:
byte0 = image_f[i,0]
byte1 = image_f[i,2]
byte2 = image_f[i+1,0]
byte3 = image_f[i+1,1]
else:
byte0 = image_f[i,0]
byte1 = image_f[i,2]
byte2 = 'xx'
byte3 = image_f[i,1]
elif order == 7:
if i+1 < h*w:
byte0 = image_f[i,0]
byte1 = image_f[i,1]
byte2 = image_f[i+1,0]
byte3 = image_f[i+1,2]
else:
byte0 = image_f[i,0]
byte1 = image_f[i,1]
byte2 = 'xx'
byte3 = image_f[i,2]
##
if order == 'planar':
if i+1 < h*w:
image_planar_Y.append(image_f[i,0])
image_planar_Y.append(image_f[i+1,0])
image_planar_U.append(image_f[i,1])
image_planar_V.append(image_f[i+1,2])
else:
image_planar_Y.append(image_f[i,0])
image_planar_U.append(image_f[i,1])
image_planar_V.append(image_f[i,2])
else:
image_out.append(byte0)
image_out.append(byte1)
image_out.append(byte2)
image_out.append(byte3)
##
if order == 'planar':
image_out = np.concatenate([np.array(image_planar_Y),np.array(image_planar_U),np.array(image_planar_V)])
else:
image_out = np.array(image_out)
##
return image_out
# ============================================================================================
# YUV420 & YCBCR420
# ============================================================================================
if image_fmt.lower() in [ 'ycbcr420','yuv420'] :
assert(image.ndim == 3)
assert((image.shape[2] == 4) | (image.shape[2] == 3))
h,w,c = image.shape
assert(h%2==0)
assert(w%2==0)
image_f = image.reshape((h*w,c))
image_out = []
image_planar_Y = []
image_planar_U = []
image_planar_V = []
for y in range(h):
for x in range(w):
if( (x % 2)==0 ) & ( (y % 2)==0 ):
image_planar_Y.append(image[y,x,0])
image_planar_U.append(image[y,x,1])
image_planar_V.append(image[y,x,2])
else:
image_planar_Y.append(image[y,x,0])
##
if order == 'planar':
image_out = np.concatenate([np.array(image_planar_Y),np.array(image_planar_U),np.array(image_planar_V)])
##
return image_out
else:
return image