保护你的创意!让图片拥有盲水印[特殊字符][特殊字符]
图像盲水印:Blind&Invisible Watermark
在数字时代,保护我们的创作变得日益重要。无论是摄影师的作品,还是设计师的图像,很多时候,我们希望在不影响视觉效果的前提下,秘密地嵌入一些信息以保护版权。今天,我们将介绍一个强大的开源项目——Blind&Invisible Watermark,它使用盲水印技术,利用离散小波变换、离散余弦变换和奇异值分解(DWT-DCT-SVD)方法嵌入和提取水印,甚至无须使用原始图像。
安装指南
想要使用Blind Watermark,只需通过Python的包管理工具pip进行安装,命令如下:
pip install blind-watermark
对于开发者版本,可以通过以下命令进行安装:
git clone git@github.com:guofei9987/blind_watermark.git
cd blind_watermark
pip install .
使用方法
基于命令行的使用
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
基于Python的使用
对于喜欢编程的用户,这里有Python代码示例来演示如何嵌入和提取水印。
嵌入水印
from blind_watermark import WaterMark# 创建水印对象
bwm1 = WaterMark(password_img=1, password_wm=1)# 读取原始图像
bwm1.read_img('pic/ori_img.jpg')
# 定义水印内容
wm = '@guofei9987 开源万岁!'
# 读取水印
bwm1.read_wm(wm, mode='str')
# 嵌入水印
bwm1.embed('output/embedded.png')# 输出水印位长度
len_wm = len(bwm1.wm_bit)
print('Put down the length of wm_bit {len_wm}'.format(len_wm=len_wm))
提取水印
bwm1 = WaterMark(password_img=1, password_wm=1)
wm_extract = bwm1.extract('output/embedded.png', wm_shape=len_wm, mode='str')
print(wm_extract)
输出结果将显示提取的水印内容:
@guofei9987 开源万岁!
水印抗攻击能力
Blind Watermark在处理盲水印时表现出色,能够抵御多种形式的攻击。以下为几种攻击及其结果的示例。
| 攻击方法 | 攻击后的图像 | 提取的水印 |
|---|---|---|
| 旋转45度 | ‘@guofei9987 开源万岁!’ | |
| 随机裁剪 | ‘@guofei9987 开源万岁!’ | |
| 遮挡 | ‘@guofei9987 开源万岁!’ | |
| 横向裁剪 | ‘@guofei9987 开源万岁!’ | |
| 纵向裁剪 | ‘@guofei9987 开源万岁!’ | |
| 缩放 | ‘@guofei9987 开源万岁!’ | |
| 椒盐噪声 | ‘@guofei9987 开源万岁!’ | |
| 亮度降低10% | E%25E5%25BA%25A6%25E6%2594%25BB%25E5%2587%25BA.jpg&pos_id=img-FJFWf20q-1761576762357) | ‘@guofei9987 开源万岁!’ |
这些抗击能力使得Blind Watermark在许多应用场景中都具有实用性,比如图像版权保护、数据隐藏及安全传输等。
扩展知识:嵌入水印的图像及数组位
除了基于字符串的水印,Blind Watermark还支持嵌入位数组数据,以下是一个简单的示例:
# 嵌入位数组
wm = [True, False, True, True, True, False]from blind_watermark import WaterMarkbwm1 = WaterMark(password_img=1, password_wm=1)
bwm1.read_ori_img('pic/ori_img.jpg')
bwm1.read_wm(wm, mode='bit')
bwm1.embed('output/embedded.png')
提取水印的代码段如下:
bwm1 = WaterMark(password_img=1, password_wm=1, wm_shape=6)
wm_extract = bwm1.extract('output/打上水印的图.png', mode='bit')
print(wm_extract)
提取出的结果是一个浮点数组,通常可以设定一个阈值(如0.5)进行处理。
结语
Blind Watermark不仅技术实现合理,且提供了丰富的功能和易用的接口,适合需求多样的开发者和用户。若你对数字水印感兴趣,或想在你的项目中加入水印处理功能,不妨试试Blind Watermark!
同类项目介绍
-
text_blind_watermark:此项目能够将消息嵌入文本中,功能实用且易于使用。GitHub链接
-
HideInfo:该项目支持将信息隐藏为图像、声音和文本,适合多媒体信息的隐匿保护。GitHub链接
以上项目在水印和信息隐藏领域也具备各自独特的应用场景和实现方法,值得进一步探索。
