我平时会遇到一些合同、扫描件、截图,里面带圆形红章。我想做的事情很简单,就是把红章单独提出来,直接保存成透明背景 PNG,后面不管是归档、比对,还是继续做 OCR,都方便一点。
这个仓库就是我自己整理的一版 Python 脚本。
它做的事情也很直接:
- 先把图片里的红色区域筛出来
- 再去找圆形章的位置
- 最后按圆裁出来,输出单独的 PNG
仓库里放了一组样例图,我直接把结果放在这里:
原图: examples/input/sample-document.png
提取结果: examples/output/stamp_1.png
pip install -r requirements.txt如果我想把它当成一个单独项目直接装,也可以:
pip install .最简单的用法:
python3 stampcut.py input.png -o stamps如果我想保留章本身的颜色深浅,不把它重绘成统一纯红,可以这样跑:
python3 stampcut.py input.png -o stamps --preserve-source-color默认输出文件会长这样:
stamps/stamp_1.png
stamps/stamp_2.png
...
from stampcut import extract_from_image, write_stamps
stamps = extract_from_image("input.png", preserve_source_color=True)
write_stamps(stamps, "stamps")返回值是一个列表,里面每一项都是 RGBA 图片数据。
我单独放了一个适合 Jupyter 用的批处理脚本:
stampcut_batch_jupyter.py
我一般就是直接改脚本顶部这几个配置:
INPUT_DIR = "input_images"
OUTPUT_DIR = "output_stamps"
RECURSIVE = False
OUTPUT_NAME_TEMPLATE = "{stem}-{index}.png"这里的 OUTPUT_NAME_TEMPLATE 就是输出命名规则。
默认是:
图片文件名-1.png
图片文件名-2.png
比如:
contract.png
如果识别出两个章,输出就是:
contract-1.png
contract-2.png
如果我想改命名,也可以直接改模板,比如:
OUTPUT_NAME_TEMPLATE = "seal-{stem}-{index}.png"那输出就会变成:
seal-contract-1.png
seal-contract-2.png
在 Jupyter 里我就直接这样跑:
%run stampcut_batch_jupyter.py也可以导入函数:
from stampcut_batch_jupyter import extract_directory
extract_directory(
input_dir="input_images",
output_dir="output_stamps",
recursive=False,
output_name_template="{stem}-{index}.png",
)这套脚本本身没有绕太多弯,流程就是:
读取图片
-> 转 HSV
-> 按红色范围生成 mask
-> 提出红章区域
-> 转灰度并做高斯模糊
-> HoughCircles 找圆
-> 按圆心和半径裁成透明 PNG
| 参数 | 默认值 | 说明 |
|---|---|---|
--color |
#ff0000 |
目标颜色 |
--hue-range |
10 |
色相容差 |
--min-saturation |
50 |
最低饱和度 |
--min-value |
50 |
最低亮度 |
--preserve-source-color |
关闭 | 保留原章本身颜色 |
--blur-kernel-size |
5 |
圆检测前的模糊核大小 |
--blur-sigma |
2.0 |
模糊 sigma |
--scale-factor |
1.2 |
裁剪时半径放大倍数 |
--hough-param1 |
200 |
HoughCircles 参数 1 |
--hough-param2 |
50 |
HoughCircles 参数 2 |
stampcut-py/
stampcut.py
stampcut_batch_jupyter.py
requirements.txt
pyproject.toml
README.md
examples/
input/
output/
preview.png
从文档图片里提取圆形红章,批量裁成透明 PNG。
