嵌入过程:将载体图像的第 0 个位平面替换为数字水印信息(一幅二值图像)。


提取过程:将载体图像的最低有效位所构成的第 0 个位平面提取出来,得到数字水印信


息。


import cv2
 import numpy as np
 #读取原始载体图像
 lena=cv2.imread("lena.bmp",0)
 #读取水印图像
 watermark=cv2.imread("watermark.bmp",0)
 #将水印内的255处理为1,以方便嵌入-切换为二值图
 w=watermark[:,:]>0
 watermark[w]=1
 #读取原始载体图像的shape值
 r,c=lena.shape
 #============嵌入过程============
 #生成内部值都是254的数组
 t254=np.ones((r,c),dtype=np.uint8)*254
 #获取lena图像的高7位
 lenaH7=cv2.bitwise_and(lena,t254)
 #将watermark嵌入到lenaH7内
 e=cv2.bitwise_or(lenaH7,watermark)
 #============提取过程============
 #生成内部值都是1的数组
 t1=np.ones((r,c),dtype=np.uint8)
 #从载体图像内,提取水印图像
 wm=cv2.bitwise_and(e,t1)
 print(wm)
 #将水印内的1处理为255以方便显示-切换为二值图
 w=wm[:,:]>0
 wm[w]=255
 #============显示============
 cv2.imshow("lena",lena)
 cv2.imshow("watermark",watermark*255)   #当前watermark内最大值为1
 cv2.imshow("e",e)
 cv2.imshow("wm",wm)
 cv2.waitKey()
 cv2.destroyAllWindows()
  • 1.
  • 2.
  • 3.
  • 4.
  • 5.
  • 6.
  • 7.
  • 8.
  • 9.
  • 10.
  • 11.
  • 12.
  • 13.
  • 14.
  • 15.
  • 16.
  • 17.
  • 18.
  • 19.
  • 20.
  • 21.
  • 22.
  • 23.
  • 24.
  • 25.
  • 26.
  • 27.
  • 28.
  • 29.
  • 30.
  • 31.
  • 32.
  • 33.
  • 34.

结果:

原图

 

240624 视觉 图片 信息隐藏与展示_opencv

需要隐藏的图片

240624 视觉 图片 信息隐藏与展示_数字水印_02

隐藏信息后的图片

240624 视觉 图片 信息隐藏与展示_数字水印_03