图片盲水印实战:嵌入隐形版权声明,被缩放、旋转后照样能提取
【免费下载链接】blind_watermarkBlind&Invisible Watermark ,图片盲水印,提取水印无须原图!项目地址: https://gitcode.com/GitHub_Trending/bl/blind_watermark
blind_watermark 是一个 Python 图片盲水印项目:它把版权信息隐进图片里,肉眼看不见,提取时只要打了水印的图、无须原图,被缩放、旋转、遮挡后照样能取回来。适合摄影师、设计师、内容发布者。
图片被盗时,你如何自证归属 🛡️
图片一被盗用,你就没证据了。素材图被发到竞品网站,署名都没了。原画被别人截图转存,你连主张权利都拿不出东西。
可见的水印 Logo 很好对付,裁一刀就没了。盲水印解决的就是这两件事:藏得看不见,图被折腾过也能提取,而且提取无须原图。
先看效果:原图与盲水印嵌入前后对比 🖼️
先看结果,判断值不值得学。下图是原图,下一张嵌入了"© All rights reserved"。
对比两张,几乎看不出差别。版权信息藏在图像变换后的频域里,肉眼不可见,提取时只读打了水印的这张图就够了。
盲水印怎么嵌入:三条命令完成嵌入与提取 🔧
第一步,准备环境。两条命令,依赖装完即可。
git clone https://gitcode.com/GitHub_Trending/bl/blind_watermark cd blind_watermark && pip install .仓库里带现成示例图 examples/pic/,不用先准备自己的素材。
第二步,嵌入并提取。把两段代码按顺序跑,全程只有 8 行核心逻辑。
from blind_watermark import WaterMark bwm = WaterMark(password_img=1, password_wm=1) bwm.read_img('examples/pic/ori_img.jpeg') bwm.read_wm('版权所有 © All rights reserved', mode='str') bwm.embed('examples/output/embedded.png') bwm2 = WaterMark(password_img=1, password_img=1, password_wm=1) wm = bwm2.extract('examples/output/embedded.png', wm_shape=len(bwm.wm_bit), mode='str') print(wm)两处注意点。一是 password_img 和 password_wm 两端必须一致,这是提取的钥匙。二是提取必须告诉程序水印有多长,wm_shape 用的就是嵌入时输出的位长度。算法主体在 blind_watermark.py,基于 DWT-DCT-SVD。
不想写 Python 的话,装完就有现成命令行:
blind_watermark --embed --pwd 1234 examples/pic/ori_img.jpeg "watermark text" examples/output/embedded.png blind_watermark --extract --pwd 1234 --wm_shape 111 examples/output/embedded.png第一条会打印水印位长度(这句文本是 111),第二条的 --wm_shape 就填这个数。换别的文字,填实际打印的值。
盲水印怎么验证:跑一遍自带攻击脚本 ✅
验证别靠肉眼,跑项目自带的测试脚本:
python examples/example_str.py脚本先嵌入,再依次模拟 8 种攻击:旋转 45 度、随机裁剪、60 次随机遮挡、缩放、5% 椒盐噪声、亮度下调 10% 等,每种攻击后都提取一次,末尾用断言和原文逐字比对。跑完没有报错,说明全部通过。完整流程参考 example_str.py。
3 种水印模式怎么选:文本、图片还是二进制 📊
| 模式 | 嵌什么 | 提取时要提供 | 适合 | 代价 | | -- | -- | -- | -- | -- | | str 文本 | 声明、署名、联系方式 | 水印位长度 | 快速署名 | 中文每字占 12 bit,长文案吃容量 | | img 图片 | Logo、黑白图案 | 水印图尺寸 (h, w) | 品牌标识 | 灰度按阈值 128 二值化,图要黑白对比鲜明 | | bit 二进制 | 任意 0/1 序列 | 总位数 | 数据指纹、设备编号 | 需自备 0/1 数组,不做字符串转换 |
建议:先用 str 模式跑通,嵌 Logo 换 img,嵌编号换 bit。三种模式共用同一套读写接口,只改 mode 和水印形状,迁移成本几乎为零。
盲水印提取抗攻击效果:8 种攻击逐一验证 ⚔️
抗攻击是盲水印的主要卖点。上表 8 种攻击全部提取出完整原文,其中旋转后的效果如下:
旋转、亮度这类可逆攻击,提取前先反向操作即可。裁剪更麻烦,因为少了原图做参照,recover.py 提供参数估计函数,能推测裁剪区域和缩放比例,先还原再提取。
边界也有两点要说清。鲁棒性和画质是一对取舍:bwm_core.py 里 d1/d2 两个参数越大抗攻击越强,但图像失真越大。容量上,水印位必须小于图片可嵌入上限,仓库里 738×1108 的示例图约为 1.27 万 bit。另外,微信转发这类二次有损压缩不在已验证范围内,别把盲水印当作法律纠纷的唯一证据,高风险场景搭配时间戳或版权登记。
新手最容易踩的 3 个坑 ⚠️
忘了记水印长度。提取必须传 wm_shape,长度忘了就取不出来。解法:嵌入时打印出来存好,命令行模式第一条命令会主动打印。
嵌入和提取条件不一致。两端密码不同、或编码解码用了不同版本,提取结果就是乱码。项目启动提示里专门写了 Make sure the version is the same,别忽略。
把带水印的图存成低质量 JPG。有损重压缩会破坏高频里的水印信息。项目示例流全程用 PNG 保存;必须用 jpg 时,embed() 有 compression_ratio 参数可以控制压缩质量,别用默认低档。
5 分钟动手,现在就跑一遍 🚀
别再观望了,5 分钟就够:clone 仓库装上,把 read_img 指向你自己的图,跑完嵌入和提取,你手上就有了第一张带隐形署名的图。
三种模式的完整示例和攻击还原演示都在 examples/ 目录里,照着改路径就行。今晚就把你的作品保护起来。
【免费下载链接】blind_watermarkBlind&Invisible Watermark ,图片盲水印,提取水印无须原图!项目地址: https://gitcode.com/GitHub_Trending/bl/blind_watermark
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考