import sys, os sys.path.insert(0, os.path.join(os.path.dirname(__file__), "..", "services", "recolor")) import numpy as np import cv2 from PIL import Image from fabric_recolor.masks import _silhouette_bands from fabric_recolor.labcolor import rgb_to_lab for name, mp, kp in [ ("detail", "data/media/assets/20/20282cb1bd8a58596050b99b9f29e079145a7bcc45ea46b8523ae2389801fbdc.png", "data/media/assets/20/20282cb1bd8a58596050b99b9f29e079145a7bcc45ea46b8523ae2389801fbdc.mask.png"), ("packshot_front", "data/media/assets/79/7987376a67865864247263e5028a83950a2fd900740bbe339fab1ff8e6b3fbb2.png", "data/media/assets/79/7987376a67865864247263e5028a83950a2fd900740bbe339fab1ff8e6b3fbb2.mask.png"), ("hero", "data/media/assets/f0/f06282d9ba621d137d7c978cf931792ffbcb6b5c9764cf94e964f83ded13ddcf.png", "data/media/assets/f0/f06282d9ba621d137d7c978cf931792ffbcb6b5c9764cf94e964f83ded13ddcf.mask.png"), ]: rgb = np.asarray(Image.open(mp).convert("RGB"), dtype=np.uint8) mask = np.asarray(Image.open(kp).convert("L"), dtype=np.uint8) if mask.shape != rgb.shape[:2]: mask = cv2.resize(mask, (rgb.shape[1], rgb.shape[0]), interpolation=cv2.INTER_NEAREST) mb = (mask > 128).astype(np.uint8) band, defect = _silhouette_bands(mb, 6) lab = rgb_to_lab(rgb) inside = lab[mb > 0] med = np.median(inside, axis=0) n, lab_c, stats, cents = cv2.connectedComponentsWithStats(defect, connectivity=8) print(f"== {name}: defect komponenty {n-1}") for i in range(1, n): area = stats[i, cv2.CC_STAT_AREA] if area < 200: continue comp = lab_c == i dl = np.linalg.norm(lab[comp].mean(axis=0) - med) # czy komponent dotyka krawedzi kadru? ys, xs = np.nonzero(comp) edge = xs.min() == 0 or xs.max() == comp.shape[1] - 1 or ys.min() == 0 or ys.max() == comp.shape[0] - 1 print(f" defekt {i}: area={area} ({100*area/mb.size:.2f}%), dE={dl:.1f}, krawedz={edge}, bbox=({stats[i,0]},{stats[i,1]},{stats[i,2]}x{stats[i,3]})")