373 lines
9.7 KiB
Python
373 lines
9.7 KiB
Python
import numpy as np
|
|
from PIL import Image
|
|
import struct
|
|
|
|
def pad_square_to_4(x_start, x_end, y_start, y_end):
|
|
w_int = x_end - x_start
|
|
h_int = y_end - y_start
|
|
pad = w_int - h_int
|
|
if pad > 0:
|
|
pad_s = (pad >> 1) &(~3)
|
|
pad_e = pad - pad_s
|
|
y_start -= pad_s
|
|
y_end += pad_e
|
|
else:#//pad <=0
|
|
pad_s = -(((pad) >> 1) &(~3))
|
|
pad_e = (-pad) - pad_s
|
|
x_start -= pad_s
|
|
x_end += pad_e
|
|
return x_start, x_end, y_start, y_end
|
|
|
|
def str_fill(value):
|
|
if len(value) == 1:
|
|
value = "0" + value
|
|
elif len(value) == 0:
|
|
value = "00"
|
|
|
|
return value
|
|
|
|
def clip_ary(value):
|
|
list_v = []
|
|
for i in range(len(value)):
|
|
v = value[i] % 256
|
|
list_v.append(v)
|
|
|
|
return list_v
|
|
|
|
def str2bool(v):
|
|
if isinstance(v,bool):
|
|
return v
|
|
return v.lower() in ('TRUE', 'True', 'true', '1', 'T', 't', 'Y', 'YES', 'y', 'yes')
|
|
|
|
|
|
def str2int(s):
|
|
if s == "":
|
|
s = 0
|
|
s = int(s)
|
|
return s
|
|
|
|
def str2float(s):
|
|
if s == "":
|
|
s = 0
|
|
s = float(s)
|
|
return s
|
|
|
|
def clip(value, mini, maxi):
|
|
if value < mini:
|
|
result = mini
|
|
elif value > maxi:
|
|
result = maxi
|
|
else:
|
|
result = value
|
|
|
|
return result
|
|
|
|
|
|
def clip_ary(value):
|
|
list_v = []
|
|
for i in range(len(value)):
|
|
v = value[i] % 256
|
|
list_v.append(v)
|
|
|
|
return list_v
|
|
|
|
|
|
def signed_rounding(value, bit):
|
|
if value < 0:
|
|
value = value - (1 << (bit - 1))
|
|
else:
|
|
value = value + (1 << (bit - 1))
|
|
|
|
return value
|
|
|
|
def hex_loader(data_folder,**kwargs):
|
|
format_mode = kwargs['raw_img_fmt']
|
|
src_h = kwargs['img_in_height']
|
|
src_w = kwargs['img_in_width']
|
|
|
|
if format_mode in ['YUV444', 'yuv444', 'YCBCR444', 'YCbCr444', 'ycbcr444']:
|
|
output = hex_yuv444(data_folder,src_h,src_w)
|
|
elif format_mode in ['RGB565', 'rgb565']:
|
|
output = hex_rgb565(data_folder,src_h,src_w)
|
|
elif format_mode in ['YUV422', 'yuv422', 'YCBCR422', 'YCbCr422', 'ycbcr422']:
|
|
output = hex_yuv422(data_folder,src_h,src_w)
|
|
|
|
return output
|
|
|
|
def hex_rgb565(hex_folder,src_h,src_w):
|
|
pix_per_line = 8
|
|
byte_per_line = 16
|
|
|
|
f = open(hex_folder)
|
|
pixel_r = []
|
|
pixel_g = []
|
|
pixel_b = []
|
|
|
|
# Ignore the first line
|
|
f.readline()
|
|
input_line = int((src_h * src_w)/pix_per_line)
|
|
for i in range(input_line):
|
|
readline = f.readline()
|
|
for j in range(int(byte_per_line/2)-1, -1, -1):
|
|
data1 = int(readline[(j * 4 + 0):(j * 4 + 2)], 16)
|
|
data0 = int(readline[(j * 4 + 2):(j * 4 + 4)], 16)
|
|
r = ((data1 & 0xf8) >> 3)
|
|
g = (((data0 & 0xe0) >> 5) + ((data1 & 0x7) << 3))
|
|
b = (data0 & 0x1f)
|
|
pixel_r.append(r)
|
|
pixel_g.append(g)
|
|
pixel_b.append(b)
|
|
|
|
ary_r = np.array(pixel_r, dtype=np.uint8)
|
|
ary_g = np.array(pixel_g, dtype=np.uint8)
|
|
ary_b = np.array(pixel_b, dtype=np.uint8)
|
|
output = np.concatenate((ary_r[:, None], ary_g[:, None], ary_b[:, None]), axis=1)
|
|
output = output.reshape((src_h, src_w, 3))
|
|
|
|
return output
|
|
|
|
def hex_yuv444(hex_folder,src_h,src_w):
|
|
pix_per_line = 4
|
|
byte_per_line = 16
|
|
|
|
f = open(hex_folder)
|
|
byte0 = []
|
|
byte1 = []
|
|
byte2 = []
|
|
byte3 = []
|
|
|
|
# Ignore the first line
|
|
f.readline()
|
|
input_line = int((src_h * src_w)/pix_per_line)
|
|
for i in range(input_line):
|
|
readline = f.readline()
|
|
for j in range(byte_per_line-1, -1, -1):
|
|
data = int(readline[(j*2):(j*2+2)], 16)
|
|
if (j+1) % 4 == 0:
|
|
byte0.append(data)
|
|
elif (j+2) % 4 == 0:
|
|
byte1.append(data)
|
|
elif (j+3) % 4 == 0:
|
|
byte2.append(data)
|
|
elif (j+4) % 4 == 0:
|
|
byte3.append(data)
|
|
# ary_a = np.array(byte0, dtype=np.uint8)
|
|
ary_v = np.array(byte1, dtype=np.uint8)
|
|
ary_u = np.array(byte2, dtype=np.uint8)
|
|
ary_y = np.array(byte3, dtype=np.uint8)
|
|
output = np.concatenate((ary_y[:, None], ary_u[:, None], ary_v[:, None]), axis=1)
|
|
output = output.reshape((src_h, src_w, 3))
|
|
|
|
return output
|
|
|
|
def hex_yuv422(hex_folder,src_h,src_w):
|
|
pix_per_line = 8
|
|
byte_per_line = 16
|
|
f = open(hex_folder)
|
|
pixel_y = []
|
|
pixel_u = []
|
|
pixel_v = []
|
|
|
|
# Ignore the first line
|
|
f.readline()
|
|
input_line = int((src_h * src_w)/pix_per_line)
|
|
for i in range(input_line):
|
|
readline = f.readline()
|
|
for j in range(int(byte_per_line/4)-1, -1, -1):
|
|
data3 = int(readline[(j * 8 + 0):(j * 8 + 2)], 16)
|
|
data2 = int(readline[(j * 8 + 2):(j * 8 + 4)], 16)
|
|
data1 = int(readline[(j * 8 + 4):(j * 8 + 6)], 16)
|
|
data0 = int(readline[(j * 8 + 6):(j * 8 + 8)], 16)
|
|
pixel_y.append(data3)
|
|
pixel_y.append(data1)
|
|
pixel_u.append(data2)
|
|
pixel_u.append(data2)
|
|
pixel_v.append(data0)
|
|
pixel_v.append(data0)
|
|
|
|
ary_y = np.array(pixel_y, dtype=np.uint8)
|
|
ary_u = np.array(pixel_u, dtype=np.uint8)
|
|
ary_v = np.array(pixel_v, dtype=np.uint8)
|
|
output = np.concatenate((ary_y[:, None], ary_u[:, None], ary_v[:, None]), axis=1)
|
|
output = output.reshape((src_h, src_w, 3))
|
|
|
|
return output
|
|
|
|
def bin_loader(data_folder,**kwargs):
|
|
format_mode = kwargs['raw_img_fmt']
|
|
src_h = kwargs['img_in_height']
|
|
src_w = kwargs['img_in_width']
|
|
if format_mode in ['YUV','yuv','YUV444', 'yuv444', 'YCBCR','YCbCr','ycbcr','YCBCR444', 'YCbCr444', 'ycbcr444']:
|
|
output = bin_yuv444(data_folder,src_h,src_w)
|
|
elif format_mode in ['RGB565', 'rgb565']:
|
|
output = bin_rgb565(data_folder,src_h,src_w)
|
|
elif format_mode in ['NIR', 'nir','NIR888', 'nir888']:
|
|
output = bin_nir(data_folder,src_h,src_w)
|
|
elif format_mode in ['YUV422', 'yuv422', 'YCBCR422', 'YCbCr422', 'ycbcr422']:
|
|
output = bin_yuv422(data_folder,src_h,src_w)
|
|
elif format_mode in ['RGB888','rgb888']:
|
|
output = np.fromfile(data_folder, dtype='uint8')
|
|
output = output.reshape(src_h,src_w,3)
|
|
elif format_mode in ['RGBA8888','rgba8888', 'RGBA' , 'rgba']:
|
|
output_temp = np.fromfile(data_folder, dtype='uint8')
|
|
output_temp = output_temp.reshape(src_h,src_w,4)
|
|
output = output_temp[:,:,0:3]
|
|
|
|
return output
|
|
|
|
def bin_yuv444(in_img_path,src_h,src_w):
|
|
# load bin
|
|
struct_fmt = '1B'
|
|
struct_len = struct.calcsize(struct_fmt)
|
|
struct_unpack = struct.Struct(struct_fmt).unpack_from
|
|
|
|
row = src_h
|
|
col = src_w
|
|
pixels = row*col
|
|
|
|
raw = []
|
|
with open(in_img_path, "rb") as f:
|
|
while True:
|
|
data = f.read(struct_len)
|
|
if not data: break
|
|
s = struct_unpack(data)
|
|
raw.append(s[0])
|
|
|
|
|
|
raw = raw[:pixels*4]
|
|
|
|
#
|
|
output = np.zeros((pixels * 3), dtype=np.uint8)
|
|
cnt = 0
|
|
for i in range(0, pixels*4, 4):
|
|
#Y
|
|
output[cnt] = raw[i+3]
|
|
#U
|
|
cnt += 1
|
|
output[cnt] = raw[i+2]
|
|
#V
|
|
cnt += 1
|
|
output[cnt] = raw[i+1]
|
|
|
|
cnt += 1
|
|
|
|
output = output.reshape((src_h,src_w,3))
|
|
return output
|
|
|
|
def bin_yuv422(in_img_path,src_h,src_w):
|
|
# load bin
|
|
struct_fmt = '1B'
|
|
struct_len = struct.calcsize(struct_fmt)
|
|
struct_unpack = struct.Struct(struct_fmt).unpack_from
|
|
|
|
row = src_h
|
|
col = src_w
|
|
pixels = row*col
|
|
|
|
raw = []
|
|
with open(in_img_path, "rb") as f:
|
|
while True:
|
|
data = f.read(struct_len)
|
|
if not data: break
|
|
s = struct_unpack(data)
|
|
raw.append(s[0])
|
|
|
|
|
|
raw = raw[:pixels*2]
|
|
|
|
#
|
|
output = np.zeros((pixels * 3), dtype=np.uint8)
|
|
cnt = 0
|
|
for i in range(0, pixels*2, 4):
|
|
#Y0
|
|
output[cnt] = raw[i+3]
|
|
#U0
|
|
cnt += 1
|
|
output[cnt] = raw[i+2]
|
|
#V0
|
|
cnt += 1
|
|
output[cnt] = raw[i]
|
|
#Y1
|
|
cnt += 1
|
|
output[cnt] = raw[i+1]
|
|
#U1
|
|
cnt += 1
|
|
output[cnt] = raw[i+2]
|
|
#V1
|
|
cnt += 1
|
|
output[cnt] = raw[i]
|
|
|
|
cnt += 1
|
|
|
|
output = output.reshape((src_h,src_w,3))
|
|
return output
|
|
|
|
def bin_rgb565(in_img_path,src_h,src_w):
|
|
# load bin
|
|
struct_fmt = '1B'
|
|
struct_len = struct.calcsize(struct_fmt)
|
|
struct_unpack = struct.Struct(struct_fmt).unpack_from
|
|
|
|
row = src_h
|
|
col = src_w
|
|
pixels = row*col
|
|
|
|
rgba565 = []
|
|
with open(in_img_path, "rb") as f:
|
|
while True:
|
|
data = f.read(struct_len)
|
|
if not data: break
|
|
s = struct_unpack(data)
|
|
rgba565.append(s[0])
|
|
|
|
|
|
rgba565 = rgba565[:pixels*2]
|
|
|
|
# rgb565_bin to numpy_array
|
|
output = np.zeros((pixels * 3), dtype=np.uint8)
|
|
cnt = 0
|
|
for i in range(0, pixels*2, 2):
|
|
temp = rgba565[i]
|
|
temp2 = rgba565[i+1]
|
|
#R-5
|
|
output[cnt] = (temp2 >>3)
|
|
|
|
#G-6
|
|
cnt += 1
|
|
output[cnt] = ((temp & 0xe0) >> 5) + ((temp2 & 0x07) << 3)
|
|
|
|
#B-5
|
|
cnt += 1
|
|
output[cnt] = (temp & 0x1f)
|
|
|
|
cnt += 1
|
|
|
|
output = output.reshape((src_h,src_w,3))
|
|
return output
|
|
|
|
def bin_nir(in_img_path,src_h,src_w):
|
|
# load bin
|
|
struct_fmt = '1B'
|
|
struct_len = struct.calcsize(struct_fmt)
|
|
struct_unpack = struct.Struct(struct_fmt).unpack_from
|
|
|
|
nir = []
|
|
with open(in_img_path, "rb") as f:
|
|
while True:
|
|
data = f.read(struct_len)
|
|
if not data: break
|
|
s = struct_unpack(data)
|
|
nir.append(s[0])
|
|
|
|
nir = nir[:src_h*src_w]
|
|
pixels = len(nir)
|
|
# nir_bin to numpy_array
|
|
output = np.zeros((len(nir) * 3), dtype=np.uint8)
|
|
for i in range(0, pixels):
|
|
output[i*3]=nir[i]
|
|
output[i*3+1]=nir[i]
|
|
output[i*3+2]=nir[i]
|
|
|
|
output = output.reshape((src_h,src_w,3))
|
|
return output
|