老照片修复与上色
修复老照片的划痕、折痕、褪色,并支持为黑白照片自动上色(暖色调)。自动检测划痕与折痕并用 Telea 算法修复,LAB 色彩空间恢复褪色,可选棕褐色暖色上色。
适用场景
- 用户上传老照片(有划痕、折痕、褪色、泛黄),要求修复
- 用户上传黑白照片,要求上色
- 用户说"老照片修复" / "修复老照片" / "照片上色" / "黑白上色" / "restore photo" / "colorize"
- 扫描的旧照片需要去除扫描划痕和折痕
不适用场景
- 现代高清照片的瑕疵修复(请用专业修图软件)
- 需要精确历史还原的彩色照片(本技能上色为风格化暖色调,非精确还原)
- 照片严重破损、大面积缺失(本技能仅修复划痕折痕,不做内容重建)
依赖
运行前需确保 Python 环境已安装 opencv-python-headless 和 numpy:
pip install opencv-python-headless numpy
使用流程
-
接收输入图片 — 接受一张 JPG/PNG 格式的老照片或黑白照片。
-
运行处理脚本:
bash python <skill_dir>/scripts/old_photo_restore.py \ <input.jpg> \ -o <output.jpg> \ [--scratch] \ [--colorize] \ [--strength 0.5]
脚本处理流程:
- 划痕/折痕检测与修复(--scratch):自适应阈值 + 形态学操作提取划痕掩膜,Telea 算法修复
- 褪色恢复:LAB 色彩空间,CLAHE 增强 L 通道,提升 A/B 通道饱和度
- 自动上色(--colorize):直方图均衡化 + 棕褐色暖色调映射,为黑白照片添加自然暖色
-
展示结果 — 用
present_files将输出图片展示给用户查看。 -
质量验证 — 划痕应被修复、褪色应有改善、上色应自然。如用户不满意,可调整:
- 增大--strength(如 0.8):更强的褪色恢复和划痕检测
- 减小--strength(如 0.3):更温和的处理
- 仅修复不上色:去掉--colorize
- 仅上色不修复:去掉--scratch
参数
| 参数 | 默认值 | 说明 |
|---|---|---|
input |
(必填) | 输入图片路径 |
-o, --output |
./restored.jpg |
输出路径 |
--scratch |
关 | 启用划痕/折痕修复 |
--colorize |
关 | 启用自动上色(暖色调) |
--strength |
0.5 |
修复强度 0.0-1.0,控制褪色恢复和划痕检测灵敏度 |
技术要点
- 划痕检测用自适应阈值而非 Canny:Canny 会把所有边缘都标记为划痕,导致 inpaint 覆盖正常纹理。自适应阈值配合形态学开运算,只保留细长的高对比度线条(划痕特征),过滤大面积边缘。
- Telea 算法修复:
cv2.inpaint(TELEA)以快速行进法从掩膜边界向内填充,适合细线划痕的修复,比 NS 算法更快且对窄线条效果更好。 - LAB 空间褪色恢复:老照片褪色表现为 L 通道对比度低、A/B 通道饱和度不足。CLAHE 在 L 通道恢复亮暗对比,对 A/B 通道做增益提升恢复色彩。
- 暖色调上色:将灰度值映射到棕褐色调色板(暗部偏深棕、亮部偏暖白),模拟老照片手工上色的温润效果。先做直方图均衡化拉平灰度分布,再做色调映射,色彩过渡更自然。
- strength 参数统一控制:划痕检测阈值、CLAHE clipLimit、饱和度增益、上色强度全部由 strength 统一缩放,用户只需调一个参数。
常见调参
- 轻度褪色、无划痕:
--strength 0.3(不加--scratch) - 老照片有划痕+褪色:
--scratch --strength 0.5(默认) - 严重划痕+折痕:
--scratch --strength 0.8 - 黑白照片上色:
--colorize --strength 0.6 - 划痕修复 + 上色全套:
--scratch --colorize --strength 0.7
文件结构
old-photo-restore/
├── SKILL.md # 本文件
└── scripts/
└── old_photo_restore.py # 主处理脚本