两张看起来相同的图片,为何一张能反解出“我喜欢“?聊聊 BlindWaterMark 盲水印
两张看起来相同的图片为何一张能反解出我喜欢聊聊 BlindWaterMark 盲水印【免费下载链接】BlindWaterMark盲水印 by python项目地址: https://gitcode.com/gh_mirrors/bli/BlindWaterMark朋友发来一张动漫少女的图片我盯着看了十秒确认它就是网上流传很久的那张原图。可朋友说你再仔细看看。我把这张图和另一张没动过手脚的底片一起丢进一个叫 BlindWaterMark 的盲水印工具几秒后屏幕上浮出两个字——我喜欢。那张看起来毫无异常的图片背地里藏着一句话。这正是 BlindWaterMark 在做的事一个用 Python 实现的图片信息隐藏工具把肉眼看不见的信息写进图片里。一张动漫图怎么就突然开口说话了BlindWaterMark 的思路和往角落贴签名完全不同。它不把水印盖在图片表面而是把信息写进图片的数据内部。你盯着成品图看找不出任何破绽但只要同时拿到成品图和原始底片再跑一遍它自带的解码命令藏进去的内容就会原样浮出来。仓库里躺着的几张示例图正好就是这场戏的道具hui.png是原图wm_py3.png是一张黑底白字的水印图上面的字正是我喜欢hui_wm_py3.png则是嵌完水印的成品。三张图摆在一起最直观的感受是——成品和原图几乎没有差别。照片角落里的签名为什么总是被抹掉可是为什么非要把一句话藏进图里这事还得从我那段贴签名的日子说起。在遇见 BlindWaterMark 之前我给图片打版权标记的方式相当原始——往角落塞一个半透明小签名。麻烦很快就来了签名会挡住画面调小了吧看不清调大了吧伤图更糟的是转发的人随手一裁签名就没了。我见过不止一次自己辛苦做的图被转发了几百遍作者那一栏永远写着别人的名字。可见水印这事的尴尬在于太显眼又太脆弱。显眼所以破坏画面脆弱所以一裁就丢。要是存在一种水印让人看不见又裁不掉、撕不走版权纠纷的证据不就稳了吗盲水印要解决的正是这件事。亲手把我喜欢埋进照片的十秒钟第一次上手远比想象中简单。依赖只有两样——opencv-python 和 matplotlib装好之后两条命令就能走完整个流程。pip install -r requirements.txt python bwmforpy3.py encode hui.png wm_py3.png hui_wm_py3.pngencode 后面跟着三个参数原图、水印图、要生成的成品图。连起来读就是把wm_py3.png里那句我喜欢悄悄写进hui.png里。原图 hui.png看起来一切正常。水印 wm_py3.png黑底白字内容只有一句话。成品 hui_wm_py3.png和原图放在一起肉眼几乎找不到差别。三张图连起来看就能理解盲水印和普通签名最大的不同字没有浮在画面上而是沉进了画面里。把字缝进声音的缝隙一次通俗的拆解它到底是怎么做到看不见的我尽量用人话拆开讲。把一张图想象成一场大合唱。你听进去的是主旋律对应图片里清清楚楚的内容比如少女、长椅、飘落的花瓣而在旋律之外还存在一些几乎注意不到的声部。盲水印的思路就是趁你被主旋律吸引的时候把一句话悄悄塞进那些听不清的声部里。落到图像上做法是先把图片做一次傅里叶变换从像素空间搬到频率空间在那里给水印信息留好位置再把整张图变换回去。人眼对画面里大结构的变动极其敏感但对这种藏在频率里的微小扰动几乎毫无察觉。这也是为什么成品看起来和原图一模一样。顺带解释一个容易误会的地方它叫盲水印指的是藏得够深、肉眼看不见但提取时得靠原图帮忙。要读出那句话得把成品和底片做一次相减剩下的差值就是水印本身。原图是那把钥匙缺了它话就捞不出来。把话从图里再捞出来藏进去之后怎么取同样是一条命令python bwmforpy3.py decode hui.png hui_wm_py3.png wm_out_py3.png参数依次是原图、带水印的成品图、输出文件。跑完打开wm_out_py3.png那句我喜欢虽然带着一点噪点但清清楚楚地回来了。提取结果 wm_out_py3.png那句话从一片噪点里重新长了出来。亲眼看着这句话从噪点里浮出来我第一次真切体会到信息藏在图里是什么感觉。仓库里其实放着两个脚本bwm.py对应 Python 2bwmforpy3.py对应 Python 3按自己环境的版本挑一个用就行。三枚开关种子、力度和版本兼容用熟了之后值得玩一玩的还有三个参数都写在脚本的帮助信息里。其中一枚叫--seed随机种子。水印在嵌入前会被打乱成一堆看似无序的噪点而打乱的顺序由种子决定。默认种子是 20160930只要换成一个只有你知道的数字别人就算猜出水印藏在哪也拼不回去。种子相当于给水印上了把锁。python bwmforpy3.py encode hui.png wm_py3.png out.png --seed 20240815另一枚是--alpha水印力度。它控制藏在频率里的信息有多重调大一点水印更扛得住压缩和二次保存但调过头图片会出现可见噪点调小一点画面更干净水印却更容易在传播途中磨损。找一个平衡点通常默认的 3.0 就够用。python bwmforpy3.py encode hui.png wm_py3.png out.png --alpha 5.0最后一枚是--oldseed一个只有老玩家才用得上的兼容开关。Python 2 和 Python 3 的随机算法不同导致两个版本嵌出来的水印互不通用。如果你在 Python 3 环境里想复刻 Python 2 的结果加上这个参数就行。另外还有--debug能把傅里叶频谱、打乱后的水印、加密中间过程一并画出来适合想亲眼看看频率里到底藏了什么的好奇派。python bwmforpy3.py encode hui.png wm_py3.png out.png --oldseed python bwmforpy3.py encode hui.png wm_py3.png out.png --debug朋友式提醒别等水印丢了才看这几条玩了几轮之后有几条经验想直接塞给你。提取的时候一定要留着原图。解码的本质是成品减原图底片一丢话就永远捞不回来了所以原图记得单独备份别跟成品混在一起覆盖掉。成品尽量存成 PNG 这类无损格式。高压缩的 JPEG 会主动丢掉一部分图像信息而丢掉的很可能正是水印那部分每转存一次、压缩一次水印就淡一分。水印图别做得太大。代码默认把水印安置在画面上半区、再对称复制一份这意味着水印的高度不能超过原图的一半、宽度不能超过原图宽度设计水印时越精简越省心。--seed和--alpha一旦设过嵌入和提取就得用同一个值。别一半用默认、一半用自定义两边对不上号解码出来的就是一团乱码。现在轮到你藏一句话了回到开头那张动漫少女的图。知道了来龙去脉之后再看它我突然觉得这张普通的图片多了点故事感——它表面上是一张画内里却是一封没拆的信。盲水印的意义或许正在于此把一段只有知情者能读懂的话托付给一张人畜无害的图片让它穿过无数人的眼睛安静地抵达该到的地方。想亲手试一把的话克隆下来装好依赖就能开工git clone https://gitcode.com/gh_mirrors/bli/BlindWaterMark两张图、两条命令不到一分钟你就能把想说的话藏进一张图里。藏好之后记得叮嘱对方一句把原图也留着那是取回这句话的唯一一把钥匙。【免费下载链接】BlindWaterMark盲水印 by python项目地址: https://gitcode.com/gh_mirrors/bli/BlindWaterMark创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

