MySkill-Signature

手写签名 → 透明 PNG

签名抠成
透明 PNG

给一张签名照片或截图,出来的是 纯黑笔迹 + 全透明背景。 贴进 Word、PPT、电子合同,不会再带一块白底。

  • 22组真实签名校准
  • 4档自动判参数
  • 0张图片离开本机

附件一授权确认书

本人已阅毕上述条款,理解并同意其全部内容。

本页签字用于电子文档归档,与手写签署具有同等效力。

签署人(签字) 抠出的透明签名叠在文档落款处,周围没有白色方块 2026.10.31
移入看透明 透明 PNG · 真实输出
这枚签名来自的原始纸面 这枚签名来自米芾题名的原纸(左),红章压在笔画上、装裱留下灰影;剥章、提白之后只剩笔迹。 底下的版面是什么色,透上来的就是什么色。

01 / 问题

白底那一块,就是这个技能要解决的问题

同一张落款,贴到有底色的版面上,差别一眼就看出来。 下面两组各用同一块底色:左边是原图直贴,右边是抠完之后 —— 只换了一件事,纸底在不在。

深色版面 PPT 封面 / 深色模板
原纸直接贴在深色版面上,露出一块方形纸片
原图直贴
抠完的落款放在同一块深色版面上,只剩笔迹
透明 PNG
浅色表单 扫描件 / 带格线的表格
原纸贴在带格线的浅色表单上,纸片压住了表格线
原图直贴
抠完的落款放在带格线的浅色表单上,格线从笔迹间穿过
透明 PNG

两组用的都是上一节那张落款,只换了底色。笔迹是纯黑,所以放在什么底色上都成立; 左图的纸片会盖住底下的格线,右图不会。

02 / 判档

不用你调参,它先量再判

动手前先量两件事:背景白度(灰度 p90)和笔迹宽度(等效宽度 w75)。 纯白底的细笔和灰底的粗笔,起手参数本来就不该一样 —— 分档走。下面三个读数都是脚本自己打出来的。

  1. A

    白底粗笔

    一次通过

    高清扫描件、纯白纸、笔迹适中

    A 档结果
    背景白度 p90
    255
    笔宽 w75
    6.00px
    选定参数
    145 / 4.5 / 3
    漏检 miss
    0.00%

    起手参数一次就过,没有触发回退 —— 高清扫描件大多落在这一档。

  2. B

    灰底粗笔

    一次通过

    灰底、低对比度、纸面发暗

    B 档结果
    背景白度 p90
    205
    笔宽 w75
    6.39px
    选定参数
    145 / 7.0 / 4
    漏检 miss
    0.00%

    灰底不提阈值、改加大 dist —— 提阈值会把本来就发暗的笔画削断。

  3. C

    白底细笔

    回退一档

    细笔、中等模糊、纯白底

    C 档结果
    背景白度 p90
    255
    笔宽 w75
    2.00px
    选定参数
    180 / 5.5 / 7
    漏检 miss
    0.00%

    起手那组 dil=5 断笔 0.28%,它自己沿回退阶梯换到 dil=7 才收工 —— 这一步不用你判断。

# 判错档不用慌:先动 --dil(断笔首选),再 --threshold,最后才微调 --dist python3 skill/scripts/process_signature_cv2.py 签名.png -o 姓名.png --auto --trim

细笔为什么必须同时提 --threshold 和 --dil:只提阈值会把笔迹削得更细, 断了还得回退。判据的完整推导见 算法说明。

03 / 装法

三步跑完

依赖只有 OpenCV / numpy / Pillow,装的时候记得 --only-binary=:all:。

跑完会打印三段日志(判档依据 / 参数 / 断笔自检)。断笔没修干净时它会自己回退一档重跑, 回退过几次也会写在日志里。

  • 1问它用哪个解释器 —— 本机自带的 python 常常缺 numpy
  • 2处理一张:--auto 自动判档,--trim 裁掉四周留白
  • 3出肉眼核对图:白底版 / 断笔叠加图 / 左右对比图
