#!/usr/bin/env python

-- coding: utf8 --

import sys import random

cmd = None seed = 20160930 oldseed = False alpha = 3.0

if name == 'main': if '-h' in sys.argv or '--help' in sys.argv or len(sys.argv) < 2: print ('Usage: python bwm.py [arg...] [opts...]') print (' cmds:') print (' encode <image(encoded)>') print (' image + watermark -> image(encoded)') print (' decode <image(encoded)> ') print (' image + image(encoded) -> watermark') print (' opts:') print (' --seed , Manual setting random seed (default is 20160930)') print (' --oldseed Use python2 random algorithm.') print (' --alpha , Manual setting alpha (default is 3.0)') sys.exit(1) cmd = sys.argv[1] if cmd != 'encode' and cmd != 'decode': print ('Wrong cmd %s' % cmd) sys.exit(1) if '--seed' in sys.argv: p = sys.argv.index('--seed') if len(sys.argv) <= p+1: print ('Missing for --seed') sys.exit(1) seed = int(sys.argv[p+1]) del sys.argv[p+1] del sys.argv[p] if '--oldseed' in sys.argv: oldseed = True del sys.argv[sys.argv.index('--oldseed')] if '--alpha' in sys.argv: p = sys.argv.index('--alpha') if len(sys.argv) <= p+1: print ('Missing for --alpha') sys.exit(1) alpha = float(sys.argv[p+1]) del sys.argv[p+1] del sys.argv[p] if len(sys.argv) < 5: print ('Missing arg...') sys.exit(1) fn1 = sys.argv[2] fn2 = sys.argv[3] fn3 = sys.argv[4]

import cv2 import numpy as np

def bgr_to_rgb(img): b, g, r = cv2.split(img) return cv2.merge([r, g, b])

if cmd == 'encode': img = cv2.imread(fn1) wm = cv2.imread(fn2)

h, w = img.shape[0], img.shape[1]
hwm = np.zeros((int(h * 0.5), w, img.shape[2]))
assert hwm.shape[0] > wm.shape[0]
assert hwm.shape[1] > wm.shape[1]
hwm2 = np.copy(hwm)
for i in range(wm.shape[0]):
    for j in range(wm.shape[1]):
        hwm2[i][j] = wm[i][j]

if oldseed: random.seed(seed,version=1)
else: random.seed(seed)
m, n = list(range(hwm.shape[0])), list(range(hwm.shape[1]))
if oldseed:
    random.shuffle(m,random=random.random)
    random.shuffle(n,random=random.random)
else:
    random.shuffle(m)
    random.shuffle(n)

for i in range(hwm.shape[0]):
    for j in range(hwm.shape[1]):
        hwm[i][j] = hwm2[m[i]][n[j]]

rwm = np.zeros(img.shape)
for i in range(hwm.shape[0]):
    for j in range(hwm.shape[1]):
        rwm[i][j] = hwm[i][j]
        rwm[rwm.shape[0] - i - 1][rwm.shape[1] - j - 1] = hwm[i][j]

f1 = np.fft.fft2(img)
f2 = f1 + alpha * rwm
_img = np.fft.ifft2(f2)

img_wm = np.real(_img)

assert cv2.imwrite(fn3, img_wm, [int(cv2.IMWRITE_JPEG_QUALITY), 100])

img_wm2 = cv2.imread(fn3)
sum = 0
for i in range(img_wm.shape[0]):
    for j in range(img_wm.shape[1]):
        for k in range(img_wm.shape[2]):
            sum += np.power(img_wm[i][j][k] - img_wm2[i][j][k], 2)
miss = np.sqrt(sum) / (img_wm.shape[0] * img_wm.shape[1] * img_wm.shape[2]) * 100
print ('Miss %s%% in save' % miss)

elif cmd == 'decode': img = cv2.imread(fn1) img_wm = cv2.imread(fn2)

if oldseed: random.seed(seed,version=1)
else: random.seed(seed)
m, n = list(range(int(img.shape[0] * 0.5))), list(range(img.shape[1]))
if oldseed:
    random.shuffle(m,random=random.random)
    random.shuffle(n,random=random.random)
else:
    random.shuffle(m)
    random.shuffle(n)

f1 = np.fft.fft2(img)
f2 = np.fft.fft2(img_wm)

rwm = (f2 - f1) / alpha
rwm = np.real(rwm)

wm = np.zeros(rwm.shape)
for i in range(int(rwm.shape[0] * 0.5)):
    for j in range(rwm.shape[1]):
        wm[m[i]][n[j]] = np.uint8(rwm[i][j])
for i in range(int(rwm.shape[0] * 0.5)):
    for j in range(rwm.shape[1]):
        wm[rwm.shape[0] - i - 1][rwm.shape[1] - j - 1] = wm[i][j]
assert cv2.imwrite(fn3, wm)
Python 图片水印嵌入与提取工具

原文地址: https://www.cveoy.top/t/topic/fTge 著作权归作者所有。请勿转载和采集!

免费AI点我,无需注册和登录