blind_watermark 盲水印视觉定制:3 个参数调出你的专属水印输出
【免费下载链接】blind_watermarkBlind&Invisible Watermark ,图片盲水印,提取水印无须原图!项目地址: https://gitcode.com/GitHub_Trending/bl/blind_watermark
深夜把图发出去之前,你其实只想干一件小事:给图加一道只有自己能认出来的暗记,而不是默认那种"加了和没加看不出区别、强度也懒得管"的水印。blind_watermark 是一个基于 DWT-DCT-SVD 的盲水印库,最大的特点是提取水印不需要原图。它没有图形界面,真正的"视觉个性化"发生在输出这一侧——你决定水印藏成文字、图像还是原始比特,再决定它藏得多结实、输出文件留多大。下面几个参数,就是把默认水印改成"你的样子"的全部抓手。
默认水印输出为什么不够用
默认用法一行命令就能出图,但它给所有人的输出长得一模一样:不可见、强度固定、文件大小看运气。对个人创作者、图库发布者、内容团队来说,默认档只解决了"有没有",没解决"像不像我的"。
- 水印内容形式单一:默认只按文字走,想藏一张自己的标识图或一段编码位,得换一种模式。
- 画质与强度是绑死的:藏得越结实,原图失真越明显,默认值并不一定是你最想要的那个平衡点。
- 输出文件不可控:同一张图,有的场景要最小体积,有的要尽量保真,默认不给你这个开关。
认清这三点,你就知道"定制"要动哪里:形式、强度、输出。
找到 blind_watermark 的定制入口
定制入口有三处,从省事到灵活排序,你挑顺手的:
- 命令行:
blind_watermark --embed ...直接出图,适合批量脚本,定义见 cli_tools.py。 - Python API:
from blind_watermark import WaterMark后调read_img / read_wm / embed,所有可调参数都挂在构造器上,核心在 WaterMark 类。 - 示例目录:
examples/里每种形式都有一份可运行脚本,照着抄最快。
想先跑通再改,先备一张测试原图。仓库自带的标准测试图可以直接用:
核心可调参数一览表
把这几个"变量"看懂,定制就通了。它们不在配置文件里,而是写在调用WaterMark(...)时的参数上:
| 变量 | 含义 | 怎么改 | 对输出的影响 |
|---|---|---|---|
mode | 水印形式 | str文字 /img图像 /bit比特 | 决定暗记藏成什么"样子" |
password_img/password_wm | 加解密口令 | 换成你自己的整数 | 换口令后别人提不出来 |
d1/d2 | 强度档位 | 在 bwm_core.py 里调整 | 越大越抗攻击,但原图失真越大 |
compression_ratio | 输出压缩 | embed(..., compression_ratio=...) | 控制成品文件体积与画质 |
fast_mode | 速度档 | 构造参数里开关 | 快但略降鲁棒性 |
其中d1/d2是"强度"的核心旋钮,源码里注释写得很直白:越大鲁棒性越强,但输出图片失真越大。这是"藏得稳"和"看得舒服"之间唯一的权衡,也是你最容易做出自己风格的地方。
按场景定制你的水印
藏一句自己的话(文字水印)
最常用。mode='str'时传入一句署名或编号即可,参考 example_str.py:
bwm = WaterMark(password_img=1, password_wm=1) # 口令换成你的 bwm.read_wm('@你的名字', mode='str') # 藏成一句文字白话:口令两个数换成自己的,水印内容换成你想藏的那句话,提取时只要口令和长度对上就能还原。
藏一张标识图(图像水印)
想让暗记是"一张图"而不是一行字,用 example_img.py,read_wm直接喂图片路径:
bwm.read_wm('pic/watermark.png') # 水印是一张图 bwm.embed('output/embedded.png')白话:把你要藏的小图(logo、二维码)路径传进去,它会被压成黑白位再藏进原图,提取时按wm_shape还原成图。
藏一段原始比特(比特水印)
需要机器可读、或对接自己的协议时,用 example_bit.py 传布尔数组:
bwm.read_wm([True, False, True], mode='bit') # 任意 0/1 序列白话:适合把 ID、校验位这类结构化信息藏进去,提取回来的是浮点数组,你按阈值(如 0.5)自己判 0/1。
三种形式出图后,水印都不可见,但效果是"原图 → 带水印的图"这条链路:
常见坑与解法
| 坑 | 现象 | 解法 |
|---|---|---|
| 编解码版本/口令不一致 | 提取出来是乱码 | 保证两边口令、版本相同,password_img/password_wm一致 |
忘了记wm_shape | 提取报错wm_shape needed | 提取前把水印长度或长宽存下来,参考 example_str.py 里len_wm |
d1/d2调太大 | 人眼看出噪点/失真 | 回退默认值,或用fast_mode先快速预览再精调 |
| 被裁剪/旋转后提取失败 | 攻击后还原不出来 | 用 att.py 模拟攻击、recover.py 还原再提取 |
| 透明图处理异常 | 带 alpha 的图出图怪 | 库会自动剥离 alpha 再合成,别手动去掉透明通道 |
上手前自检清单
- 已
pip install blind-watermark且版本与解码端一致 - 测试原图、水印内容(文字/图/比特)都备好了
- 两个口令已改成自己的值并记录在案
- 水印长度
len_wm或wm_shape已保存,提取时要用 d1/d2强度与compression_ratio已按需求设好,并肉眼看了一次成品- 至少用 att.py 模拟了一种你最担心的攻击(裁剪/旋转/缩放)并验证能还原
把清单走完,你的盲水印就从"默认那一份"变成了"你自己的那一份"。
下一步可以直接照着 example_str.py 跑通一次文字水印,把password和那句署名换成你自己的,再调一次d1看失真变化——一次就能看清强度与画质之间的取舍。依赖与用法细节见 requirements.txt 和 中文 README。
【免费下载链接】blind_watermarkBlind&Invisible Watermark ,图片盲水印,提取水印无须原图!项目地址: https://gitcode.com/GitHub_Trending/bl/blind_watermark
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考