{
"HH-1206":[[268,254],[276,198],[320,146],[404,119],[550,106],[742,115],[845,145],[898,194],[924,245],[923,347],[917,459],[906,555],[895,600],[860,635],[800,666],[720,687],[609,698],[493,685],[393,660],[321,614],[287,563],[275,462]],
"HH-2203":[[368,157],[393,156],[465,185],[588,226],[769,204],[846,184],[850,235],[841,280],[815,335],[816,481],[838,568],[840,632],[800,665],[715,675],[606,648],[471,629],[398,622],[363,609],[363,560],[378,506],[379,297],[365,231]],
"HH-2342":[[599,90],[698,105],[799,155],[859,218],[899,309],[910,400],[897,494],[862,578],[804,641],[724,683],[634,699],[542,696],[453,668],[381,610],[329,532],[301,460],[290,374],[310,270],[351,201],[416,146],[503,108]],
"HH-5593":[[362,166],[478,130],[566,122],[698,156],[870,181],[891,235],[863,315],[863,407],[850,496],[852,577],[825,611],[762,632],[650,651],[550,651],[464,626],[390,615],[362,582],[351,510],[351,410],[342,330],[335,260],[348,204]],
"HH-7101":[[302,300],[343,264],[399,253],[491,251],[651,300],[780,369],[877,423],[909,455],[906,500],[895,550],[864,597],[803,644],[732,682],[686,690],[649,673],[609,655],[556,647],[478,609],[411,575],[345,529],[310,493],[302,423]],
"HH-7158":[[277,149],[400,119],[475,116],[657,139],[776,164],[904,230],[935,299],[925,367],[882,436],[830,482],[815,524],[813,602],[790,626],[753,626],[722,597],[710,523],[631,531],[570,520],[575,548],[561,569],[532,565],[510,550],[490,510],[451,499],[447,559],[429,630],[406,661],[386,661],[364,643],[359,608],[373,545],[375,486],[315,445],[268,402],[245,361],[235,310],[245,233]],
"HH-9328":[[290,153],[388,151],[530,171],[599,190],[685,166],[833,149],[874,146],[906,196],[918,268],[883,327],[859,392],[849,469],[863,582],[848,642],[813,661],[722,679],[557,673],[441,664],[331,641],[320,604],[331,552],[345,484],[346,407],[331,333],[303,280],[285,210]],
"HH-9340":[[359,146],[437,157],[541,174],[601,192],[682,179],[763,173],[820,175],[826,216],[854,258],[866,292],[841,360],[833,408],[840,538],[835,602],[839,646],[800,660],[698,664],[602,645],[509,635],[420,610],[373,595],[369,559],[378,504],[368,432],[365,365],[345,292],[337,223],[331,179]],
"HH-9374":[[345,353],[414,335],[478,321],[565,316],[656,317],[765,329],[844,351],[870,373],[872,402],[852,442],[809,462],[735,477],[648,489],[537,491],[440,477],[371,458],[341,445],[323,413],[315,383]]
}
{
  "HH-1041": {
    "bottom": 1038,
    "solid_small": 200,
    "fg": [
      [
        [
          139,
          380
        ],
        [
          149,
          368
        ],
        [
          182,
          359
        ],
        [
          223,
          356
        ],
        [
          274,
          359
        ],
        [
          303,
          368
        ],
        [
          313,
          377
        ],
        [
          317,
          383
        ],
        [
          295,
          387
        ],
        [
          167,
          387
        ]
      ],
      [
        [
          163,
          625
        ],
        [
          188,
          620
        ],
        [
          233,
          617
        ],
        [
          273,
          620
        ],
        [
          309,
          629
        ],
        [
          327,
          651
        ],
        [
          340,
          681
        ],
        [
          346,
          710
        ],
import cv2,numpy as np,tifffile,json,sys
from scipy import ndimage as ndi
from PIL import Image
from pathlib import Path
cv2.setNumThreads(2)
sources=json.load(open('/workspace/scratch/sources.json'));boxes=json.load(open('/workspace/scratch/chartboxes.json'))
Path('/workspace/scratch/auto').mkdir(exist_ok=True)
for s in sys.argv[1:] or ['HH-1206','HH-2203','HH-2342','HH-5593','HH-7101','HH-9328','HH-9340','HH-9374']:
 a=tifffile.imread('/workspace/input/'+sources[s]).astype('float32')/65535;b=tifffile.imread('/workspace/input/charts/'+s+'_chart.tif').astype('float32')/65535
 aa=cv2.GaussianBlur(a,(0,0),1);bb=cv2.GaussianBlur(b,(0,0),1)
 rat=(aa*bb).sum(2)/(bb*bb).sum(2)
 chroma=np.linalg.norm(aa-bb*np.minimum(rat,1)[:,:,None],axis=2)
 mask=chroma>.035
 cx0,cy0,cx1,cy1=boxes[s];mask[cy0-15:cy1+15,cx0-15:cx1+15]=1
 mask[:100]=0;mask[1500:]=0;mask[:,:250]=0;mask[:,2150:]=0
 n,lab,stats,ctr=cv2.connectedComponentsWithStats(mask.astype('uint8'),8);mask=lab==1+np.argmax(stats[1:,4]);mask=ndi.binary_fill_holes(mask)
 # keep seed original for inspect
 cv2.imwrite('/workspace/scratch/auto/'+s+'_seed.png',mask.astype('uint8')*255)
 disti=ndi.distance_transform_edt(mask);disto=ndi.distance_transform_edt(~mask)
 gc=np.where(mask,3,2).astype('uint8');gc[disti>40]=1;gc[disto>35]=0
 cv2.grabCut((a*255).astype('uint8'),gc,None,np.zeros((1,65)),np.zeros((1,65)),4,cv2.GC_INIT_WITH_MASK)
 mask=np.isin(gc,[1,3]);mask=ndi.binary_fill_holes(mask)
 cv2.imwrite('/workspace/scratch/auto/'+s+'.png',mask.astype('uint8')*255)
 comp=a*mask[:,:,None]+np.array([.1,.24,.37])*(1-mask[:,:,None])
 Image.fromarray(np.rint(np.clip(comp,0,1)*255).astype('uint8')).resize((1200,800)).save('/workspace/scratch/auto/'+s+'.jpg')
 print(s,flush=True)
