cat > /workspace/scratch/chandelierfix.py <<'PY'
import sys
sys.path.insert(0,'/workspace/scratch')
from localfixes import fix,boxes,src
import cv2,numpy as np
from PIL import Image
s='HH-3315';fix(s,[[[897,685],[942,683],[940,751],[861,750],[853,729],[865,719],[879,710],[890,699]]])
p='/workspace/scratch/finalmasks/'+s+'.png';m=cv2.imread(p,0);ox,oy=boxes[s][:2]
chains=[[[494,402],[491,440],[482,475],[464,518],[443,563],[418,608]],
[[501,403],[497,440],[489,475],[480,509],[468,544],[452,579],[437,608]],
[[404,627],[397,639],[381,657],[366.5,672.3],[348.5,687.5],[331,700.5],[311.75,712.5],[295.25,721.75],[282.75,726.75]],
[[427,622],[421.25,634.75],[403.75,656.75],[389,671.75],[369.5,689.25],[347.5,705],[326.5,717],[305.25,726.25],[282.75,734],[268.25,739]]]
for pts in chains:
 layer=np.zeros(m.shape,'uint8');cv2.polylines(layer,[np.rint((np.array(pts)+[ox,oy])*4).astype('int32')],False,255,2,cv2.LINE_AA,shift=2);m=np.maximum(m,layer)
for x,y,r in [(181,845,6),(237,840,7),(437,849,6),(609,839,7),(753,849,6),(856,843,7)]:
 cv2.circle(m,(ox+x,oy+y),r,255,-1,cv2.LINE_AA)
 # Hanging eye, followed by the narrow drop stem.
 cv2.ellipse(m,(ox+x,oy+y+14),(4,7),0,0,360,255,1,cv2.LINE_AA)
for pts in [[(181,885),(181,925)],[(237,883),(237,925)],[(437,882),(437,924)],[(609,883),(609,927)],[(754,885),(754,926)],[(856,884),(856,926)]]:
 cv2.polylines(m,[np.array(pts,'int32')+[ox,oy]],False,255,3,cv2.LINE_AA)
cv2.imwrite(p,m)
im=Image.open('/workspace/input/'+src[s]);o=Image.new('RGB',im.size,(15,92,138));o.paste(im,(0,0),Image.fromarray(m));o.crop(boxes[s]).save('/workspace/scratch/check_'+s+'.png')
PY
python /workspace/scratch/chandelierfix.py