图片盲水印完整指南:无需原图的4种嵌入与提取方法
2026/9/12 1:42:03 网站建设 项目流程

图片盲水印完整指南:无需原图的4种嵌入与提取方法

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

你的设计稿被无授权使用,却拿不出证据?图片盲水印能把一段文字藏进图片里,提取时又不需要原图。本文带你用开源工具 blind_watermark 从安装一路做到抗攻击提取。

速览:图片盲水印能帮你做什么

项目基于 DWT-DCT-SVD 频域算法,水印嵌入后人眼不可见,且经过旋转、裁剪、加噪后仍可提取。

你的场景看哪个模块一句话要点
给图片藏一段文字文本水印怎么嵌入读图、读水印、嵌入,三步 API
嵌入 Logo 图或一串比特图片与比特水印怎么嵌换 mode 参数,流程不变
从流传出去的图里取出水印盲水印怎么提取只要有带水印的图 + 密码 + 长度
被转存、旋转、裁剪后验证抗攻击部分冗余编码,局部破坏不影响整体

上面这张examples/pic/ori_img.jpeg就是仓库自带的演示原图,后文所有例子都以它为素材。

文本水印怎么嵌入

一句话概念。字符串先转成比特流,再用随机种子打乱,散到整幅图的频域系数里,肉眼看不出任何痕迹。

关键操作。入口类WaterMark在 blind_watermark/blind_watermark.py 中,read_img读原图、read_wm读水印、embed落盘,三步就是完整流程:

from blind_watermark import WaterMark bwm = WaterMark(password_img=1, password_wm=1) bwm.read_img('examples/pic/ori_img.jpeg') bwm.read_wm('版权所有,请勿盗用', mode='str') bwm.embed('output/embedded.png') print(len(bwm.wm_bit)) # 记下比特长度,提取时要用

小例子。跑完后output/embedded.png和原图几乎一模一样,但已经藏进了你的声明。最后一行打印出的比特数务必保存,它决定提取时wm_shape填多少。

图片与比特水印怎么嵌

一句话概念。read_wm支持 img、str、bit 三种 mode,文本和图片最终都会被拍平成一维比特,走同一条通道。

关键操作。传入灰度图路径即默认走 img 模式,亮度超过 128 的像素记为 1;要嵌布尔列表就显式传mode='bit'

小例子。仓库自带一张小 Logo 在examples/pic/watermark.png,照着examples/example_img.py跑一遍就能把它嵌进原图,提取时会还原出一张水印图。bit 模式甚至可以藏[True, False, True, True, True, False]这样的 6 位短码,提取结果落在 0~1 的浮点上,你自定阈值(如 0.5)判位即可。

盲水印怎么提取:不需要原图

一句话概念。“盲”的意思就是提取时只认带水印的那张图,原图可以完全没有,也不关心当初是怎么嵌的。

关键操作。extract()wm_shape必填:字符串模式填比特长度,图片模式填(高, 宽)

bwm1 = WaterMark(password_img=1, password_wm=1) wm = bwm1.extract('output/embedded.png', wm_shape=bit_len, mode='str') print(wm) # 版权所有,请勿盗用

bit_len就是上一个模块打印出来的那个数字。

小例子。想要完整对照,直接运行examples/example_str.py:它嵌入后立刻提取,并用断言校验“提取结果 == 原文”,全程不碰原图。

被旋转、裁剪、加噪后还能提取吗 🛡️

一句话概念。水印信息被冗余地摊在整张图上,一次局部攻击只能毁掉一小部分,剩下的投票仍能还原信息。

关键操作。blind_watermark/att.py里有一组攻击模拟函数:旋转、裁剪、缩放、遮挡、椒盐噪声、亮度调节;遇到“不知道被裁了哪里、缩了多少”的情况,用blind_watermark/recover.py里的estimate_crop_parameters先估算攻击参数、复原图片,再提取。

小例子。examples/example_str.py后半段自动跑完一圈:旋转 60 度、随机裁剪加缩放、60 处遮挡、缩放到 400x300、5% 椒盐噪声——每种攻击后的图里取出的水印,都和原文完全一致。各类攻击前后图片的对比,可以在 README.md 的攻击效果表里直接看。

新手常见盲水印踩坑 ⚠️

坑:嵌入时随手一跑,没记下水印比特长度。 怎么避:嵌入完立刻len(bwm.wm_bit),CLI 模式会自动打印 “watermark size”,顺手存下来。

坑:wm_shape填错单位。 怎么避:str/bit 模式填比特数,img 模式填(高, 宽)元组,跟着 mode 走,别混。

坑:提取时密码和嵌入时不一致。 怎么避:password_imgpassword_wm是成对的钥匙,两端必须一致,建议写进项目配置统一管理。

坑:把带水印的图反复存成低质量 JPG。 怎么避:每次有损压缩都在叠加噪声,输出尽量存 PNG,必须用 JPG 时给embed(compression_ratio=...)传高质量值。

坑:把抗攻击能力想得太神。 怎么避:强攻击叠加(大角度旋转 + 重度压缩 + 大幅裁剪)仍可能失败,关键场景先用 recover 系列复原再提取,别直接硬提。

快速上手:3 步跑通一次嵌入提取

  1. 安装:pip install blind-watermark
  2. 命令行嵌入:
  3. 命令行提取(--wm_shape用第 2 步打印的长度)
# 嵌入水印,1234 为密码 blind_watermark --embed --pwd 1234 examples/pic/ori_img.jpeg "watermark text" examples/output/embedded.png # 提取水印,111 为示例,实际填嵌入时打印的长度 blind_watermark --extract --pwd 1234 --wm_shape 111 examples/output/embedded.png

想再往深里看,中文说明在 docs/zh/README.md,更多玩法在examples/目录里。

水印是隐形的,但它一直都在。下次发出图片前,不妨也给它加上这份无声的证据。

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

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

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

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

立即咨询