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 小时前
Agent Plugins 1.0实战:plugin.json、skills、mcp.json目录结构与迁移
开发语言·人工智能·ai编程
CTA量化套保2 小时前
近期零基础量化学习:先分阶段,再用 AI 检查缺口
人工智能·python
Justin3go2 小时前
AI 引荐流量报告:哪些独立产品正在从 ChatGPT 获客?
人工智能·seo
风流 少年2 小时前
Spring AI 2.0:SSE
java·人工智能·spring
深小乐2 小时前
AI 项目上线:折腾 Cloudflare,真香也藏不少坑
人工智能
ACP广源盛139246256733 小时前
Qwen3.8‑2.4T 开源落地@ACP#国产 MoE 私有化部署下 GSV2221 视频转换芯片机遇分析
大数据·数据库·人工智能
冬奇Lab4 小时前
开源项目第190期:claude-video — 给 Claude 装上「眼睛」看视频,一条命令分析 YouTube/Loom/本地视频
人工智能·开源·claude
七牛开发者4 小时前
为什么 Go 很适合 AI 辅助开发?
数据库·人工智能·python·elasticsearch·log4j
dear_bi_MyOnly4 小时前
AI人工智能分类识别——机器如何学习
人工智能·学习·分类