blind_watermark 实战:3 种水印模式,提取时不需要原图
【免费下载链接】blind_watermarkBlind&Invisible Watermark ,图片盲水印,提取水印无须原图!项目地址: https://gitcode.com/GitHub_Trending/bl/blind_watermark
图片被转载后找不到证据,是内容创作者最常遇到的糟心事。blind_watermark 是一个 Python 盲水印库:把版权信息藏进像素,肉眼看不出,提取水印无须原图。命令行两句话,3 种模式(文本、图片、二进制)任选。
先跑通一条命令
git clone https://gitcode.com/GitHub_Trending/bl/blind_watermark && cd blind_watermark pip install -e . python -m blind_watermark.cli_tools --embed --pwd 1234 examples/pic/ori_img.jpeg "owner" embedded.png python -m blind_watermark.cli_tools --extract --pwd 1234 --wm_shape 39 embedded.png最后一条会原样吐出owner。闭环的关键参数是--pwd和--wm_shape(水印比特长度,上例为 39),嵌入时记下来,提取时原样带上。
仓库自带的示例图,水印就是嵌在这张里。
三种模式,一张表讲清
| 模式 | 嵌入内容 | 典型场景 | 抗压缩/缩放表现 | 源码入口 |
|---|---|---|---|---|
文本str | 一句文字,UTF-8 编码后转比特 | 署名、版权声明、联系方式 | 短文本循环写入大量块,冗余度最高,抗压缩缩放最稳 | blind_watermark.pyread_wm(mode='str') |
图片img | 水印图按灰度 128 阈值转成 0/1 矩阵 | Logo、复杂图形水印 | 每个像素只写一次,块少位多,旋转缩放后提取图易糊 | 同上,read_wm(mode='img') |
二进制bit | 一串自定义 0/1 序列 | 数字指纹、溯源标识 | 容量最灵活,鲁棒性取决于你给多少冗余 | 同上,read_wm(mode='bit') |
三种模式的差别只在read_wm()这一步怎么变成比特串;后面完全同一条流水线:DCT 变换后按 SVD 把比特写进 4×4 块的奇异值,三个颜色通道各写一份,提取时对每个比特的所有副本求平均抗噪,核心实现在 bwm_core.py。
一句话差异:文本模式适合"短内容、强对抗",图片模式适合"图形化水印、能接受损失",二进制模式适合"自己控制编码与校验"。
压一压、转一转,水印还在吗
缩放:把打过水印的图压到 300×400 再放大回去,提取结果仍是原文本,逐字符完整。仓库里有对照图,docs/缩放攻击.jpg 是攻击后的图,docs/缩放攻击_提取水印.png 是提取出的水印。
旋转:转 45° 再转回来,文本水印照样读出,见 docs/旋转攻击.jpg 与 docs/旋转攻击_提取水印.png 两张成对示例。
裁剪更极端:先裁剪、再被缩放(常见于手机截图转发),可以靠 recover.py 里的estimate_crop_parameters推测裁剪参数,再recover_crop模板还原后正常提取;攻击函数本体在 att.py。
选型 & 踩坑速查
--pwd和--wm_shape记牢:提取必须知道密码和水印比特长度,丢一个都白搭,建议随图存档。- 文字短一点:文本模式会把比特循环铺满全图所有可用块,文本越短冗余越多,抗压缩水印能力越强。
- JPG 质量参数别低于 80:有损压缩直接改 DCT 系数,奇异值被噪声淹没后提取位误差明显上升,交付前的最后一次压缩要留够质量。
- 先还原尺寸再提取:被缩放、旋转过的图,恢复接近原图大小后再提取,块与 4×4 分块的对应关系才稳定,平均环节才有效。
- 报"溢出"就是容量不够:水印比特数超过图片可容纳的块数时会抛 IndexError,换短文本或更大的底图。
想再深一层
更多攻击样例与截图还原流程在 docs/ 目录;嵌入与提取的完整实现就在 bwm_core.py,全局常数d1/d2控制鲁棒性与失真的平衡,改这两个数即可按自己的场景调参。
【免费下载链接】blind_watermarkBlind&Invisible Watermark ,图片盲水印,提取水印无须原图!项目地址: https://gitcode.com/GitHub_Trending/bl/blind_watermark
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考