# Image Recolor Transparent

> 图片配色改造+精细透明底：把图表/图片按 PPT 模板色系重映射（红→橙、灰黑→蓝灰 68,84,106），并精细抠掉白底（含封闭白区、文字镂空），羽化去白边，双底色预览验收。触发词：改配色 透明底、按模板色系修改图片、抠白底 透明、图片改色 蓝灰 橙、recolor transparent

- Skill: `jim4546/image-recolor-transparent` (Agent Skill, multi-file: 2 files)
- Install (CLI): `npx skillmds@latest add jim4546/image-recolor-transparent`
- Raw SKILL.md: https://api.skillmd.com/api/skills/jim4546/image-recolor-transparent/raw
- Safety review: pending
- Works with: Claude Code, Claude.ai, OpenAI Codex
- Category: Coding & Dev Tools
- Author: Jim4546 (https://skillmd.com/u/jim4546)
- Updated: 2026-09-17
- Page: https://skillmd.com/skills/jim4546/image-recolor-transparent

---


# 图片配色改造 + 精细透明底

把一张图表/示意图按 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`）。

### 脚本内部逻辑（需要手改时参考）

1. **红→橙**：`sat>18 且 R 明显大于 G、B` 判为红系；保持 V（明度）和 C（饱和度）
   不变，仅把色相设为 ~32°（`new_g = new_b + c*hue/60`）。深浅层级自动保留。
2. **灰黑→蓝灰**：`sat<=18` 判为灰系；按原亮度相对基准色亮度（~84.6）做分段映射：
   更暗→基准色按比例加深，更亮→基准色向白线性过渡。所有黑灰文字一并变蓝灰。
3. **白底→透明（核心难点）**：
   - 近白判定 `lum >= 244`，做连通域标记；
   - 触图片边缘的组件 + 面积 > 4000px 的组件 → 背景（解决洪泛填充进不去的
     **封闭白区**，如圆环内部）；
   - **迭代吸收**：距已知背景 10px 内的白色小连通块并入背景（解决形状相切处的
     白色月牙缝隙、字符镂空如 0/B 的空腔）；
   - 剩余白色组件 = 色块深处的白字，**强制保留不透明**。
4. **羽化 + 去白边**：背景外扩 3px 内、亮度 ≥170 的抗锯齿像素按亮度做渐变 alpha
   （170→不透明，250→透明）；再做颜色去污染 `F = (obs - (1-α)*255) / α`，
   消除深色背景上的白边毛刺。

## 验收（必做）

- 生成**深色底**和**浅色底**两张合成预览图（脚本 `--preview-dir` 自动产出），
  用 Read 工具目视检查：
  1. 深色底上无任何白色残留碎块、月牙、文字镂空白块、白边毛刺；
  2. 色块上的白色文字完整保留、未被误抠；
  3. 配色层级（深浅对比）与原图一致。
- 任一项不过 → 调参数重跑，不要直接交付。

## 关键参数与陷阱

| 参数 | 默认 | 何时调整 |
|---|---|---|
| `--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 项目视检查；用户模板三色系约束
（橙、蓝灰、白）成立。

