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 中的位运算函数之一,用于对两幅二值图像进行按位"与"操作。具体来说,对于每个像素,将两幅输入图像相应位置的像素值分别进行按位"与"运算,输出的结果图像的对应像素值即为这两幅输入图像对应像素值的按位与结果。

相关推荐
limuyang22 小时前
我在 2核2G 云主机上跑 OpenViking:一次关于云主机、模型选型与长期成本的真实复盘
人工智能·开源·ai编程
Shulex3 小时前
跨境电商 AI Agent 核心架构解析:从只读问答到自主执行的工程落地
人工智能·架构·智能客服·跨境电商
Java后端的Ai之路3 小时前
CAS并发控制-从CPU指令到企业级乐观锁
vue.js·人工智能·python·cas·乐观锁
情 九3 小时前
MCP 实战 06:把 HTTP 接口接成工具,让 AI 帮你查数据
人工智能·网络协议·http·mcp
码农小旋风4 小时前
Ray分布式计算引擎介绍
人工智能·架构
火山引擎和TA的超级拍档们4 小时前
产品情报局 08 | AI 内容助手:全网热点驱动,一站式打通内容生产全链路
人工智能
Binovate缤江数智4 小时前
水泵远程开关之后,还需要管什么?数智开关在无人值守泵站中的监测、保护与能耗分析
人工智能·物联网
素男4 小时前
两个月不是六十天
人工智能·agent·self-becoming·ai长期记忆·ai自我介绍
byte轻骑兵4 小时前
【LMP】规范精讲[10]: 语音专线开线记——SCO 固定占座与 eSCO 限时重传
人工智能·人机交互·lmp·蓝牙链路管理·蓝牙外设