Skip to main content

Blind Watermark in Python

Project description

blind-watermark

基于傅里叶变换的数字盲水印

如何使用

嵌入水印

from blind_watermark import WaterMark

bwm1 = WaterMark(password_wm=1, password_img=1)

# 读取原图
bwm1.read_ori_img('pic/原图.jpg')

# 读取水印
bwm1.read_wm('pic/水印.png')

# 打上盲水印
bwm1.embed('output/打上水印的图.png')

提取水印

from blind_watermark import WaterMark

bwm1 = WaterMark(4399, 2333, 36, 20, wm_shape=(128, 128))
# 注意需要设定水印的长宽wm_shape
bwm1.extract('output/打上水印的图.png', 'output/解出的水印.png')

效果展示

原图 水印
水印
嵌入后的图 提取的水印
提取的水印

各种攻击后的效果

攻击方式 攻击后的图片 提取的水印
多遮挡
多遮挡攻击.py
多遮挡_提取水印
横向裁剪50%
横向裁剪攻击.py
纵向裁剪10%
纵向裁剪攻击.py
纵向裁剪
缩放攻击(1200X1920->600X800)
缩放攻击.py
椒盐攻击
椒盐击.py
亮度提高10%
亮度调高攻击.py
亮度调低10%
亮度调暗攻击.py
旋转攻击45度
旋转攻击.py

隐水印还可以是二进制数据

作为 demo, 如果要嵌入是如下长度为6的二进制数据

wm = [True, False, True, True, True, False]

嵌入水印

# 除了嵌入图片,也可以嵌入比特类数据
from blind_watermark import WaterMark

bwm1 = WaterMark(password_img=1, password_wm=1)
bwm1.read_ori_img('pic/原图.jpg')
bwm1.read_wm([True, False, True, True, True, False], mode='bit')
bwm1.embed('output/打上水印的图.png')

解水印:(注意设定水印形状 wm_shape

bwm1 = WaterMark(password_img=1, password_wm=1, wm_shape=6)
wm_extract = bwm1.extract('output/打上水印的图.png', mode='bit')
print(wm_extract)

解出的水印是一个0~1之间的实数,方便用户自行卡阈值。如果水印信息量远小于图片可容纳量,偏差极小。


几种隐写术比较:

方法 示例 埋入信息量 是否有损 鲁棒性 隐蔽性
隐写在频域上 有损 很强,抗各种攻击。 很强
隐写在空域上 无损
图种 copy /b xx.jpg+xx.rar xx.jpg 理论上无上限 无损 几乎无,像素和文件大小不匹配、扫描内容都可以发现

Project details


Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

blind_watermark-0.0.1.tar.gz (6.7 kB view hashes)

Uploaded Source

Built Distribution

blind_watermark-0.0.1-py3-none-any.whl (8.0 kB view hashes)

Uploaded Python 3

Supported by

AWS AWS Cloud computing and Security Sponsor Datadog Datadog Monitoring Fastly Fastly CDN Google Google Download Analytics Microsoft Microsoft PSF Sponsor Pingdom Pingdom Monitoring Sentry Sentry Error logging StatusPage StatusPage Status page