这里介绍用opencv去操作的最简单的一种方法的代码流程,示例用黑白数字,实际上只要是黑白纯色的二值图像都可以用该方法去插入提取水印。
原理:
嵌入时先将数字水印处理成二值(0 1)图像, 然后利用位操作插入原图的最后一个位平面,这样在观感上不会对原图造成任何影响。
提取时相反操作即可。
from operator import mod
import cv2
import numpy as np
def show(img_name, img):
cv2.imshow(img_name, img)
cv2.waitKey()
cv2.destroyAllWindows()
img = cv2.imread("../16838648_415acd9e3f.jpg", 1) # 原图
w, h, c = img.shape
digital = cv2.imread("digital.jpg", 0) # 水印图像
digital = cv2.resize(digital, (h, w)) # 处理成同样大小
# 因为我这图是随便截的所以说不是严格的二值图像,这里处理一下
mask_temp = digital < 128
digital[mask_temp] = 0
mask_temp = digital > 128
digital[mask_temp] = 255
show("digital", digital)
mask_temp = digital > 0
digital[mask_temp] = 1 # 处理成二值图像方便去插入位平面
# 接下来利用位运算去做嵌入
img = (img >> 1) << 1 # 将img的位平面中最后一位变为0 就比如说原本img是10111111,操作后变为1011