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

相关推荐
不加辣椒1 小时前
第12章 工具调用与 Agent 提示工程
人工智能
用户1693176172661 小时前
前端给AI消息做日期分组与时间线
人工智能
i晟1 小时前
Claude Code Harness 深度拆解:从你敲回车到模型回复,中间发生了什么
人工智能
用户252736278142 小时前
【踩坑复盘】我在本地跑 RAG 知识库时踩了 5 个大坑,吐血整理避坑指南
人工智能
大模型真好玩2 小时前
LangChain DeepAgents 速通指南(九)—— 生产级智能体框架 DeepAgents Code 源码导读
人工智能·langchain·agent
用户018349301695 小时前
用Zustand管理AI多会话状态
人工智能
武子康7 小时前
调查研究-198 Agent 到底该记住什么?读懂《What Must Generalist Agents Remember?》
人工智能·openai·agent
aqi008 小时前
15天学会AI应用开发(九)利用Chroma持久化向量数据
人工智能·python·大模型·ai编程·ai应用
武子康9 小时前
调查研究-197 FAISS vs Elasticsearch 全面对比:从向量检索、全文搜索到 RAG 选型指南
人工智能·elasticsearch·agent