代码拉取完成,页面将自动刷新
同步操作将从 guofei9987/blind_watermark 强制同步,此操作会覆盖自 Fork 仓库以来所做的任何修改,且无法恢复!!!
确定后同步将在后台操作,完成时将刷新页面,请耐心等待。
基于频域的数字盲水印
pip install blind-watermark
或者安装最新开发版本
git clone git@github.com:guofei9987/blind_watermark.git
cd blind_watermark
pip install .
# 嵌入水印:
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
原图 + 水印 = 打上水印的图
+ '@guofei9987 开源万岁!' =
参考 代码
嵌入水印
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)
Output:
@guofei9987 开源万岁!
攻击方式 | 攻击后的图片 | 提取的水印 |
---|---|---|
旋转攻击45度 | '@guofei9987 开源万岁!' | |
随机截图 | '@guofei9987 开源万岁!' | |
多遮挡 | '@guofei9987 开源万岁!' | |
横向裁剪50% | '@guofei9987 开源万岁!' | |
纵向裁剪50% | '@guofei9987 开源万岁!' | |
缩放攻击 | '@guofei9987 开源万岁!' | |
椒盐攻击 | '@guofei9987 开源万岁!' | |
亮度攻击 | '@guofei9987 开源万岁!' |
参考 代码
嵌入:
from blind_watermark import WaterMark
bwm1 = WaterMark(password_wm=1, password_img=1)
# read original image
bwm1.read_img('pic/ori_img.jpg')
# read watermark
bwm1.read_wm('pic/watermark.png')
# embed
bwm1.embed('output/embedded.png')
提取:
bwm1 = WaterMark(password_wm=1, password_img=1)
# notice that wm_shape is necessary
bwm1.extract(filename='output/embedded.png', wm_shape=(128, 128), out_wm_name='output/extracted.png', )
攻击方式 | 攻击后的图片 | 提取的水印 |
---|---|---|
旋转攻击45度 | ||
随机截图 | ||
多遮挡 |
参考 代码
作为 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/ori_img.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之间的实数,方便用户自行卡阈值。如果水印信息量远小于图片可容纳量,偏差极小。
WaterMark(..., processes=None)
processes
: 整数,指定线程数。默认为 None
, 表示使用全部线程。text_blind_watermark: https://github.com/guofei9987/text_blind_watermark
文本盲水印,把信息隐秘地打入文本.
此处可能存在不合适展示的内容,页面不予展示。您可通过相关编辑功能自查并修改。
如您确认内容无涉及 不当用语 / 纯广告导流 / 暴力 / 低俗色情 / 侵权 / 盗版 / 虚假 / 无价值内容或违法国家有关法律法规的内容,可点击提交进行申诉,我们将尽快为您处理。