图片去红章
自动检测并去除图片中的红色印章,保留文字内容。基于 OpenCV 的红色通道分离与图像修复算法。
适用场景
- 证件、证书上的红色印章去除
- 文档扫描件中的红色公章清除
- 表格、合同中的红色印记消除
- 批量处理大量含红章图片
工作流程
1. 确认文件存在
ls -la "<图片路径>"
Windows 路径转换:E:\... → /mnt/e/...
2. 自动分析印章类型(必须先执行)
cd <项目目录> && python remove_red_seal.py --sample "<图片路径>"
分析印章特征,自动保存最优参数到 ~/.hermes/seal_params.json。
3. 去除印章
python remove_red_seal.py "<输入>" "<输出>"
输出文件命名:在原扩展名前加 _cleaned,如 图片_cleaned.jpg。
4. 确认结果
ls -la "<输出文件>"
印章类型与参数覆盖
自动检测不理想时手动指定:
| 类型 | 特征 | 参数 |
|---|---|---|
| 大面积淡色印章 | 半透明、区域大、颜色淡 | 默认,或 -b 6.0 -m 1.3 |
| 细笔划鲜红印章 | 印章文字、细线、鲜红色 | -e 2 -k 3 -c 1 -m 1.3 |
| 极淡印章 | 几乎看不清、残留多 | -r 2 -c 1 -b 6.0 |
| 暗红色印章 | 深红、与文字颜色接近 | -r 8 -d 50 -b 4.0 |
命令行参数
| 参数 | 默认值 | 说明 |
|---|---|---|
-r, --red-threshold |
5 | 红色检测阈值(越小越激进,检测更多红色) |
-d, --dark-threshold |
60 | 深色保护阈值(保护黑色文字不被处理) |
-c, --morph-close |
3 | 闭运算迭代次数(连接红色碎片,0=跳过) |
-e, --morph-dilate |
0 | 膨胀迭代次数(扩展红色区域) |
-k, --kernel-size |
5 | 形态学核大小 |
-f, --feather |
7 | 边缘羽化半径(平滑过渡) |
-b, --boost-cap |
5.0 | 亮度补偿上限(越大替换区域越白) |
-m, --boost-mid |
1.2 | 中灰增强倍率(1.0=不增强) |
-s, --sample IMAGE |
— | 自动分析样本,保存最优参数 |
-a, --analyze |
— | 仅分析,不保存参数 |
-D, --dir DIR |
— | 批量处理目录下所有图片 |
-O, --output-dir DIR |
— | 批量输出目录(保留子目录结构) |
批量处理
python remove_red_seal.py --dir "<输入目录>" --output-dir "<输出目录>"
递归处理所有图片,输出保留子目录结构。
算法原理
- 红色检测:
R - max(G, B) > threshold生成红色掩码 - 形态学处理:闭运算 + 膨胀,连接分散的红色碎片
- 羽化:高斯模糊平滑边缘
- 文字保护:深色像素排除在替换区域外
- 重建:G 通道 + 亮度补偿替换印章区域
- 混合:
(1-blend)*原图 + blend*重建图
依赖
- Python 3.10+
- numpy
- opencv-python-headless
pip install numpy opencv-python-headless
# 或
uv add numpy opencv-python-headless
注意事项
- 输出路径是位置参数,不是
-o选项 - 必须先
--sample自动分析,再执行去除 - Windows 路径在 WSL 下需转为
/mnt/盘符/... - 印章与文字重叠区域修复效果取决于颜色分离程度
- 首次运行建议先用单张图片测试,满意后再批量处理