ARTICLE DETAIL

资讯详情

深耕郑州网站建设与运营推广的一线实战洞察。

blind_watermark 盲水印完全指南:5 分钟嵌入,提取无须原图

blind_watermark 盲水印完全指南:5 分钟嵌入,提取无须原图 blind_watermark 盲水印完全指南5 分钟嵌入提取无须原图【免费下载链接】blind_watermarkBlindInvisible Watermark 图片盲水印提取水印无须原图项目地址: https://gitcode.com/GitHub_Trending/bl/blind_watermark你发了一张图被人无署名转发你拿不出证据。blind_watermark 是一个 Python 开源图片盲水印工具它能往图片里藏入肉眼不可见的信息事后不依赖原图就能从被转发的图片上把这段信息提取出来。 它是什么解决什么问题传统可见水印比如角落贴一行小字容易被裁剪掉而提取时要拿原图对比的方案在维权场景里根本用不上——你往往只有对方发出来的那张图。blind_watermark 走的是另一条路基于 DWT-DCT-SVD 频域算法下面会讲把水印写进图片的高频成分嵌入后的图和人眼看到的原图几乎一样提取时只要给带水印的图 密码 水印长度不需要原图。它支持三种水印内容文本modestr、图片modeimg如二维码、Logo、比特流modebit。下面是官方示例用到的原图往里嵌入一句 111 bit 的文本后提取端原样输出了这句话 快速上手一行装好依赖 numpy、opencv-python、PyWaveletspip install blind-watermark想装最新开发版git clone https://gitcode.com/GitHub_Trending/bl/blind_watermark cd blind_watermark pip install .最小 Python 示例嵌入一句文本from blind_watermark import WaterMark bwm WaterMark(password_img1, password_wm1) bwm.read_img(examples/pic/ori_img.jpeg) bwm.read_wm(guofei9987 开源万岁, modestr) bwm.embed(output/embedded.png)提取时wm_shape水印比特长度这里是 111是必填的嵌入时建议用len(bwm.wm_bit)记下来bwm2 WaterMark(password_img1, password_wm1) wm bwm2.extract(output/embedded.png, wm_shape111, modestr)不想写代码也可以用命令行对应 cli_tools.pyblind_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 原理白话版把这张图想象成一间仓库管理员把它拆成 4×4 像素的小抽屉。每个抽屉的处理分三步DWT离散小波变换先把整张图拆成主体和细节纹理两层水印只写进细节纹理层——就像只改画布的织纹而不改画面所以肉眼看不到。DCT离散余弦变换对每个 4×4 抽屉内部把内容分解成从低频到高频的 16 个分量相当于把抽屉里的东西按粗细摊开。SVD奇异值分解从摊开的分量里算出这个抽屉的主要重量前两个奇异值 s[0]、s[1]。要写 1 就把重量抬到超过半个刻度要写 0 就压在半个刻度以下。提取时反过来读重量、对半刻度比较就还原出 0/1。两个设计让它在被破坏后还能读出来冗余同一个比特循环写进 YUV 三个通道的多个抽屉。提取时把这些副本取平均再判决个别抽屉被噪声或遮挡打坏也不影响结果。以示例图738×1108为例共 12696 个抽屉单通道可嵌约 12.7 kb。双密码password_img决定往哪些抽屉写、抽屉内分量怎么打乱password_wm把水印比特本身重排。缺任何一把钥匙对方拿到的都是一堆无规律的数字。强度由bwm_core.py里的d136、d220控制值越大越抗攻击但图片失真越大。 效果实测examples/example_str.py 里内置了一整套攻击→提取的对照脚本水印内容都是那句guofei9987 开源万岁8 种攻击后的实际结果| 攻击场景 | 压力参数 | 提取结果 | | -- | -- | -- | | 旋转 45° | 旋转后直接提取 | 与原文一致 | | 随机裁剪截屏 | 先裁剪再缩放 0.7 倍 | 用 recover.py 还原画框后提取一致裁剪参数未知时可用estimate_crop_parameters在 0.5×~2× 内自动搜出 | | 多次遮挡 | 10% 占比遮挡 60 处 | 与原文一致 | | 横向裁剪填补 | 裁掉一条后补齐 | 与原文一致 | | 纵向裁剪填补 | 同上 | 与原文一致 | | 缩放 | 压到 400×300 再还原 | 与原文一致 | | 椒盐噪声 | 5% 概率 | 与原文一致 | | 亮度降低 10% | ratio0.9 调暗 | 与原文一致 |注意裁剪/缩放类攻击的提取流程先按recover_crop把图拉回原始画幅再走普通提取——这正是它比逐像素比对方案实用的地方。✅ 什么场景该用、怎么用好按人群说摄影师、设计师做版权存证用文本水印写作者名 时间戳发布前统一嵌入。关键是留好底档两个密码值和wm_shape水印比特长度必须记下来提取时缺一不可。媒体平台做内容溯源用modebit嵌渠道编号比如 6 个比特区分 64 个分发源提取端对浮点结果取 0.5 阈值还原比特。电商、证书防伪用modeimg嵌二维码或 Logo提取时传wm_shape(128, 128)和out_wm_name水印直接存成图片肉眼可验。安全习惯默认密码1只适合做 demo正式使用请换独立密码并对不同图片使用不同的password_img/password_wm组合避免一套钥匙泄密导致批量可提取。批量处理WaterMark(processes...)支持多进程/多线程None表示占满全部核心可参考 examples/example_str_multi.py。 源码导读blind_watermark/ ├── blind_watermark.py # WaterMark 对外接口read_img / read_wm / embed / extract ├── bwm_core.py # DWT-DCT-SVD 核心算法4×4 分块的嵌入与判决 ├── att.py # 攻击模拟裁剪、旋转、遮挡、椒盐、亮度 ├── recover.py # 裁剪攻击参数估计与画框还原 ├── cli_tools.py # blind_watermark 命令行入口 ├── pool.py # 多进程/多线程池 AutoPool └── examples/ # 可直接运行的示例str / img / bit / 多进程想深入就看两个文件核心算法 bwm_core.py 里block_add_wm_slow/block_get_wm_slow是写 1 抬刻度、读 1 比刻度的全部秘密攻击模块 att.py 可以照抄到你的测试里。代码量不大、依赖只有三个库从pip install blind-watermark到第一张带水印的图出来5 分钟内足够。建议今天就拿一张自己的作品图跑一遍嵌入 8 种攻击对照脚本确认在你真实的分发渠道里水印读得回来再投入使用。【免费下载链接】blind_watermarkBlindInvisible Watermark 图片盲水印提取水印无须原图项目地址: https://gitcode.com/GitHub_Trending/bl/blind_watermark创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表