边缘融合头发损伤:整图处理时头发下颌线接缝伪影修复
症状
整图处理(不带 --has_aligned)时:
- 修复脸和原图背景之间有一圈不自然的接缝
- 头发边缘出现毛躁、缺失或多出来一缕
- 下颌线周围有"贴图感"
- 修复脸周围出现轻微的色偏
根本原因
CodeFormer 整图处理的流程是:
整图 → 检测人脸 → 裁脸 → 修脸(512×512) → 粘贴回原图
粘贴时用了 back projection 融合算法,但以下情况容易伪影:
- 头发边缘不是清晰边缘(碎发、卷发、头发和背景颜色接近)
- 人脸检测框不准确(框到了部分头发或漏掉了部分脸型)
- 原图 JPEG artifact 严重(artifact 干扰融合算法)
- 修复脸和背景的分辨率差太大(不开 Real-ESRGAN 背景增强时)
修复方案一:开 --bg_upsampler realesrgan(最推荐)
python inference_codeformer.py -w 0.7 \
--bg_upsampler realesrgan --face_upsample \
photo.jpg
Real-ESRGAN 会同时增强背景区域,让修复脸和背景的分辨率差变小,融合自然。这是最根本的解决方案——消除了两阶段融合的"分辨率差"根因。
修复方案二:增大 w 值
python inference_codeformer.py -w 0.9 photo.jpg
w 大时 CodeFormer 保留更多原图特征——包括头发细节、下颌线轮廓等——这些特征和原图背景更一致,融合更自然。
代价:清晰度可能稍降(但比伪影好)。
修复方案三:手动裁脸 + 自己贴回
如果 CodeFormer 的自动融合怎么都不满意,可以:
第一步:只用 --has_aligned 修脸
python scripts/crop_align_face.py -i photo.jpg -o face.png
python inference_codeformer.py -w 0.8 --has_aligned face.png
# 得到干净的修复脸
第二步:手动合成
用 Photoshop / GIMP:
- 打开原图和修复脸
- 把修复脸图层放到原图上
- 用柔化边缘的橡皮擦擦修复脸的边缘
- 头发区域可以用仿制图章工具从原图里"借"头发细节
- 调色 / 模糊让接缝消失
这是最精细的方法,但需要手动操作。
修复方案四:用专门的融合工具
如果你有很多图需要处理、又不想手动,可以试试:
- CodeFormer 自带的
face_merge参数(某些版本支持) - Pillow / OpenCV 代码做泊松融合(Poisson Blending)
- LaMa inpainting 修接缝:先手动 mask 住接缝区域,用 LaMa 让模型自动填自然过渡
泊松融合代码示例(OpenCV):
import cv2
import numpy as np
# 原图和修复脸
src = cv2.imread('result_codeformer.jpg') # 整图(修复后)
dst = cv2.imread('original.jpg') # 原图
mask = cv2.imread('face_mask.png', cv2.IMREAD_GRAYSCALE) # 人脸 mask(白色区域)
# 找 mask 中心
center = (mask.shape[1]//2, mask.shape[0]//2)
# 泊松融合
result = cv2.seamlessClone(src, dst, mask, center, cv2.NORMAL_CLONE)
cv2.imwrite('result_seamless.jpg', result)
不同部位的伪影对策
| 部位 | 常见伪影 | 对策 |
|---|---|---|
| 头发边缘 | 碎发缺失、毛躁 | 开 Real-ESRGAN 背景 + 手动修;或用 inpainting 只修头发区域 |
| 下颌线 | 贴图感 | 增大 w 值 + 开 Real-ESRGAN |
| 耳朵 | 耳朵边缘多出或缺失 | 增大 w 值(耳朵保留原图特征) |
| 颈部 | 颈部颜色和脸不一致 | 开 Real-ESRGAN 整图增强 |
| 背景有文字 | 文字被 Real-ESRGAN 修坏 | 不开背景增强;或手动 mask 住文字区域 |
什么时候换对齐模式
如果你的照片只需要修脸(不在乎背景),直接用 --has_aligned 模式:
python scripts/crop_align_face.py -i photo.jpg -o face.png
python inference_codeformer.py -w 0.8 --has_aligned face.png
# 输出只有人脸,没有融合问题
这对于:
- 头像裁切(裁出头像就行,不需要整图)
- 证件照(只留脸和肩部)
- 社交媒体头像(正方形裁切)
是最干净的解决方案——根本没有融合问题,因为你压根没把脸贴回去。
一句话总结
边缘融合伪影的根因是"两阶段方法的分辨率差和特征差"。解决优先级:
- 开 Real-ESRGAN 背景增强(消除分辨率差)
- 增大 w 值(保留更多原图特征让融合自然)
- 只修脸不整图(根本不融合)
- 手动合成(最精细但费时间)