cat > /workspace/scratch/testseg.py <<'PY'
import cv2,numpy as np,tifffile,json
from scipy import ndimage as ndi
from PIL import Image,ImageDraw
from pathlib import Path
boxes=json.load(open('/workspace/scratch/chartboxes.json'));sources=json.load(open('/workspace/scratch/sources.json'));limits=json.load(open('/workspace/scratch/limits.json'))
Path('/workspace/scratch/seg').mkdir(exist_ok=True)
for s,src in sources.items():
 a=tifffile.imread('/workspace/input/'+src).astype('float32')/65535;b=tifffile.imread('/workspace/input/charts/'+s+'_chart.tif').astype('float32')/65535
 aa=cv2.GaussianBlur(a,(0,0),.6);bb=cv2.GaussianBlur(b,(0,0),.6)
 diff=np.linalg.norm(aa-bb,axis=2)
 mask=(diff>.075).astype('uint8')
 x0,y0,x1,y1=limits[s];reg=np.zeros(mask.shape,'uint8');reg[y0:y1,x0:x1]=1;mask*=reg
 cx0,cy0,cx1,cy1=boxes[s]; mask[cy0-15:cy1+15,cx0-15:cx1+15]=1
 n,lab,stats,ctr=cv2.connectedComponentsWithStats(mask,8);keep=np.where(stats[:,4]>10)[0];keep=keep[keep!=0];mask=np.isin(lab,keep).astype('uint8')
 solid=s in ['HH-1206','HH-2203','HH-2342','HH-5593','HH-7101','HH-9328','HH-9340','HH-9374']
 if solid:mask=ndi.binary_fill_holes(mask).astype('uint8')
 cv2.imwrite('/workspace/scratch/seg/'+s+'.png',mask*255)
 vis=a*.6+np.array([0,0.9,0.8])*mask[:,:,None]*.4
 Image.fromarray((np.clip(vis,0,1)*255).astype('uint8')).resize((1200,800)).save('/workspace/scratch/seg/'+s+'_overlay.jpg')
out=Image.new('RGB',(1600,6*295),'#dddddd');d=ImageDraw.Draw(out)
for i,s in enumerate(sources):
 im=Image.open('/workspace/scratch/seg/'+s+'_overlay.jpg').resize((400,267));x=(i%4)*400;y=(i//4)*295;out.paste(im,(x,y));d.text((x+5,y+267),s,fill='black')
out.save('/workspace/scratch/segcontact.jpg')
PY
OPENBLAS_NUM_THREADS=1 python /workspace/scratch/testseg.py