news 2026/9/12 2:50:18

blind_watermark:3分钟给图片加隐形水印,不靠原图也能取回

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
blind_watermark:3分钟给图片加隐形水印,不靠原图也能取回

blind_watermark:3分钟给图片加隐形水印,不靠原图也能取回

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

blind_watermark 是一个开源的图片盲水印工具:把一段文字、一张小图或一串比特流藏进图片,肉眼完全看不出来,提取时不需要原图,只要密码和长度即可。适合想给作品加防盗标记的创作者,以及想把水印能力集成进自己产品的开发者。

图被盗图裁掉署名之后,你手里没什么证据

照片被搬运、被裁掉角落的署名、被压成低清图再传一遍,维权时你很难证明"这原本是我发的图"。明水印太扎眼,还会被人 P 掉;完全不留痕迹又等于放弃主张。盲水印的思路就是折中:图面上一个像素都不动,把信息藏在人眼不敏感的地方,事后再把信息读出来。blind_watermark 做的就是这件事,而且提取环节只要带水印的那张图,原图丢了也没关系。

两条命令上手:装完、嵌入、取回

pip install blind-watermark

装好后跑一段最小的嵌入和提取(完整可运行的版本在 examples/example_str.py):

from blind_watermark import WaterMark bwm = WaterMark(password_img=1, password_wm=1) bwm.read_img('pic/ori_img.jpeg') bwm.read_wm('copyright: yourname', mode='str') bwm.embed('output/embedded.png') len_wm = len(bwm.wm_bit) # 这个长度要记下来! bwm1 = WaterMark(password_img=1, password_wm=1) print(bwm1.extract('output/embedded.png', wm_shape=len_wm, mode='str'))

打印出来的就是你嵌入的那句话。如果不想写代码,装完包还会注册一个终端命令blind_watermark,用--embed/--extract参数也能完成文字水印的嵌入和提取,但嵌图片水印、嵌比特流这些玩法还是写代码更清楚。水印内容支持三种:字符串(mode='str')、小图片(mode='img',按灰度阈值转成黑白比特)、以及直接的布尔比特流(mode='bit')。

原理一句话:把便条折进图块的"纹理"里

可以把它想象成藏便条:你不改动照片里任何一个人,只是按一份"排序清单"微调了若干块纹理;外人看照片毫发无损,只有拿着同一份清单的人才能把便条还原出来。对应到代码里,就是把原图切成很多小块,对每块做几轮频域变换,再用两个密码(password_imgpassword_wm)把水印比特打乱顺序后藏进变换结果的系数里,具体实现在 blind_watermark/bwm_core.py。提取时不需要原图,用同样的两个密码和同样的水印长度把顺序倒回去即可,这也是它敢叫"盲"水印的原因。

效果对比:肉眼看不出,旋转加噪照样读回

这两张是同一张图:左边是原图,右边是嵌入水印后存出来的图(docs/原图.jpeg、docs/打上水印的图.jpg),肉眼看不出差别。

再狠一点:官方示例给水印图做了 60 度旋转和 5% 概率的椒盐噪声(examples/example_str.py 里的攻击测试),下面两张分别是攻击后的样子,提取结果依然是原文:

除了这两类,示例里还覆盖了缩放、裁剪、遮挡、亮度、截屏等攻击,README 的表格里列了每种攻击下的恢复结果,可以对着看。

用之前先知道的 4 个坑

  1. 水印长度必须自己记。提取时wm_shape是必填项,忘掉了len_wm就真的提不出来。建议在嵌入脚本里把它打印出来存档。
  2. 嵌入和提取要同一个版本。初始化时会打印提示"Make sure the version is the same when encode and decode",别在嵌入后升级库再去解老图。
  3. 输出尽量存 PNG。embed()支持compression_ratio参数控制 JPEG 压缩,但低质量 JPG 会直接压坏水印,日常用法是存 PNG。
  4. 裁剪、旋转不能直接提。要先用仓库自带的 blind_watermark/recover.py 做还原;如果你连攻击参数都不知道,得用estimate_crop_parameters去猜,能用就省着用。

哪些场景不建议用它

  • 只处理静态图片,没有视频水印,视频场景请另找工具。
  • 两个密码只是整数种子,本质是"口令"而不是加密。攻击者知道这个项目、又有耐心试参数的话,可以暴力试出水印内容,别拿它当高强度保密通信的载体。
  • 图片要经过社交媒体多次重压缩、转格式再分发的话,鲁棒性没有测试表里那么乐观。
  • 小图容量有限:宿主图越小,能塞的水印越短;想嵌一张像样的 logo 图,宿主图得够大。

它不是一个"万能的版权法庭证据",而是一个把防盗成本拉高的实用工具,用对场景就很称职。更多攻击案例和参数细节,直接看 README 里的对照表,再跑一遍 examples/example_str.py 亲手验证效果最踏实。

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

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

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/9/12 2:47:02

BFGS与Armijo线搜索的MATLAB实现:从数学原理到代码实战

我先说下这个项目给我的感觉吧。做优化算法的人,手上一般都会备着几套经典无约束优化方法的代码,梯度下降、牛顿法这些当然要有,但真正在工程里遇到非凸目标、二阶信息算不出来或者算出来不太靠谱的时候,BFGS几乎是默认的备选方案…

作者头像 李华
网站建设 2026/9/12 2:46:40

uniTerm v1.9:14MB开源终端,30+协议无限制替代MobaXterm

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

作者头像 李华