图片盲水印:被裁剪的图还能提取吗
2026/9/12 16:54:19 网站建设 项目流程

图片盲水印:被裁剪的图还能提取吗

【免费下载链接】blind_watermarkBlind&Invisible Watermark ,图片盲水印,提取水印无须原图!项目地址: https://gitcode.com/GitHub_Trending/bl/blind_watermark

blind_watermark 是一个 Python 开源图片盲水印工具:把文字、图片或者 0/1 比特流以肉眼不可见的方式嵌进照片,提取时不需要原图——只要打过水印的图、密码和水印长度就行。作品被截图、被裁剪、被平台反复转发时,它能帮你把水印捞回来。

被截图、被缩放、被裁剪,水印还在吗

想象一个场景:你把作品发给朋友,朋友截图了一部分发到网上,图片被缩放到 70%,角落的署名也被裁掉了。EXIF 信息早就没了,你想证明「这张图出自我手」,拿不出证据。

这里需要的就是盲水印——一种肉眼看不见、不改变图片外观,而且图片被折腾过之后还能读出来的数字水印。它和传统水印最大的区别在于提取时不需要原图:任何一张流落在外面的图,你都有机会把水印提出来。

嵌一张图的水印,6 行代码跑完全流程

先装:pip install blind-watermark。项目自带的演示原图在这里,下面这段代码就是完整的嵌入 + 提取:

from blind_watermark import WaterMark bwm = WaterMark(password_img=1, password_wm=1) bwm.read_img('pic/ori_img.jpeg') wm = '@guofei9987 开源万岁!' bwm.read_wm(wm, mode='str') bwm.embed('output/embedded.png') len_wm = len(bwm.wm_bit) # 记录长度,提取时要用 bwm.extract('output/embedded.png', wm_shape=len_wm, mode='str')

嵌好水印的图和原图肉眼看不出差别,但水印已经写进了频域:算法先做离散小波变换(DWT,把图像拆成高频和低频成分),再切成 4×4 的小块,每块做离散余弦变换(DCT,把像素值转成频率系数),最后通过奇异值分解(SVD,把矩阵拆成三个更简单的矩阵)调整奇异值藏进 1 比特信息。三层变换叠在一起,人眼检测不到,但拿着密码就能反算读出来,细节可以看 bwm_core.py。

不想写代码也行,装好后命令行一条命令就能嵌:

blind_watermark --embed --pwd 1234 examples/pic/ori_img.jpeg "watermark text" examples/output/embedded.png

把 6 种攻击挨个跑一遍,结果如何

不空谈「鲁棒」,仓库里的 完整测试示例 把每一种攻击真实跑了一遍,每一步都用 assert 断言「提取结果和原水印完全一致」:

  • 旋转 60 度:旋转后再逆旋转还原,提取结果与原水印一致;
  • 60 个随机遮挡块:每块占 10% 面积,完整水印照样提取;
  • 5% 椒盐噪声:随机黑白点破坏像素,提取结果不变;
  • 缩放:先缩到 400×300 再还原,提取成功;
  • 亮度降 10%:再恢复,提取成功;
  • 截屏攻击(裁剪 + 缩放组合):即使不知道裁剪位置和缩放系数,estimate_crop_parameters能反推出参数,recover_crop把图还原回原始尺寸,再提取水印。

结论很简单:只要图片没被撕碎到无法辨认,水印基本都拿得回来。

用之前先看清这 3 个边界

  • 密码 + 长度缺一不可,且密码只是「种子」。提取必须给wm_shape(比特长度)且密码一致。但要清醒:这里的password_wm是打乱顺序的随机种子,不是银行级密钥——password_wm=1这种默认值,看代码的人都能提。别指望「猜不到密码就提取不了」的高安全级别。
  • 小图有容量上限。水印比特数必须小于图片能容纳的 4×4 块数,超了直接报溢出错误。在一张几 MB 的照片里嵌一句版权文字没问题,别往 128 像素头像里塞一段话。
  • 扛不住不可逆处理。旋转恢复要知道角度,裁剪恢复要知道裁剪区域(或拿打过水印的图去推断);图片被反复重压到低质量、或被重绘之后,水印基本就没了。做版权保护,尽量留好打过水印的原始图。

4 个能少绕弯的实用技巧

  1. 嵌入后立刻记长度len_wm = len(bwm.wm_bit)是提取的钥匙,丢了它,图再好也提不出来;
  2. 输出用 PNG:有损压缩是水印最大的敌人;embedcompression_ratio参数(0~100)控制输出文件大小,越小压得越狠,水印越危险;
  3. 大图慢就放开多进程WaterMarkprocesses参数不传时默认用满全部 CPU 核心并行处理;
  4. 鲁棒性和画质是权衡的:核心算法里d1d2两个参数越大,水印越扛造,但输出图片失真也越大,按你的攻击场景自己调。

挑一张你最近发布的照片,pip install blind-watermark,把署名嵌进去,再让朋友截图转发一遍试试——三分钟你就能确认:这张图以后丢到哪儿,版权都还在你手里。

【免费下载链接】blind_watermarkBlind&Invisible Watermark ,图片盲水印,提取水印无须原图!项目地址: https://gitcode.com/GitHub_Trending/bl/blind_watermark

创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询