
给图片加一枚隐形盲水印三步嵌入旋转裁剪后照样完整提取【免费下载链接】blind_watermarkBlindInvisible Watermark 图片盲水印提取水印无须原图项目地址: https://gitcode.com/GitHub_Trending/bl/blind_watermarkblind_watermark 做图片盲水印把文字或小图藏进像素的细微变化里肉眼看不见提取时不需要原图。当作品被截图、裁剪、压缩、转发一圈之后你还要能证明这是我的——这正是这套开源工具要解决的问题。照片被截图转发一圈后怎么证明它还是你的摄影师把作品发到网上很快会有人截图、去掉署名再发一遍。明水印贴在画面上碍眼加得重了就毁了构图普通隐写方案对比时得拿着原文件可原图早就不在对方手里了。盲水印换了一个思路嵌入时让带水印的图和原图几乎长一样提取时只凭带水印那张图本身加上嵌入时用的密钥和长度就能把信息读回来。原图丢了也没关系。原理速览水印信息藏在图片的哪一层三步变换把信息塞进人眼不敏感的位置直接改 RGB 像素相当于在画面表面写字随便一处理就花掉。blind_watermark 走的是经典的 DWT-DCT-SVD 链路DWT 小波分解把图片拆成粗纹理 细节的若干层像把一张照片分层成底稿和笔触DCT 余弦变换把每层再转成频率分量好比把一段和弦拆成单个音符SVD 奇异值分解进一步分解出一组奇异值可以理解为这一层画面的骨架。水印比特调制的是奇异值的大小。改得极小人眼看不出而奇异值是图像里最扛造的成分——旋转、裁剪、缩放、噪声之后它只动一点点比特因此还能被读回来。盲的含义提取只靠带水印那张图整条链路是确定性算法由password_img/password_wm两个密钥控制。提取端不需要原图文件只需要三样东西带水印的图、和嵌入时相同的密钥、水印长度wm_shape。这也是它叫盲的原因。一条命令装好 blind_watermarkpip install blind-watermark依赖只有 numpy、opencv-python、PyWavelets见 requirements.txt。想装开发版也可以git clone https://gitcode.com/GitHub_Trending/bl/blind_watermark cd blind_watermark pip install .三步嵌入第一枚隐形水印仓库示例 examples/example_str.py 用的就是下面这张人像照片当底图嵌入 提取的完整流程就两次调用from blind_watermark import WaterMark # 嵌入读底图 → 读水印文字 → 输出带水印的图 bwm WaterMark(password_img1, password_wm1) bwm.read_img(examples/pic/ori_img.jpeg) bwm.read_wm(我的水印文字, modestr) bwm.embed(output/embedded.png) len_wm len(bwm.wm_bit) # 这个长度提取时要传记下来 # 提取只需带水印的图 相同密钥 长度不需要原图 bwm2 WaterMark(password_img1, password_wm1) print(bwm2.extract(output/embedded.png, wm_shapelen_wm, modestr))肉眼对比embedded.png和原图几乎看不出差别打印出来的提取结果和嵌入的文字一字不差。实战水印图被旋转、截屏、加噪之后还能提取吗仓库自带攻击模拟工具 blind_watermark/att.py 和还原工具 blind_watermark/recover.py官方测试里八种攻击后的提取结果全部是同一句话。逐类看旋转 45°转回来照样提结论先说转 45° 再转回原位提取结果与原水印完全一致。用att.rot_att转过去、转回来然后照常调用extract即可。注意前提是知道旋转角度。截屏攻击先还原再提取截屏 裁剪 缩放是真实场景里最烦的一种。项目的做法是先还原、后提取知道裁剪区域和缩放比例直接调recover_crop把图还原到原始构图再提取不知道参数先调estimate_crop_parameters它会拿原始带水印图 截屏图做搜索推测出裁剪框和缩放比例再按推测结果还原。examples/example_str.py 把这两条路径都跑通了且用assert校验提取值与原水印相等。椒盐噪声、降亮度直接提取给带水印图加 5% 椒盐噪声或把亮度降到 90%都不需要还原步骤直接extract拿到的仍是同一段文字。缩放攻击则先还原回原分辨率再提取。能力与边界哪些攻击扛得住哪些要配合还原攻击提取结果前提条件旋转 45°✅ 原文字知道角度先转回原位随机裁剪 / 截屏✅ 原文字用recover_crop还原不知参数时先用estimate_crop_parameters推测多处遮挡✅ 原文字直接提取横向 / 纵向裁剪✅ 原文字还原后提取缩放✅ 原文字还原回原分辨率再提取椒盐噪声✅ 原文字直接提取亮度 -10%✅ 原文字还原亮度后提取边界也讲清楚免得踩坑裁剪、旋转不是直接提中间必须走还原流程密钥或水印长度wm_shape丢了文字水印就提不出来低质量 JPEG 反复重压缩会明显拉低效果嵌入后建议存成 PNG底图要足够大才装得下长水印小图配长文本会没空间。这套盲水印方案适合谁用摄影师、设计师在发布前给作品埋一枚不可见标记素材站、媒体用它做版权提示和传播路径追踪需要在公开图片里捎带一小段私密信息的场景也适用。定位上它是提示 溯源工具日常防盗和自证够用但不是司法鉴定标准也承诺不了对抗蓄意破坏时百分百存活。新手常见问题 FAQ提取时要准备什么带水印的图、嵌入时相同的password_img/password_wm、水印长度wm_shape。不需要原图。发到社交平台被压缩后还能提吗上面亮度、噪声、缩放的测试结果说明它有一定容错但社交平台会同时做重压缩、裁剪、缩略图。稳妥做法自己留一份带水印的 PNG 原片只拿到流传版时先走裁剪还原流程再提取。不写 Python命令行能搞定吗可以装了包就有blind_watermark命令# 嵌入 blind_watermark --embed --pwd 1234 examples/pic/ori_img.jpeg watermark text output/embedded.png # 提取 blind_watermark --extract --pwd 1234 --wm_shape 111 output/embedded.png想动手试的话直接打开 examples/ 目录文字水印看 example_str.py图片水印看 example_img.py交互式演示在 example_demo.ipynb完整参数说明在 docs/。【免费下载链接】blind_watermarkBlindInvisible Watermark 图片盲水印提取水印无须原图项目地址: https://gitcode.com/GitHub_Trending/bl/blind_watermark创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考