图片盲水印实践:blind_watermark 3 分钟嵌入与提取
2026/9/12 9:44:35 网站建设 项目流程

图片盲水印实践:blind_watermark 3 分钟嵌入与提取

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

从一次盗图说起

刚发出去的原创照片被别人原样搬走,想自证版权却拿不出证据——这是创作者常遇到的情况。如果图片在发布前就悄悄带着一段只有自己能解开的信息,被搬走也能追回来。blind_watermark 这个开源项目做的就是这件事:往图片里写入一段隐形水印,提取时不依赖原图,只需要那张被打过水印的图加上密码。

下面直接动手。

blind_watermark 安装与最小示例

依赖只有 numpy、opencv、PyWavelets,一行命令装好:

pip install blind-watermark

装完自带一个命令行工具blind_watermark,嵌入和提取各一条命令:

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

注意第二条命令里的--wm_shape 111:提取时必须知道水印的长度,这个值在嵌入时已经打印出来了,要自己记下来。如果习惯写代码,Python 接口更灵活,支持文字、图片、比特流三种水印内容:

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('out.png') len_wm = len(bwm.wm_bit) # 记下长度,提取时要传 bwm2 = WaterMark(password_img=1, password_wm=1) print(bwm2.extract('out.png', wm_shape=len_wm, mode='str'))

旋转、裁剪、加噪后水印还能提取吗

项目的示例脚本 examples/example_str.py 内置了一组攻防测试,水印是@guofei9987 开源万岁!,三种有代表性的情况:

  • 旋转 60° 再转回来:调用att.rot_att正向旋转、反向旋转各一次,对还原后的图提取,结果与原文字完全一致。
  • 随机裁剪加缩放:从图中剪出一块并缩放 0.7 倍,模拟"截图"行为。知道裁剪参数时直接按参数补回;不知道参数时,recover.py里的estimate_crop_parameters能自动估计出裁剪区域和缩放比例,再还原、提取,同样拿到原文字。
  • 椒盐噪声(5% 像素变白):直接对被打噪的图提取,无需任何预处理,结果一致。

遮挡、亮度调整、多方向裁剪等场景也都在同一脚本里覆盖,断言全部通过。也就是说常规的图片传播损伤基本不影响使用。

背后原理:DWT-DCT-SVD 各做了什么

核心算法在 blind_watermark/bwm_core.py,流程分四步。先把图片转成 YUV,对每个通道做 Haar 小波变换(DWT)取低频分量;低频分量按 4×4 分块,每块再做 DCT 变换到频率域;然后对每块做 SVD 分解,把水印位(0/1)以固定步长写进前两个奇异值上——步长d1=36d2=20越大鲁棒性越强,代价是图像失真越大;最后逆 SVD、逆 DCT、逆 DWT 还原成像素。同一位水印还会循环写入所有块、三个通道各写一遍,提取时取平均再聚类判位,所以丢一部分块(裁剪、遮挡)也不至于全军覆没。

实用提醒

  • 水印长度必须记牢extractwm_shape是必填项,CLI 里对应--wm_shape,丢了就无法提取。
  • 密码要成对保管password_img决定水印写在哪些块、哪些位置,password_wm决定比特顺序,提取时两个都得一致。CLI 方式只设了password_img
  • 图片尺寸决定容量:可嵌入位数约等于(高/8) × (宽/8),图片太小或水印太长会直接抛溢出异常,选载体前先算一下。
  • 先存 PNG 再走 JPEG:嵌入后建议先存无损格式,再压缩分发;每多一道有损压缩,容错余量就少一点。

项目入口

  • 仓库地址(需要 clone 时):git clone https://gitcode.com/GitHub_Trending/bl/blind_watermark
  • 核心源码:blind_watermark/bwm_core.py(嵌入/提取算法)、blind_watermark/blind_watermark.py(对外 API)
  • 中文文档与效果展示:docs/zh/README.md
  • 完整攻防示例:examples/example_str.py

把水印写进图里再提取出来只需几行代码,密码和长度记好,这套流程就可以直接用在日常发布流程里了。

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

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

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

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

立即咨询