/blind_watermark

Blind Watermark (图片盲水印,提取水印无须原图!)

Primary LanguagePythonMIT LicenseMIT

blind-watermark

Blind watermark based on wavelet transform.

PyPI Build Status codecov License Python Platform stars fork Downloads Discussions

demonstration

install

pip install blind-watermark

For the current developer version:

git clone git@github.com:guofei9987/blind_watermark.git
cd blind_watermark
pip install .

How to use

How to embed watermark:

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')

How to extract watermark

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', )

demos:

origin image watermark
origin_image watermark
image embedded with watermark extracted watermark
打上水印的图 提取的水印

Attack on the embedded image

attack method image after attack extracted watermark
Rotate 45 Degrees
旋转攻击.py
旋转攻击
Many Coverage
多遮挡攻击.py
多遮挡攻击 多遮挡_提取水印
50% Horizontal Crop
横向裁剪攻击.py
横向裁剪攻击
50% Vertical Crop
纵向裁剪攻击.py
纵向裁剪攻击 纵向裁剪
Resize(1200X1920->600X800)
缩放攻击.py
缩放攻击
Pepper Noise
椒盐击.py
椒盐攻击
Brightness 10% Up
亮度调高攻击.py
亮度调高攻击
Brightness 10% Down
亮度调暗攻击.py
亮度调低攻击

embed string

Embed:

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))

Extract:

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 开源**!

embed array of bits

As demo, we embed 6 bytes data:

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

Embed:

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/embedded.png')

Extract:

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

Notice that wm_shape (shape of watermark) is necessary

The output wm_extract is an array of float. set a threshold such as 0.5.

Concurrency

WaterMark(..., processes=None)
  • processes: number of processes, can be integer. Default None, meaning use all processes.