图片配色改造 + 精细透明底
把一张图表/示意图按 PPT 模板色系重新配色,并把白色背景精细抠成透明。 来源:2026-06-12 对「P4圆环图.png」的处理,经 4 轮迭代验证。
输入
- 必需:源图片路径(PNG/JPG,白底彩色图表效果最佳)
- 可选:目标色相(默认橙 32°)、灰系基准色(默认文字蓝灰 RGB 68,84,106)、输出路径
执行步骤
直接调用本 skill 自带脚本(首选,已封装全部逻辑):
python ~/.claude/skills/image-recolor-transparent/scripts/recolor_transparent.py ^
"<输入图>" "<输出图>" --preview-dir "<临时目录>"
依赖:pillow numpy scipy(缺则 pip install)。
输出文件命名遵循用户全局约定:内容名 + _YYYYMMDD,或在原名后加后缀
(如 xxx_蓝灰橙_透明底.png)。
脚本内部逻辑(需要手改时参考)
- 红→橙:
sat>18 且 R 明显大于 G、B判为红系;保持 V(明度)和 C(饱和度) 不变,仅把色相设为 ~32°(new_g = new_b + c*hue/60)。深浅层级自动保留。 - 灰黑→蓝灰:
sat<=18判为灰系;按原亮度相对基准色亮度(~84.6)做分段映射: 更暗→基准色按比例加深,更亮→基准色向白线性过渡。所有黑灰文字一并变蓝灰。 - 白底→透明(核心难点):
- 近白判定
lum >= 244,做连通域标记; - 触图片边缘的组件 + 面积 > 4000px 的组件 → 背景(解决洪泛填充进不去的 封闭白区,如圆环内部);
- 迭代吸收:距已知背景 10px 内的白色小连通块并入背景(解决形状相切处的 白色月牙缝隙、字符镂空如 0/B 的空腔);
- 剩余白色组件 = 色块深处的白字,强制保留不透明。
- 近白判定
- 羽化 + 去白边:背景外扩 3px 内、亮度 ≥170 的抗锯齿像素按亮度做渐变 alpha
(170→不透明,250→透明);再做颜色去污染
F = (obs - (1-α)*255) / α, 消除深色背景上的白边毛刺。
验收(必做)
- 生成深色底和浅色底两张合成预览图(脚本
--preview-dir自动产出), 用 Read 工具目视检查:- 深色底上无任何白色残留碎块、月牙、文字镂空白块、白边毛刺;
- 色块上的白色文字完整保留、未被误抠;
- 配色层级(深浅对比)与原图一致。
- 任一项不过 → 调参数重跑,不要直接交付。
关键参数与陷阱
| 参数 | 默认 | 何时调整 |
|---|---|---|
--white-thr 近白阈值 |
244 | 图里有大面积浅灰填充(lum 235~243)时不能调低,否则误抠浅色色块;背景偏灰时可降到 238 |
--big-white 大白区面积 |
4000 | 图形内有大块要保留的白色装饰时调大 |
--absorb-px 吸收半径 |
10 | 色块上的白字离色块边缘 < 吸收半径时会被误删 → 调小;缝隙没抠净 → 调大 |
--feather-px 羽化带宽 |
3 | 边缘仍有毛刺时调大到 4-5 |
陷阱:
- 单纯洪泛填充抠不掉封闭白区(圆环内部)——必须用连通域;
- 单纯按面积/连通域会把字符镂空保留成白块——必须加迭代吸收;
- 不做去白边的话浅色预览看不出问题,深色底预览才能暴露白边,验收必须看深色底;
- JPG 源图白底有压缩噪点,阈值需更宽容(白阈值降到 ~240);
- 当前「待替换色」写死为红色系判定,要改蓝/绿等其他色系需给脚本加
--from-hue。
成功标准
输出为 RGBA PNG;深/浅双底色预览均通过上述 3 项目视检查;用户模板三色系约束 (橙、蓝灰、白)成立。