terminal
# 1. 先问它用哪个解释器(本机自带 python 常常缺 numpy) python3 skill/scripts/bootstrap_env.py --check # 2. 处理一张:--auto 自动判档,--trim 裁掉四周留白 python3 skill/scripts/process_signature_cv2.py 签名.png \ -o 姓名_transparent.png --auto --trim # 3. 出肉眼核对图:白底版 / 断笔叠加图 / 左右对比图 python3 skill/scripts/preview.py 签名.png 姓名_transparent.png

04 / 证据

真实案例:公开的签名

下面每一张都是真图:横线本上拍的照片、泛黄发灰的旧纸、黑底白字的拓片。 左=原图,右=抠出的透明笔迹。这些公开案例会自动同步到这里—— 不是每次人工挑几张贴上,那样迟早会出现「处理完了但页面上没有」。

3组横线本拍照 14组古帖 / 拓片 1组边界样本(虚线框) 点任一格看原尺寸
横线本拍照 → 提白 + 去线 + 去页眉:左为原图,右为抠出的透明笔迹
横线本拍照 → 提白 + 去线 + 去页眉
带页眉印刷字 → 一并摘除:左为原图,右为抠出的透明笔迹
带页眉印刷字 → 一并摘除
上下带邻行 → 裁到目标那一行:左为原图,右为抠出的透明笔迹
上下带邻行 → 裁到目标那一行
宣纸黄底 → 去杂项 + 去碎块:左为原图,右为抠出的透明笔迹
宣纸黄底 → 去杂项 + 去碎块
整张发灰 → 提白:左为原图,右为抠出的透明笔迹
整张发灰 → 提白
黑底白字 → 自动反转:左为原图,右为抠出的透明笔迹
黑底白字 → 自动反转
纸面已够白 → 不提白,直接分:左为原图,右为抠出的透明笔迹
纸面已够白 → 不提白,直接分
宣纸颗粒纹理 → 提白:左为原图,右为抠出的透明笔迹
宣纸颗粒纹理 → 提白
边界:深褐纸 + 草书,旧印同色,只到可辨:左为原图,右为抠出的透明笔迹
边界:深褐纸 + 草书,旧印同色,只到可辨
拓本灰底 → 去线 + 去杂项:左为原图,右为抠出的透明笔迹
拓本灰底 → 去线 + 去杂项
黑底白字 → 反转 + 去线:左为原图,右为抠出的透明笔迹
黑底白字 → 反转 + 去线
页边小注 → 摘除:左为原图,右为抠出的透明笔迹
页边小注 → 摘除
纸色已够浅 → 无需预处理:左为原图,右为抠出的透明笔迹
纸色已够浅 → 无需预处理
红章压住笔画 + 装裱灰影 → 剥章 + 提白:左为原图,右为抠出的透明笔迹
红章压住笔画 + 装裱灰影 → 剥章 + 提白
黑底白字 → 反转 + 提白:左为原图,右为抠出的透明笔迹
黑底白字 → 反转 + 提白
纸色已够浅 → 预处理跑过,未改动:左为原图,右为抠出的透明笔迹
纸色已够浅 → 预处理跑过,未改动
只有 198px 宽的小图 → 无需预处理:左为原图,右为抠出的透明笔迹
只有 198px 宽的小图 → 无需预处理

上面是 17 组,取自 22 组实测里可公开的那批(3 组横线本拍照件 + 14 组古帖题字; 5 组私人签名一律不进本站,机检拦在 CI)。每格都是同一张图:左=原图,右=结果 (棋盘格表示透明区)。点图可看原尺寸。

图注写的是这张图实际做过的处理 —— 标「无需预处理」的那几张,原图本身质量就够, 多一步反而有误伤笔画的风险。

其中一张用虚线框标出(深褐纸 + 草书):那张的旧印和笔画同色, 纹理会被判成墨,笔画粘连,只到「认得出是哪个字」的程度。 它照实放在这里,不撤 —— 一处不足比一句「全都很好」可信。 这批都是历史人物的字,不涉及在世个人。

05 / 来历

不是拍脑袋写的

算法是 22 组真实签名(3 组横线本拍照件 + 14 组古帖题字 + 5 组截图件)、十余版算法迭代收敛出来的,踩过的坑逐条写进了参考文档。

22 组真实签名实测校准(2026-06 ~ 2026-10)
17 组公开案例,就是上面那面墙的全部
5 组私有签名 —— 一律不进站,机检拦在 CI