相关新闻

skinview3d 常见问题排查:皮肤加载失败、字体不显示等10个坑及解决方案

skinview3d 常见问题排查:皮肤加载失败、字体不显示等10个坑及解决方案

skinview3d 常见问题排查:皮肤加载失败、字体不显示等10个坑及解决方案 【免费下载链接】skinview3d Three.js powered Minecraft skin viewer. 项目地址: https://gitcode.com/gh_mirrors/sk/skinview3d skinview3d 是一个基于 Three.js 的 Minecraft 皮肤查…

2026/10/4 18:03:20 阅读更多 →
App开发多少钱?影响 App 开发费用的主要因素

App开发多少钱?影响 App 开发费用的主要因素

App开发多少钱?定制 App 常见预算约为 8 万—50 万元,复杂平台型项目可能超过 50 万元。App开发费用不是按页面数量简单计算,而是由开发方式、安卓/iOS端、UI设计、后台、接口、测试上线和维护范围共同决定。 ## 一、App定制开发多少钱 市场上…

2026/10/1 4:24:15 阅读更多 →
用stock-trading-ml回测交易策略:10美元模拟资金下的买卖信号生成全流程

用stock-trading-ml回测交易策略:10美元模拟资金下的买卖信号生成全流程

用stock-trading-ml回测交易策略:10美元模拟资金下的买卖信号生成全流程 【免费下载链接】stock-trading-ml A stock trading bot that uses machine learning to make price predictions. 项目地址: https://gitcode.com/gh_mirrors/st/stock-trading-ml st…

2026/10/5 1:34:23 阅读更多 →

最新新闻

IMU标定怎么做?多位置任意姿态静止标定法详解

