import json,numpy as np
p='/workspace/scratch/edits.json';e=json.load(open(p));s='HH-9395'
q=e[s];q['band']=5
q.setdefault('bg',[]).extend([
[[0,145],[161,145],[161,606],[140,611],[110,626],[80,637],[0,637]],
[[369,145],[460,145],[460,1135],[363,1135],[363,778],[358,672],[376,649],[378,630],[369,613]],
[[188,148],[258,147],[235,175],[207,212],[188,244]],[[278,148],[347,148],[347,270],[335,238],[311,195]]
])
zz=[]
def add(poly,mirror=False):
 zz.append(poly)
 if mirror:zz.append([[510-x,y] for x,y in poly])
add([[138,200],[231,55],[228,115],[218,151],[194,214],[178,226],[166,230],[153,223]],True)
add([[255,153],[316,320],[283,316],[230,316],[199,320]])
add([[104,254],[126,257],[155,271],[143,310],[117,360],[80,431],[78,338]],True)
add([[235,456],[217,444],[202,419],[201,389],[209,367],[229,350],[254,345],[284,352],[305,374],[314,396],[311,422],[297,445],[278,458],[259,438],[255,432],[246,446]])
add([[178,500],[161,483],[137,476],[115,482],[99,499],[93,524],[91,551],[98,576],[116,589],[139,591],[163,580],[181,562],[164,556],[146,544],[157,529],[170,519],[185,511]],True)
add([[239,619],[220,637],[206,660],[202,681],[206,704],[225,723],[253,728],[282,722],[304,704],[313,682],[306,653],[280,620],[274,637],[257,650]])
add([[142,428],[160,397],[164,420],[170,442]],True)
add([[83,604],[112,625],[156,630],[167,660],[170,699],[184,725],[149,705],[118,671],[96,635]],True)
add([[82,682],[109,720],[145,750],[151,766],[123,790],[81,837]],True)
add([[86,900],[111,861],[154,822],[170,803],[191,813],[215,822],[228,832],[241,837],[255,840],[271,837],[283,822],[313,811],[340,802],[365,821],[398,855],[421,901],[368,886],[327,869],[317,871],[305,903],[280,912],[251,938],[226,914],[209,901],[192,869],[182,870],[144,888],[110,895]])
add([[84,988],[106,950],[132,928],[154,916],[160,941],[180,947],[192,952],[211,972],[225,1007],[213,1015],[187,1023],[161,1044],[144,1061],[127,1039],[106,1019],[82,1003]],True)
add([[177,1084],[192,1064],[225,1046],[227,1254],[178,1254],[186,1228],[189,1202],[175,1172],[170,1150],[172,1115]],True)
for pp in zz:q['bg'].append([[round(x/3+180),round(y/3+175)] for x,y in pp])
json.dump(e,open(p,'w'),indent=2)
import cv2,numpy as np,json,tifffile,sys
from scipy import ndimage as ndi
from PIL import Image
from pathlib import Path
cv2.setNumThreads(2)
edits=json.load(open('/workspace/scratch/edits.json'));boxes=json.load(open('/workspace/scratch/detailboxes.json'));sources=json.load(open('/workspace/scratch/sources.json'))
Path('/workspace/scratch/refined').mkdir(exist_ok=True)
for s in sys.argv[1:] or list(edits):
 a=tifffile.imread('/workspace/input/'+sources[s]).astype('float32')/65535
 m=cv2.imread('/workspace/scratch/hard/'+s+'.png',0)
 if m is None:m=cv2.imread('/workspace/scratch/auto/'+s+'.png',0)
 e=edits[s];x,y,_,_=boxes[s]
 if 'replace' in e:
  m[:]=0;cv2.fillPoly(m,[np.array(e['replace'],dtype='int32')+[x,y]],255)
 for line,width in e.get('lines',[]):cv2.polylines(m,[np.array(line,dtype='int32')+[x,y]],False,255,width)
 if 'bottom' in e:m[y+e['bottom']:]=0
 for key,col in [('bg',0),('fg',255)]:
  for poly in e.get(key,[]):
   p=np.array(poly,dtype='int32')+[x,y];cv2.fillPoly(m,[p],col)
 if e.get('fillholes'):m=ndi.binary_fill_holes(m>127).astype('uint8')*255
 if e.get('solid_small'):
  n,lab,stats,ctr=cv2.connectedComponentsWithStats((m<128).astype('uint8'),8)
  for k in range(1,n):
   if stats[k,4]<e['solid_small']:m[lab==k]=255
 # Snap boundaries to original RGB edges in a limited 3 px band
 di=ndi.distance_transform_edt(m>127);do=ndi.distance_transform_edt(m<128)
 gc=np.where(m>127,3,2).astype('uint8');gc[di>e.get('band',3)]=1;gc[do>e.get('band',3)]=0
 cv2.grabCut((a*255).astype('uint8'),gc,None,np.zeros((1,65)),np.zeros((1,65)),2,cv2.GC_INIT_WITH_MASK)
 m=np.isin(gc,[1,3]).astype('uint8')*255
 cv2.imwrite('/workspace/scratch/refined/'+s+'.png',m)
 comp=a*(m[:,:,None]/255)+np.array([.15,.4,.45])*(1-m[:,:,None]/255)
 Image.fromarray(np.rint(comp*255).astype('uint8')).crop(tuple(boxes[s])).save('/workspace/scratch/refined/'+s+'_detail.jpg')
 print(s,flush=True)
{
  "bottom": 1068,
  "bg": [
    [
      [
        209,
        519
      ],
      [
        224,
        529
      ],
      [
        224,
        688
      ],
      [
        209,
        688
      ]
    ],
    [
      [
        240,
        584
      ],
      [
        256,
        582
      ],
      [
        256,
        689
      ],
      [
        240,
        688
      ]
    ],
    [
      [
        273,
        523
      ],
      [
        284,
        532
      ],
      [
        291,
        576
      ],
      [
        293,
        687
      ],
      [
        273,
        687
      ]
    ],
    [
      [
        308,
        584
      ],
      [
        322,
        582
      ],
      [
        322,
        688
      ],
      [
        307,
        688
      ]
    ],
    [
      [
        190,
        711
      ],
      [
        321,
        716
      ],
      [
        320,
        733
      ],
      [
        190,
        731
      ]
    ],
    [
      [
        123,
        839
      ],
      [
        133,
        829
      ],
      [
        151,
        831
      ],
      [
        160,
        844
      ],
      [
        160,
        938
      ],
      [
        132,
        965
      ],
      [
        124,
        968
      ]
    ],
    [
      [
        192,
        851
      ],
      [
        207,
        852
      ],
      [
        215,
        847
      ],
      [
        228,
        840
      ],
      [
        249,
        839
      ],
      [
        266,
        852
      ],
      [
        276,
        848
      ],
      [
        290,
        839
      ],
      [
        304,
        843
      ],
      [
        315,
        854
      ],
      [
        316,
        925
      ],
      [
        192,
        936
      ]
    ],
    [
      [
        191,
        960
      ],
      [
        316,
        975
      ],
      [
        317,
        1014
      ],
      [
        128,
        1009
      ]
    ],
    [
      [
        120,
        1047
      ],
      [
        320,
        1057
      ],
      [
        320,
        1110
      ],
      [
        117,
        1110
      ]
    ],
    [
      [
        0,
        145
      ],
      [
        161,
        145
      ],
      [
        161,
        606
      ],
      [
        140,
        611
      ],
      [
        110,
        626
      ],
      [
        80,
        637
      ],
      [
        0,
        637
      ]
    ],
    [
      [
        369,
        145
      ],
      [
        460,
        145
      ],
      [
        460,
        1135
      ],
      [
        363,
        1135
      ],
      [
        363,
        778
      ],
      [
        358,
        672
      ],
      [
        376,
        649
      ],
      [
        378,
        630
      ],
      [
        369,
        613
      ]
    ],
    [
      [
        188,
        148
      ],
      [
        258,
        147
      ],
      [
        235,
        175
      ],
      [
        207,
        212
      ],
      [
        188,
        244
      ]
    ],
    [
      [
        278,
        148
      ],
      [
        347,
        148
      ],
      [
        347,
        270
      ],
      [
        335,
        238
      ],
      [
        311,
        195
      ]
    ],
    [
      [
        226,
        242
      ],
      [
        257,
        193
      ],
      [
        256,
        213
      ],
      [
        253,
        225
      ],
      [
        245,
        246
      ],
      [
        239,
        250
      ],
      [
        235,
        252
      ],
      [
        231,
        249
      ]
    ],
    [
      [
        304,
        242
      ],
      [
        273,
        193
      ],
      [
        274,
        213
      ],
      [
        277,
        225
      ],
      [
        285,
        246
      ],
      [
        291,
        250
      ],
      [
        295,
        252
      ],
      [
        299,
        249
      ]
    ],
    [
      [
        265,
        226
      ],
      [
        285,
        282
      ],
      [
        274,
        280
      ],
      [
        257,
        280
      ],
      [
        246,
        282
      ]
    ],
    [
      [
        215,
        260
      ],
      [
        222,
        261
      ],
      [
        232,
        265
      ],
      [
        228,
        278
      ],
      [
        219,
        295
      ],
      [
        207,
        319
      ],
      [
        206,
        288
      ]
    ],
    [
      [
        315,
        260
      ],
      [
        308,
        261
      ],
      [
        298,
        265
      ],
      [
        302,
        278
      ],
      [
        311,
        295
      ],
      [
        323,
        319
      ],
      [
        324,
        288
      ]
    ],
    [
      [
        258,
        327
      ],
      [
        252,
        323
      ],
      [
        247,
        315
      ],
      [
        247,
        305
      ],
      [
        250,
        297
      ],
      [
        256,
        292
      ],
      [
        265,
        290
      ],
      [
        275,
        292
      ],
      [
        282,
        300
      ],
      [
        285,
        307
      ],
      [
        284,
        316
      ],
      [
        279,
        323
      ],
      [
        273,
        328
      ],
      [
        266,
        321
      ],
      [
        265,
        319
      ],
      [
        262,
        324
      ]
    ],
    [
      [
        239,
        342
      ],
      [
        234,
        336
      ],
      [
        226,
        334
      ],
      [
        218,
        336
      ],
      [
        213,
        341
      ],
      [
        211,
        350
      ],
      [
        210,
        359
      ],
      [
        213,
        367
      ],
      [
        219,
        371
      ],
      [
        226,
        372
      ],
      [
        234,
        368
      ],
      [
        240,
        362
      ],
      [
        235,
        360
      ],
      [
        229,
        356
      ],
      [
        232,
        351
      ],
      [
        237,
        348
      ],
      [
        242,
        345
      ]
    ],
    [
      [
        291,
        342
      ],
      [
        296,
        336
      ],
      [
        304,
        334
      ],
      [
        312,
        336
      ],
      [
        317,
        341
      ],
      [
        319,
        350
      ],
      [
        320,
        359
      ],
      [
        317,
        367
      ],
      [
        311,
        371
      ],
      [
        304,
        372
      ],
      [
        296,
        368
      ],
      [
        290,
        362
      ],
      [
        295,
        360
      ],
      [
        301,
        356
      ],
      [
        298,
        351
      ],
      [
        293,
        348
      ],
      [
        288,
        345
      ]
    ],
    [
      [
        260,
        381
      ],
      [
        253,
        387
      ],
      [
        249,
        395
      ],
      [
        247,
        402
      ],
      [
        249,
        410
      ],
      [
        255,
        416
      ],
      [
        264,
        418
      ],
      [
        274,
        416
      ],
      [
        281,
        410
      ],
      [
        284,
        402
      ],
      [
        282,
        393
      ],
      [
        273,
        382
      ],
      [
        271,
        387
      ],
      [
        266,
        392
      ]
    ],
    [
      [
        227,
        318
      ],
      [
        233,
        307
      ],
      [
        235,
        315
      ],
      [
        237,
        322
      ]
    ],
    [
      [
        303,
        318
      ],
      [
        297,
        307
      ],
      [
        295,
        315
      ],
      [
        293,
        322
      ]
    ],
    [
      [
        208,
        376
      ],
      [
        217,
        383
      ],
      [
        232,
        385
      ],
      [
        236,
        395
      ],
      [
        237,
        408
      ],
      [
        241,
        417
      ],
      [
        230,
        410
      ],
      [
        219,
        399
      ],
      [
        212,
        387
      ]
    ],
    [
      [
        322,
        376
      ],
      [
        313,
        383
      ],
      [
        298,
        385
      ],
      [
        294,
        395
      ],
      [
        293,
        408
      ],
      [
        289,
        417
      ],
      [
        300,
        410
      ],
      [
        311,
        399
      ],
      [
        318,
        387
      ]
    ],
    [
      [
        207,
        402
      ],
      [
        216,
        415
      ],
      [
        228,
        425
      ],
      [
        230,
        430
      ],
      [
        221,
        438
      ],
      [
        207,
        454
      ]
    ],
    [
      [
        323,
        402
      ],
      [
        314,
        415
      ],
      [
        302,
        425
      ],
      [
        300,
        430
      ],
      [
        309,
        438
      ],
      [
        323,
        454
      ]
    ],
    [
      [
        209,
        475
      ],
      [
        217,
        462
      ],
      [
        231,
        449
      ],
      [
        237,
        443
      ],
      [
        244,
        446
      ],
      [
        252,
        449
      ],
      [
        256,
        452
      ],
      [
        260,
        454
      ],
      [
        265,
        455
      ],
      [
        270,
        454
      ],
      [
        274,
        449
      ],
      [
        284,
        445
      ],
      [
        293,
        442
      ],
      [
        302,
        449
      ],
      [
        313,
        460
      ],
      [
        320,
        475
      ],
      [
        303,
        470
      ],
      [
        289,
        465
      ],
      [
        286,
        465
      ],
      [
        282,
        476
      ],
      [
        273,
        479
      ],
      [
        264,
        488
      ],
      [
        255,
        480
      ],
      [
        250,
        475
      ],
      [
        244,
        465
      ],
      [
        241,
        465
      ],
      [
        228,
        471
      ],
      [
        217,
        473
      ]
    ],
    [
      [
        208,
        504
      ],
      [
        215,
        492
      ],
      [
        224,
        484
      ],
      [
        231,
        480
      ],
      [
        233,
        489
      ],
      [
        240,
        491
      ],
      [
        244,
        492
      ],
      [
        250,
        499
      ],
      [
        255,
        511
      ],
      [
        251,
        513
      ],
      [
        242,
        516
      ],
      [
        234,
        523
      ],
      [
        228,
        529
      ],
      [
        222,
        521
      ],
      [
        215,
        515
      ],
      [
        207,
        509
      ]
    ],
    [
      [
        322,
        504
      ],
      [
        315,
        492
      ],
      [
        306,
        484
      ],
      [
        299,
        480
      ],
      [
        297,
        489
      ],
      [
        290,
        491
      ],
      [
        286,
        492
      ],
      [
        280,
        499
      ],
      [
        275,
        511
      ],
      [
        279,
        513
      ],
      [
        288,
        516
      ],
      [
        296,
        523
      ],
      [
        302,
        529
      ],
      [
        308,
        521
      ],
      [
        315,
        515
      ],
      [
        323,
        509
      ]
    ],
    [
      [
        239,
        536
      ],
      [
        244,
        530
      ],
      [
        255,
        524
      ],
      [
        256,
        593
      ],
      [
        239,
        593
      ],
      [
        242,
        584
      ],
      [
        243,
        576
      ],
      [
        238,
        566
      ],
      [
        237,
        558
      ],
      [
        237,
        547
      ]
    ],
    [
      [
        291,
        536
      ],
      [
        286,
        530
      ],
      [
        275,
        524
      ],
      [
        274,
        593
      ],
      [
        291,
        593
      ],
      [
        288,
        584
      ],
      [
        287,
        576
      ],
      [
        292,
        566
      ],
      [
        293,
        558
      ],
      [
        293,
        547
      ]
    ],
    [
      [
        267,
        145
      ],
      [
        347,
        145
      ],
      [
        347,
        288
      ],
      [
        338,
        256
      ],
      [
        322,
        228
      ],
      [
        304,
        201
      ],
      [
        288,
        177
      ],
      [
        275,
        158
      ]
    ],
    [
      [
        264,
        146
      ],
      [
        188,
        146
      ],
      [
        188,
        280
      ],
      [
        208,
        243
      ],
      [
        226,
        212
      ],
      [
        247,
        177
      ]
    ],
    [
      [
        306,
        541
      ],
      [
        310,
        534
      ],
      [
        320,
        529
      ],
      [
        322,
        576
      ],
      [
        306,
        576
      ]
    ],
    [
      [
        121,
        665
      ],
      [
        134,
        637
      ],
      [
        153,
        627
      ],
      [
        153,
        746
      ],
      [
        119,
        767
      ],
      [
        123,
        729
      ]
    ]
  ],
  "solid_small": 30,
  "band": 5
}
