cat > /workspace/scratch/rugmatte.py <<'PY'
import cv2,numpy as np,json,tifffile
from scipy import ndimage as ndi
from PIL import Image
cv2.setNumThreads(2)
s='HH-9374';a=tifffile.imread('/workspace/input/photos/'+s+'.tif').astype('float32')/65535;b=tifffile.imread('/workspace/input/charts/'+s+'_chart.tif').astype('float32')/65535
x0,y0,x1,y1=json.load(open('/workspace/scratch/chartboxes.json'))[s];x0-=12;x1+=12;y0-=12;y1+=12
left=np.median(b[y0:y1,x0-20:x0],axis=1);right=np.median(b[y0:y1,x1:x1+20],axis=1)
f=np.linspace(0,1,x1-x0)[None,:,None];b[y0:y1,x0:x1]=left[:,None,:]*(1-f)+right[:,None,:]*f
poly=[[92,284],[120,257],[180,242],[250,219],[310,202],[366,180],[458,174],[541,154],[625,150],[715,148],[787,150],[842,151],[912,159],[982,171],[1049,185],[1117,206],[1175,234],[1220,261],[1236,289],[1233,339],[1207,383],[1160,416],[1086,448],[1000,477],[910,499],[824,517],[720,530],[615,538],[510,535],[410,524],[322,503],[228,479],[165,447],[130,410],[104,366],[101,322]]
m=np.zeros(a.shape[:2],'uint8');cv2.fillPoly(m,[np.array(poly,'int32')+[520,460]],1)
di=ndi.distance_transform_edt(m);do=ndi.distance_transform_edt(1-m);fg=di>22;bg=do>27
_,fi=ndi.distance_transform_edt(~fg,return_indices=True);_,bi=ndi.distance_transform_edt(~bg,return_indices=True)
a=a**2.2;b=b**2.2
ratio=cv2.GaussianBlur(a/(b+.002),(5,5),1)
R=ratio[bi[0],bi[1]];B=b*R
F=cv2.GaussianBlur(a,(5,5),1)[fi[0],fi[1]];D=F-B;al=np.clip(((a-B)*D).sum(2)/((D*D).sum(2)+1e-7),0,1);al[fg]=1;al[bg]=0;al[al<.03]=0
cv2.imwrite('/workspace/scratch/finalmasks/'+s+'.png',np.rint(al*255).astype('uint8'))
im=Image.open('/workspace/input/photos/'+s+'.tif');o=Image.new('RGB',im.size,(171,112,13));o.paste(im,(0,0),Image.fromarray(np.rint(al*255).astype('uint8')));o.crop((520,460,1840,1080)).save('/workspace/scratch/rugnew.png')
PY
OPENBLAS_NUM_THREADS=1 python /workspace/scratch/rugmatte.py