IMU标定怎么做?多位置任意姿态静止标定法详解

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

2026/10/5 7:02:28 阅读更多 →
网络安全意识培训PPT怎么做?从钓鱼邮件到行为改变的完整课件设计

网络安全意识培训PPT怎么做?从钓鱼邮件到行为改变的完整课件设计

简介:这份课件是一套面向企业员工、新入职人员及普通互联网用户的网络安全意识培训PPT,适用于企业信息安全培训、新员工入职教育或高校网络安全通识课程。内容围绕用户安全意识定义与培养展开,系统梳理了病毒木马、信息泄露、社会工程学欺诈、…

2026/10/5 7:02:28 阅读更多 →
QT与FFTW实现周期图法功率谱密度分析:原理、代码与工程坑点

QT与FFTW实现周期图法功率谱密度分析:原理、代码与工程坑点

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

2026/10/5 7:02:28 阅读更多 →
从主从灾难到架构妥协:MySQL Binlog 与隔离级别的演进之路

从主从灾难到架构妥协:MySQL Binlog 与隔离级别的演进之路

在 MySQL 的面试中,我们常听到一句定论:“生产环境推荐使用 Row 格式的 Binlog 配合 RC(读已提交)隔离级别。”但为什么是它们?早期的 MySQL 为什么默认使用 RR(可重复读)?这背后其实…

2026/10/5 7:02:28 阅读更多 →
DeepSeek私有化部署病历智能分析实战:从显存估算到质控编码

DeepSeek私有化部署病历智能分析实战:从显存估算到质控编码

简介:《医疗新势力:程序员运用DeepSeek私有化部署实现病历智能分析》是一份面向程序员、医疗信息化从业者与人工智能落地实践者的技术文档,共27页,聚焦如何利用DeepSeek私有化部署破解病历数据分散、传统分析效率低、医疗信息利用…

2026/10/5 7:02:28 阅读更多 →
【C++面试】vector底层原理:扩容、拷贝移动与迭代器失效

【C++面试】vector底层原理:扩容、拷贝移动与迭代器失效

一、vector底层到底是什么 vector 可以简单理解成&#xff1a; 一块动态申请的连续内存。 例如&#xff1a; std::vector<int> nums;nums.push_back(10); nums.push_back(20); nums.push_back(30); 底层大致可以理解成&#xff1a; 连续内存&#xff1a;┌────…

2026/10/5 7:01:28 阅读更多 →

日新闻

马斯克杀回智能体战场,Grok 4.5万亿参数撑腰,Cursor接手数字白领项目:用TaoToken统一Key跑通多模型Agent工作流

马斯克杀回智能体战场,Grok 4.5万亿参数撑腰,Cursor接手数字白领项目:用TaoToken统一Key跑通多模型Agent工作流

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

2026/10/5 0:00:22 阅读更多 →
AI编程工具插件机制详解:plugin.json配置与加载失败排查指南

AI编程工具插件机制详解:plugin.json配置与加载失败排查指南

1. 从“plugins”这个词说起&#xff1a;它到底在解决什么问题如果你最近在折腾 AI 编程工具&#xff0c;尤其是 Cursor、Codex CLI、Claude Code 这类带 CLI 的编辑器或命令行助手&#xff0c;那你大概率绕不开一个词——plugins。这个词本身不新鲜&#xff0c;从浏览器到 IDE…

2026/10/5 0:00:23 阅读更多 →
第26课:OpenClaw|日志审计与问题诊断:把日志链路改到 TaoToken 的排查清单

第26课:OpenClaw|日志审计与问题诊断:把日志链路改到 TaoToken 的排查清单

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

2026/10/5 0:00:23 阅读更多 →

周新闻

KT148A语音芯片外挂8002D功放的工程实践指南

KT148A语音芯片外挂8002D功放的工程实践指南

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

2026/10/5 5:06:42 阅读更多 →
LLC谐振变换器增益公式推导:从FHA等效到完整归一化表达式

LLC谐振变换器增益公式推导:从FHA等效到完整归一化表达式

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

2026/10/5 1:10:22 阅读更多 →
ARM架构深度解析:从RISC设计理念到交叉编译实战

ARM架构深度解析:从RISC设计理念到交叉编译实战

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

2026/10/5 3:06:17 阅读更多 →

月新闻

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

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

2026/10/4 11:40:45 阅读更多 →
Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

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

2026/10/4 9:43:54 阅读更多 →
黑夜航拍船只数据集训练YOLOV5模型全流程解析

黑夜航拍船只数据集训练YOLOV5模型全流程解析

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

2026/10/4 20:14:29 阅读更多 →