9-数字水印的嵌入和提取

复制代码
  在对图像进行操作的过程中,经常会遇到要对图像嵌入和提取数字水印的情况。使用 OpenCV 提供的位运算函数实现对图像嵌入和提取水印的操作,从而将秘密信息嵌入图像或从图像中提取秘密信息。
  有如下原始图像和水印图像:

1.使用位运算实现数字水印的嵌入

python 复制代码
import cv2
import numpy as np
# 读取原图像和水印图像
raccoon = cv2.imread('images/Raccoon.png',0)
watermark = cv2.imread('images/opencv.png',0)
# 将水印图像内的值255处理为1,以方便嵌入
w = watermark[:, :] >0

watermark[w] = 1
# 获取图像raccoon的长宽,生成一个和Raccoon同样大小元素值都是254的数组。
r,c = raccoon.shape
t254 = np.ones([r,c],dtype=np.uint8)*254
# 获取图像Raccoon像素二进制码的高7位,用cv2.bitwise_or()函数将watermark二进制码的最低位嵌入RaccoonH7内。
raccoonH7 = cv2.bitwise_and(raccoon,t254)
e = cv2.bitwise_or(raccoonH7,watermark)
# 展示原始图像Raccoon,水印图像watermark和含水印的载体图像e
cv2.imshow('raccoon',raccoon)
cv2.imshow('watermark',watermark*255)
cv2.imshow('e',e)
cv2.waitKey()

cv2.destroyAllWindows()

运行结果:

2.使用位运算实现数字水印的提取

python 复制代码
import cv2
import numpy as np
# 读取含水印的载体图像e
e = cv2.imread('images/e.png',0)
# 获取图像e的长宽,生成一个和e同样大小元素值都是1的数组
r,c = e.shape
t1 = np.ones([r,c],dtype=np.uint8)
# 使用 cv2.bitwise_and()函数将e与t1经行运算,获取图像e像素二进制码的最低位,并将之存在wm中
wm = cv2.bitwise_and(e,t1)
# 找到wm中大于0的像素,将之置为255,以还原二值水印图像
w = wm[:, :] >0
wm[w] = 255
# 显示原始图像Raccoon,水印图像watermark和含水印的载体图像e
cv2.imshow('e',e)
cv2.imshow('wm',wm)
cv2.waitKey()
cv2.destroyAllWindows()

运行结果:

说明:

cv2.bitwise_and() 是 OpenCV 中的位运算函数之一,用于对两幅二值图像进行按位"与"操作。具体来说,对于每个像素,将两幅输入图像相应位置的像素值分别进行按位"与"运算,输出的结果图像的对应像素值即为这两幅输入图像对应像素值的按位与结果。

相关推荐
在水一缸12 小时前
苹果AI国行版过审背后的技术架构深度解析:端侧模型与私有云计算的融合实践
人工智能·架构·云计算·技术架构·苹果ai·端侧模型·私有云计算
乔氪智造12 小时前
我给 Agent 写的循环,一半是护栏
人工智能
武子康12 小时前
Shippy 全拆:3 个集合收缩(动作 / 状态 / 后果)+ 4 类边界(版本化行为 / Typed API / CLI / Sandbox)
人工智能·agent·aiops
QXWZ_IA12 小时前
桥梁数字孪生怎么落地?
人工智能·科技·算法·智能硬件·政务
Kel12 小时前
输出层与反分词(Output Layer & Detokenization)
人工智能·算法·架构
Nturmoils12 小时前
三伏天正是减肥天:我在 EdgeOne Makers 上从 0 到 1 上线了一个 AI 健康教练
人工智能
猿的天空12 小时前
机器人双手迎来全栈训练系统:灵初智能EgoSteer让灵巧手无所不能
网络·人工智能·计算机·ai·程序员·机器人·编程
刘海东刘海东12 小时前
人工智能图论(提纲)
人工智能
陕西企来客12 小时前
2026年7月技术好GEO优化方案:算法适配与内容策略
人工智能·算法·机器学习·技术好geo优化
想会飞的蒲公英12 小时前
用 Streamlit 给文本分类模型做一个演示页面
人工智能·python·机器学习