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) med = np.median(lab[mb > 0], axis=0) n, lab_c, stats, _ = cv2.connectedComponentsWithStats(defect, connectivity=8) print(f"== {name} med={med.round(1)}") for i in range(1, n): area = stats[i, cv2.CC_STAT_AREA] if area < 5000: continue comp = lab_c == i px = lab[comp] dE = np.linalg.norm(px.mean(axis=0) - med) dab = np.linalg.norm(px[:, 1:].mean(axis=0) - med[1:]) dL = abs(px[:, 0].mean() - med[0]) print(f" defekt {i}: area={100*area/mb.size:.2f}% dE={dE:.1f} dAB={dab:.1f} dL={dL:.1f} bbox=({stats[i,0]},{stats[i,1]},{stats[i,2]}x{stats[i,3]})")