cat > /workspace/scratch/assets.py <<'PY'
import json,numpy as np,cv2,tifffile
from PIL import Image,ImageCms,ImageDraw
from pathlib import Path
src=json.load(open('/workspace/scratch/sources.json'));models=json.load(open('/workspace/scratch/finalcolour.json'))
logical={s:s for s in src};logical['HH-5547']='HH-6672';logical['HH-6672']='HH-5547'
out=Path('/workspace/output');(out/'assets').mkdir(exist_ok=True)
icc=open('/workspace/input/profiles/sRGB_icc22.icm','rb').read();handoff={'version':'ultimate-v13','skus':[]};meta={}
for sku,frame in logical.items():
 a=tifffile.imread('/workspace/input/'+src[frame]).astype('float32')/65535
 m=models[frame];z=np.where(a<=.04045,a/12.92,((a+.055)/1.055)**2.4)
 z=(np.maximum(z-np.array(m['input_offset'],dtype='float32'),1e-10)**np.array(m['gamma'],dtype='float32'))@np.array(m['matrix'],dtype='float32')*m['anchor']
 z=np.where(z<=.0031308,z*12.92,1.055*np.maximum(z,0)**(1/2.4)-.055)
 rgb=np.rint(np.clip(z,0,1)*255).astype('uint8');alpha=cv2.imread('/workspace/scratch/finalmasks/'+frame+'.png',0)
 yy,xx=np.where(alpha>0);x0=max(0,int(xx.min())-3);y0=max(0,int(yy.min())-3);x1=min(2400,int(xx.max())+4);y1=min(1600,int(yy.max())+4)
 rgba=np.dstack([rgb,alpha])[y0:y1,x0:x1]
 im=Image.fromarray(rgba,'RGBA');asset='assets/'+sku+'.png';im.save(out/asset,dpi=(300,300),icc_profile=icc,compress_level=6)
 handoff['skus'].append({'sku':sku,'source_frame':src[frame],'asset':asset,'crop_origin_px':[x0,y0]})
 meta[sku]={'frame':frame,'crop':[x0,y0,x1,y1],'size_px':[x1-x0,y1-y0],'mm':[(x1-x0)*25.4/300,(y1-y0)*25.4/300]}
 print(sku,meta[sku]['mm'])
json.dump(handoff,open(out/'handoff.json','w'),indent=2)
json.dump(meta,open('/workspace/scratch/assetmeta.json','w'),indent=2)
PY
OPENBLAS_NUM_THREADS=1 python /workspace/scratch/assets.py