From 9d0acdb8593e99d631858ae0e04702f2c6bd5890 Mon Sep 17 00:00:00 2001 From: guofei9987 Date: Sat, 18 Dec 2021 22:02:17 +0800 Subject: [PATCH] simplify examples --- .travis.yml | 5 +- README.md | 7 ++ README_cn.md | 7 ++ examples/{bit_wm_att.py => bit_att.py} | 55 ++++++++------- examples/str_att.py | 98 ++++++++++++++++++++++++++ 5 files changed, 145 insertions(+), 27 deletions(-) rename examples/{bit_wm_att.py => bit_att.py} (74%) create mode 100644 examples/str_att.py diff --git a/.travis.yml b/.travis.yml index d41cf7b..5fa3103 100644 --- a/.travis.yml +++ b/.travis.yml @@ -13,9 +13,8 @@ install: # command to run tests script: - cd examples - - coverage run -p origin_bit.py - - coverage run -p origin.py - - coverage run -p origin_str.py + - coverage run -p bit_att.py + - coverage run -p str_att.py - cp .coverage.* .. - cd .. diff --git a/README.md b/README.md index 5f906d3..b7d31ae 100644 --- a/README.md +++ b/README.md @@ -115,6 +115,10 @@ bwm1.extract(filename='output/embedded.png', wm_shape=(128, 128), out_wm_name='o ### embed string + +See it [here](/examples/str_att.py) + + Embed: ```python from blind_watermark import WaterMark @@ -139,6 +143,9 @@ Output: ### embed array of bits +See it [here](/examples/bit_att.py) + + As demo, we embed 6 bytes data: ```python wm = [True, False, True, True, True, False] diff --git a/README_cn.md b/README_cn.md index bb8805f..96ca096 100644 --- a/README_cn.md +++ b/README_cn.md @@ -96,6 +96,10 @@ bwm1.extract(filename='output/打上水印的图.png', wm_shape=(128, 128), out_ |亮度调低10%
[亮度调暗攻击.py](https://github.com/guofei9987/blind_watermark/blob/master/examples/亮度调低攻击.py)|![亮度调低攻击](docs/亮度调低攻击.jpg)|![](docs/亮度调低攻击_提取水印.png)| ### 嵌入字符串 + +参考 [代码](/examples/str_att.py) + + 嵌入: ```python from blind_watermark import WaterMark @@ -121,6 +125,9 @@ Output: ### 隐水印还可以是二进制数据 +参考 [代码](/examples/bit_att.py) + + 作为 demo, 如果要嵌入是如下长度为6的二进制数据 ```python wm = [True, False, True, True, True, False] diff --git a/examples/bit_wm_att.py b/examples/bit_att.py similarity index 74% rename from examples/bit_wm_att.py rename to examples/bit_att.py index e110bf3..fc08771 100644 --- a/examples/bit_wm_att.py +++ b/examples/bit_att.py @@ -7,7 +7,7 @@ from blind_watermark import WaterMarkCore import numpy as np -#%% +# %% bwm1 = WaterMark(password_img=1, password_wm=1) @@ -21,54 +21,61 @@ # 打上盲水印 bwm1.embed('output/embedded.png') +len_wm = len(wm) # 解水印需要用到长度 + # %% 解水印 # 注意设定水印的长宽wm_shape bwm1 = WaterMark(password_img=1, password_wm=1) -wm_extract = bwm1.extract('output/embedded.png', wm_shape=10, mode='bit') +wm_extract = bwm1.extract('output/embedded.png', wm_shape=len_wm, mode='bit') print("不攻击的提取结果:", wm_extract) assert np.all(wm == wm_extract), '提取水印和原水印不一致' - # %%截屏攻击 -att.cut_att('output/embedded.png', 'output/截屏攻击.png', o1=(0.2, 0.2), o2=(0.4, 0.5)) +o1 = (0.2, 0.2) +o2 = (0.4, 0.5) + +att.cut_att('output/embedded.png', 'output/截屏攻击.png', o1=o1, o2=o2) bwm1 = WaterMark(password_wm=1, password_img=1) -wm_extract = bwm1.extract('output/截屏攻击.png', wm_shape=10, mode='bit') -print("截屏攻击后的提取结果:", wm_extract) +wm_extract = bwm1.extract('output/截屏攻击.png', wm_shape=len_wm, mode='bit') +print("截屏攻击{o1},{o2}后的提取结果:".format(o1=o1, o2=o2), wm_extract) assert np.all(wm == wm_extract), '提取水印和原水印不一致' # %% # 一次横向裁剪打击 -att.cut_att_width('output/embedded.png', 'output/横向裁剪攻击.png', ratio=0.2) +r = 0.2 +att.cut_att_width('output/embedded.png', 'output/横向裁剪攻击.png', ratio=r) att.anti_cut_att('output/横向裁剪攻击.png', 'output/横向裁剪攻击_填补.png', origin_shape=(1200, 1920)) # 提取水印 bwm1 = WaterMark(password_wm=1, password_img=1) -wm_extract = bwm1.extract('output/横向裁剪攻击_填补.png', wm_shape=10, mode='bit') -print("横向裁剪攻击后的提取结果:", wm_extract) +wm_extract = bwm1.extract('output/横向裁剪攻击_填补.png', wm_shape=len_wm, mode='bit') +print(f"横向裁剪攻击r={r}后的提取结果:", wm_extract) assert np.all(wm == wm_extract), '提取水印和原水印不一致' # %%一次纵向裁剪攻击 -att.cut_att_height('output/embedded.png', 'output/纵向裁剪攻击.png', ratio=0.2) +ratio = 0.2 +att.cut_att_height('output/embedded.png', 'output/纵向裁剪攻击.png', ratio=ratio) att.anti_cut_att('output/纵向裁剪攻击.png', 'output/纵向裁剪攻击_填补.png', origin_shape=(1200, 1920)) # 提取 bwm1 = WaterMark(password_wm=1, password_img=1) bwm1.extract(filename="output/纵向裁剪攻击_填补.png", wm_shape=(128, 128), out_wm_name="output/纵向裁剪攻击_提取水印.png") -wm_extract = bwm1.extract('output/纵向裁剪攻击_填补.png', wm_shape=10, mode='bit') -print("纵向裁剪攻击后的提取结果:", wm_extract) +wm_extract = bwm1.extract('output/纵向裁剪攻击_填补.png', wm_shape=len_wm, mode='bit') +print(f"纵向裁剪攻击ratio={ratio}后的提取结果:", wm_extract) assert np.all(wm == wm_extract), '提取水印和原水印不一致' # %%椒盐攻击 -att.salt_pepper_att('output/embedded.png', 'output/椒盐攻击.png', ratio=0.05) +ratio = 0.05 +att.salt_pepper_att('output/embedded.png', 'output/椒盐攻击.png', ratio=ratio) # ratio是椒盐概率 # 提取 -wm_extract = bwm1.extract('output/椒盐攻击.png', wm_shape=10, mode='bit') -print("纵向裁剪攻击后的提取结果:", wm_extract) +wm_extract = bwm1.extract('output/椒盐攻击.png', wm_shape=len_wm, mode='bit') +print(f"椒盐攻击ratio={ratio}后的提取结果:", wm_extract) assert np.all(wm == wm_extract), '提取水印和原水印不一致' # %%旋转攻击 @@ -77,18 +84,18 @@ # 提取水印 bwm1 = WaterMark(password_wm=1, password_img=1) -wm_extract = bwm1.extract('output/旋转攻击_还原.png', wm_shape=10, mode='bit') -print("纵向裁剪攻击后的提取结果:", wm_extract) +wm_extract = bwm1.extract('output/旋转攻击_还原.png', wm_shape=len_wm, mode='bit') +print("旋转攻击后的提取结果:", wm_extract) assert np.all(wm == wm_extract), '提取水印和原水印不一致' -# %%多遮挡攻击 - -att.shelter_att('output/embedded.png', 'output/多遮挡攻击.png', ratio=0.1, n=60) +# %%遮挡攻击 +n = 60 +att.shelter_att('output/embedded.png', 'output/多遮挡攻击.png', ratio=0.1, n=n) # 提取 bwm1 = WaterMark(password_wm=1, password_img=1) -wm_extract = bwm1.extract('output/多遮挡攻击.png', wm_shape=10, mode='bit') -print("纵向裁剪攻击后的提取结果:", wm_extract) +wm_extract = bwm1.extract('output/多遮挡攻击.png', wm_shape=len_wm, mode='bit') +print(f"遮挡攻击{n}后的提取结果:", wm_extract) assert np.all(wm == wm_extract), '提取水印和原水印不一致' # %%缩放攻击 @@ -97,6 +104,6 @@ # out_shape 是分辨率,需要颠倒一下 bwm1 = WaterMark(password_wm=1, password_img=1) -wm_extract = bwm1.extract('output/多遮挡攻击.png', wm_shape=10, mode='bit') -print("纵向裁剪攻击后的提取结果:", wm_extract) +wm_extract = bwm1.extract('output/多遮挡攻击.png', wm_shape=len_wm, mode='bit') +print("缩放攻击后的提取结果:", wm_extract) assert np.all(wm == wm_extract), '提取水印和原水印不一致' diff --git a/examples/str_att.py b/examples/str_att.py new file mode 100644 index 0000000..3ab52dc --- /dev/null +++ b/examples/str_att.py @@ -0,0 +1,98 @@ +#!/usr/bin/env python3 +# -*- coding: utf-8 -*- +# embed string +import numpy as np +from blind_watermark import WaterMark +from blind_watermark import att + +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) + +assert wm == wm_extract, '提取水印和原水印不一致' + +# %%截屏攻击 +o1 = (0.2, 0.2) +o2 = (0.4, 0.5) + +att.cut_att('output/embedded.png', 'output/截屏攻击.png', o1=o1, o2=o2) + +bwm1 = WaterMark(password_wm=1, password_img=1) +wm_extract = bwm1.extract('output/截屏攻击.png', wm_shape=len_wm, mode='str') +print("截屏攻击{o1},{o2}后的提取结果:".format(o1=o1, o2=o2), wm_extract) +assert wm == wm_extract, '提取水印和原水印不一致' + +# %% +# 一次横向裁剪打击 +r = 0.2 +att.cut_att_width('output/embedded.png', 'output/横向裁剪攻击.png', ratio=r) +att.anti_cut_att('output/横向裁剪攻击.png', 'output/横向裁剪攻击_填补.png', origin_shape=(1200, 1920)) + +# 提取水印 +bwm1 = WaterMark(password_wm=1, password_img=1) +wm_extract = bwm1.extract('output/横向裁剪攻击_填补.png', wm_shape=len_wm, mode='str') +print(f"横向裁剪攻击r={r}后的提取结果:", wm_extract) + +assert wm == wm_extract, '提取水印和原水印不一致' + +# %%一次纵向裁剪攻击 +r = 0.2 +att.cut_att_height('output/embedded.png', 'output/纵向裁剪攻击.png', ratio=r) +att.anti_cut_att('output/纵向裁剪攻击.png', 'output/纵向裁剪攻击_填补.png', origin_shape=(1200, 1920)) + +# 提取 +bwm1 = WaterMark(password_wm=1, password_img=1) +bwm1.extract(filename="output/纵向裁剪攻击_填补.png", wm_shape=(128, 128), out_wm_name="output/纵向裁剪攻击_提取水印.png") +wm_extract = bwm1.extract('output/纵向裁剪攻击_填补.png', wm_shape=len_wm, mode='str') +print(f"纵向裁剪攻击r={r}后的提取结果:", wm_extract) + +assert wm == wm_extract, '提取水印和原水印不一致' +# %%椒盐攻击 +ratio = 0.05 +att.salt_pepper_att('output/embedded.png', 'output/椒盐攻击.png', ratio=ratio) +# ratio是椒盐概率 + +# 提取 +wm_extract = bwm1.extract('output/椒盐攻击.png', wm_shape=len_wm, mode='str') +print(f"椒盐攻击ratio={ratio}后的提取结果:", wm_extract) +assert np.all(wm == wm_extract), '提取水印和原水印不一致' + +# %%旋转攻击 +angle = 45 +att.rot_att('output/embedded.png', 'output/旋转攻击.png', angle=angle) +att.rot_att('output/旋转攻击.png', 'output/旋转攻击_还原.png', angle=-angle) + +# 提取水印 +bwm1 = WaterMark(password_wm=1, password_img=1) +wm_extract = bwm1.extract('output/旋转攻击_还原.png', wm_shape=len_wm, mode='str') +print(f"旋转攻击angle={angle}后的提取结果:", wm_extract) +assert wm == wm_extract, '提取水印和原水印不一致' + +# %%遮挡攻击 +n = 60 +att.shelter_att('output/embedded.png', 'output/多遮挡攻击.png', ratio=0.1, n=n) + +# 提取 +bwm1 = WaterMark(password_wm=1, password_img=1) +wm_extract = bwm1.extract('output/多遮挡攻击.png', wm_shape=len_wm, mode='str') +print(f"遮挡攻击{n}次后的提取结果:", wm_extract) +assert wm == wm_extract, '提取水印和原水印不一致' + +# %%缩放攻击 +att.resize_att('output/embedded.png', 'output/缩放攻击.png', out_shape=(800, 600)) +att.resize_att('output/缩放攻击.png', 'output/缩放攻击_还原.png', out_shape=(1920, 1200)) +# out_shape 是分辨率,需要颠倒一下 + +bwm1 = WaterMark(password_wm=1, password_img=1) +wm_extract = bwm1.extract('output/多遮挡攻击.png', wm_shape=len_wm, mode='str') +print("缩放攻击后的提取结果:", wm_extract) +assert np.all(wm == wm_extract), '提取水印和原水印不一致'