Skip to content

Commit

Permalink
simplify examples
Browse files Browse the repository at this point in the history
  • Loading branch information
guofei9987 committed Dec 18, 2021
1 parent 03d0074 commit 9d0acdb
Show file tree
Hide file tree
Showing 5 changed files with 145 additions and 27 deletions.
5 changes: 2 additions & 3 deletions .travis.yml
Original file line number Diff line number Diff line change
Expand Up @@ -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 ..

Expand Down
7 changes: 7 additions & 0 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand All @@ -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]
Expand Down
7 changes: 7 additions & 0 deletions README_cn.md
Original file line number Diff line number Diff line change
Expand Up @@ -96,6 +96,10 @@ bwm1.extract(filename='output/打上水印的图.png', wm_shape=(128, 128), out_
|亮度调低10%<br>[亮度调暗攻击.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
Expand All @@ -121,6 +125,9 @@ Output:

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

参考 [代码](/examples/bit_att.py)


作为 demo, 如果要嵌入是如下长度为6的二进制数据
```python
wm = [True, False, True, True, True, False]
Expand Down
55 changes: 31 additions & 24 deletions examples/bit_wm_att.py → examples/bit_att.py
Original file line number Diff line number Diff line change
Expand Up @@ -7,7 +7,7 @@
from blind_watermark import WaterMarkCore
import numpy as np

#%%
# %%

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

Expand All @@ -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), '提取水印和原水印不一致'

# %%旋转攻击
Expand All @@ -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), '提取水印和原水印不一致'

# %%缩放攻击
Expand All @@ -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), '提取水印和原水印不一致'
98 changes: 98 additions & 0 deletions examples/str_att.py
Original file line number Diff line number Diff line change
@@ -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), '提取水印和原水印不一致'

0 comments on commit 9d0acdb

Please sign in to comment.