利用opencv for python在lena图中隐藏了数字水印
非常之奇妙有趣,主要是利用了位运算
from cv2 import cv2
import numpy as np
lena = cv2.imread('black.bmp')
watermark = cv2.imread('watermask.bmp')
#图片原本是0和255两个值的图片
#为将其嵌入最低位,将其变为0和1的二值图片
w = watermark[:,:]>0
watermark[w] = 1
#用全为254的矩阵(二进制表示为7个1,最后一位为0)
get_H7_matrix = np.ones(lena.shape,dtype= np.uint8)*254
#用此矩阵与原图进行按位与运算,则提取高7位
lena_H7 = cv2.bitwise_and(lena,get_H7_matrix)
#将最后一位一定为0的高七位矩阵,与最后一位为0或1的水印
#进行按位或运算,则水印的0和1将原封不动的到最低位上去
result = cv2.bitwise_or(lena_H7,watermark)
#下面进行提取
#思路是:利用全1矩阵与图像按位与,则提取最低位的数字
get_L1_matrix = np.ones(lena.shape,dtype=np.uint8)
result1 = cv2.bitwise_and(get_L1_matrix,result)
w = result1[:,:]>0
result1[w] = 255
cv2.imshow('lena',lena)
cv2.imshow('watermark',watermark*255)
cv2.imshow('result',result)
cv2.imshow('result1',result1)
cv2.waitKey()
cv2.destroyAllWindows()
效果如下:
主要参考:《OpenCV轻松入门-面向python》李立宗著