cat > /workspace/scratch/yetifoot.py <<'PY'
import cv2,json,numpy as np,tifffile
from scipy import ndimage as ndi
from PIL import Image
s='HH-7158';b=json.load(open('/workspace/scratch/detailboxes.json'))[s];ox,oy=b[:2];x0=ox+800;y0=oy+830;x1=ox+1300;y1=oy+1180
p='/workspace/scratch/finalmasks/'+s+'.png';al=cv2.imread(p,0).astype('float32')/255;m=al>.5
line=np.array([[175,0],[195,45],[215,100],[230,160],[257,220],[268,267],[310,299],[420,319],[499,295]])
xx=np.interp(np.arange(350),line[:,1][:7],line[:,0][:7])
for y in range(305):m[y0+y,x0:x0+int(xx[y])]=0
# cover dark fibre outlines without bringing the reflected floor back
fg=ndi.distance_transform_edt(m)>20;bg=ndi.distance_transform_edt(~m)>24
_,fi=ndi.distance_transform_edt(~fg,return_indices=True)
a=tifffile.imread('/workspace/input/photos/'+s+'.tif').astype('float32')/65535
F=cv2.GaussianBlur(a,(5,5),1)[fi[0],fi[1]]
B=cv2.morphologyEx(a,cv2.MORPH_CLOSE,np.ones((1,35),np.uint8))
D=F-B;v=np.clip(((a-B)*D).sum(2)/((D*D).sum(2)+1e-5),0,1);v[fg]=1;v[bg]=0;v[v<.035]=0
al[y0:y1,x0:x1]=v[y0:y1,x0:x1]
cv2.imwrite(p,np.rint(al*255).astype('uint8'))
im=Image.open('/workspace/input/photos/'+s+'.tif');o=Image.new('RGB',im.size,(108,125,48));o.paste(im,(0,0),Image.fromarray(np.rint(al*255).astype('uint8')));o.crop((x0,y0,x1,y1)).save('/workspace/scratch/yetifootnew.png')
PY
OPENBLAS_NUM_THREADS=1 python /workspace/scratch/yetifoot.py