import sys, numpy as np, cv2 sys.path.insert(0, ".") from fabric_recolor import studio as S from fabric_recolor.labcolor import rgb_to_lab from fabric_recolor.segmentation.grounded_sam import GroundedSamSegmenter from PIL import Image rgb = S._load_rgb(sys.argv[1]); a = np.asarray(Image.open(sys.argv[2])).astype(np.float32)/255 sm = (a>=0.5).astype(np.uint8) scale = 1600/max(rgb.shape[:2]); small = cv2.resize(rgb,(round(rgb.shape[1]*scale),round(rgb.shape[0]*scale)),interpolation=cv2.INTER_AREA) sm = cv2.resize(sm,(small.shape[1],small.shape[0]),interpolation=cv2.INTER_NEAREST) g = GroundedSamSegmenter(device=S._device) iso = Image.fromarray(small*sm[...,None]) g._load(); det = g._detect(iso, S.CLUTTER_PROMPTS) print(det.get("text_labels"), det["scores"].cpu().numpy().round(2), det["boxes"].cpu().numpy().round()) lab = rgb_to_lab(small).astype(np.float32); inner = cv2.erode(sm,np.ones((15,15),np.uint8))>0; ref=np.median(lab[inner],axis=0); print("ref", ref) edge = (sm>0)&(cv2.erode(sm,np.ones((5,5),np.uint8))==0) for m,idx in g.negatives_instances(iso, S.CLUTTER_PROMPTS): part = m&(sm>0); d = lab[part].mean(axis=0)-ref if part.any() else None print(S.CLUTTER_PROMPTS[idx], part.sum(), (part&edge).any(), d)