第五章-数字水印-2-原理及实现

2023-11-09

数字水印原理

根据之前图像获取位平面的操作可知,最低位位平面对整体图像的影响最小,因此数字水印的原理为在图像的最低有效位上嵌入隐藏信息,即在图像的最低位替换为数字水印位平面,完成数字的嵌入操作,对已嵌入数字水印的图片提取最低位位平面,即可得到数字水印和解密后的图像,因操作在最低位位平面,所以可以忽略对图像的影响。

数字水印制造

数字水印的实现基于上述原理的具体实现,首先准备需要嵌入数字水印的lena图(512*512)以及获取数字水印的原始图(512*512)。

数字水印的原始图是在纯白(255)背景上随便写的字,通过代码把数字水印原始图变成数字水印图。

大体步骤如下:

  1. 数字原始图片显示为灰度图
  2. 灰度图中把关键信息独立出来,具体为把背景色置为0(这里用的纯白背景255,实际可能是一定范围的颜色区间)
  3. 灰度图只有水印关键信息,把此信息的颜色值变为1,灰度图变为最低位平面,得到数字水印

代码如下:

import cv2 as cv
import numpy as np

# --------------------------制造数字水印
# step1 读取原始图
key = cv.imread("key.png", 0)
#  step2 得到数字水印灰度图 可以看到文字及背景白色
cv.imshow("key255", key)
# step3  之前提取位平面图的掩模操作,把白色255背景变成黑色0
key[key == 255] = 0
cv.imshow("key0", key)
# step4 再把文字变成1,这样就得到了数字水印
key[key > 0] = 1
cv.imshow("key", key)
cv.waitKey()
cv.destroyAllWindows()

运行效果如下:

数字水印嵌入及提取

理解了数字水印的原理再来分析数字的嵌入及提取就会觉得特别简单了。

  1. 先把数字水印生成好,看上面即可。
  2. 把载体图像的最低位位平面给处理掉,使用一个254的矩阵与载体图像做与运算即可。
  3. 数字水印加入到载体图像的最低位位平面即可,此时完成数字水印的嵌入。
  4. 生成一个全部为1的矩阵与载体图像做与运算从而得到最低位位平面,此时得到的就是水印。
  5. 嵌入数字水印的图像做减法运算即可得到丢失了最低位位平面的原始图像
  6. 此时水印只有1和0,再转为二值图显示数字水印的图像,显示完成即可。

具体实现如下:

import cv2 as cv
import numpy as np

# --------------------------制造数字水印
# step1 读取原始图
key = cv.imread("key.png", 0)
#  step2 得到数字水印灰度图 可以看到文字及背景白色
cv.imshow("key255", key)
# step3  之前提取位平面图的掩模操作,把白色255背景变成黑色0
key[key == 255] = 0
cv.imshow("key0", key)
# step4 再把文字变成1,这样就得到了数字水印
key[key > 0] = 1
cv.imshow("key", key)
# -----------------------嵌入水印过程
# step1 生成值全为254的模板
lena = cv.imread("lena.jpg", 0)
cv.imshow("lena", lena)
r, c = lena.shape
mask_254 = np.ones((r, c), dtype=np.uint8) * 254
# step2 用254模板把lena的最低位
lena_high_bit = cv.bitwise_and(lena, mask_254)

# step3 去掉最低位的lena嵌入数字水印 这一步用或运算也行
# lena_water = cv.bitwise_xor(lena_high_bit, key)
lena_water = lena_high_bit + key

cv.imshow("lena_water", lena_water)

# -----------------------提取水印过程
# step4 生成各全为1的模板,用来把数字水印提取出来
mask_1 = np.ones((r, c), dtype=np.uint8)
# step5 嵌入水印的图像与1模板做与运算,把水印提取出来
key_after = cv.bitwise_and(lena_water, mask_1)
# step6 嵌入水印的图像减去水印得到的就是失去最低位的"原图" 这一步也可以用254的模板做与运算
# mask_254 = np.ones((r, c), dtype=np.uint8) * 254
# lena_after = cv.bitwise_and(lena_water, mask_254)
lena_after = lena_water - key_after
cv.imshow("lena_after", lena_after)

# step7 把数字水印转化为二值图,直接显示出来
key_after[key_after > 0] = 255
cv.imshow("key_after", key_after)

cv.waitKey()
cv.destroyAllWindows()

运行效果如下:

总结:知道数字水印的原理整体实现起来就轻松多了,大体就是在图片的最低位加入数字水印,提取水印也就是把提取出已嵌入水印的图像的最低位位平面。后面的可视化水印及艺术文字大体就是对图像和数字水印图像的区域运算,不再做单独讨论。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

第五章-数字水印-2-原理及实现 的相关文章

  • Opencv未找到所有轮廓

    我试图找到该图像的轮廓 但是该方法查找轮廓只返回1轮廓 轮廓突出显示image 2 我正在努力寻找all外部轮廓就像这些圆圈 里面有数字 我究竟做错了什么 我可以做什么来实现它 image 1 image 2 以下是我的代码的相关部分 th
  • 使用opencv计算深度视差图

    我无法使用 opencv 从视差图计算深度 我知道两个立体图像中的距离是用以下公式计算的z baseline focal disparity p 但我不知道如何使用地图计算视差 我使用的代码如下 为我提供了两个图像的视差图 import n
  • 在 QtCreator 中将 OpenCV 2.3 与 Qt 结合使用

    随着 OpenCV 2 3 版本终于发布 我想在我的系统上编译并安装这个最新版本 由于我经常使用 Qt 和 QtCreator 我当然希望能够在我的 Qt 项目中使用它 我已经尝试了几种方法几个小时 但总是出现错误 第一次尝试 使用WITH
  • OpenCV 错误:使用 COLOR_BGR2GRAY 函数时断言失败

    我在使用 opencv 时遇到了一个奇怪的问题 我在 jupyter 笔记本中工作时没有任何问题 但在尝试运行此 Sublime 时却出现问题 错误是 OpenCV错误 cvtColor中断言失败 深度 CV 8U 深度 CV 16U 深度
  • OpenCV 仅围绕大轮廓绘制矩形?

    第一次发帖 希望我以正确的方式放置代码 我正在尝试检测和计算视频中的车辆 因此 如果您查看下面的代码 我会在阈值处理和膨胀后找到图像的轮廓 然后我使用 drawContours 和矩形在检测到的轮廓周围绘制一个框 我试图在 drawCont
  • OpenCV 3 中的 FLANN 错误

    我运行的是 Ubuntu 14 04 我正在尝试使用 openCV 3 运行 FLANN 但出现错误 下面的所有内容都是通过使用 AKAZE 和 ORB 进行尝试的 但代码来自我尝试使用 ORB 的情况 我使用 ORB 来查找描述符和关键点
  • 当我将鼠标移到 Mat 关键字上时,Visual Studio 2017 冻结(OpenCv 3.4.1)

    我想在 Visual Studio 2017 中开发 openCv 项目 我下载了 opencv 预构建库并进行了必要的设置 那是 1 我添加了系统路径 build x64 vc14 bin 2 在 Visual Studio 中的项目属性
  • 如何在 OpenCV 中从 YUV 文件读取帧?

    如何在 OpenCV 中从 YUV 文件读取帧 我编写了一个非常简单的 python 代码来从二进制文件读取 YUV NV21 流 import cv2 import numpy as np class VideoCaptureYUV de
  • 检查图像中是否有太薄的区域

    我正在尝试验证雕刻机的黑白图像 更多的是剪贴画图像 不是照片 我需要考虑的主要事情之一是区域的大小 或线条的宽度 因为机器无法处理太细的线条 所以我需要找到比给定阈值更细的区域 以此图为例 竖琴的琴弦可能太细而无法雕刻 我正在阅读有关 Ma
  • OpenCV C++ 如何知道每行的轮廓数进行排序?

    我有一个二值图像 https i stack imgur com NRLVv jpg在这张图片中 我可以使用重载的函数轻松地对从上到下 从左到右找到的轮廓进行排序std sort 我首先通过以下方式从上到下排序 sort contours
  • uri 警告中缺少端口:使用 Python OpenCV cv2.VideoCapture() 打开文件时出错

    当我尝试流式传输 ipcam 时 出现了如下所示的错误 tcp 000000000048c640 uri 中缺少端口 警告 打开文件时出错 build opencv modules videoio src cap ffmpeg impl h
  • 如何使用 opencv python 计算乐高积木上的孔数?

    我正在开发我的 python 项目 我需要计算每个乐高积木组件中有多少个孔 我将从输入 json 文件中获取有关需要计算哪个程序集的信息 如下所示 img 001 red 0 blue 2 white 1 grey 1 yellow 1 r
  • cv2.drawContours() - 取消填充字符内的圆圈(Python,OpenCV)

    根据 Silencer的建议 我使用了他发布的代码here https stackoverflow com questions 48244328 copy shape to blank canvas opencv python 482465
  • 在 Visual Studio 2012 中安装 OpenCV

    我正在尝试安装 OpenCV 来与 Visual Studio 一起使用 我使用的是2012Pro版本 但我认为它应该与vs10相同 我正在关注这个教程 http docs opencv org doc tutorials introduc
  • 如何使用 opencv.omnidir 模块对鱼眼图像进行去扭曲

    我正在尝试使用全向模块 http docs opencv org trunk db dd2 namespacecv 1 1omnidir html用于对鱼眼图像进行扭曲处理Python 我正在尝试适应这一点C 教程 http docs op
  • 如何在 Qt 应用程序中通过终端命令运行分离的应用程序?

    我想使用命令 cd opencv opencv 3 0 0 alpha samples cpp cpp example facedetect lena jpg 在 Qt 应用程序中按钮的 clicked 方法上运行 OpenCV 示例代码
  • OpenCV SIFT 描述符关键点半径

    我正在深入研究OpenCV的SIFT描述符提取的实现 https github com Itseez opencv blob master modules nonfree src sift cpp 我发现了一些令人费解的代码来获取兴趣点邻域
  • BRISK 特征检测器检测零个关键点

    下面显示的 Brisk 探测器没有给我任何关键点 有人可以提出一个问题吗 我将尝试用一些代码解释我在下面所做的事情 include opencv2 features2d features2d hpp using namespace cv u
  • 从扫描文档中提取行表 opencv python

    我想从扫描的表中提取信息并将其存储为 csv 现在我的表提取算法执行以下步骤 应用倾斜校正 应用高斯滤波器进行去噪 使用 Otsu 阈值进行二值化 进行形态学开局 Canny 边缘检测 进行霍夫变换以获得表格行 去除重复行 10像素范围内相
  • 从 NumPy 数组到 Mat 的 C++ 转换 (OpenCV)

    我正在围绕 ArUco 增强现实库 基于 OpenCV 编写一个薄包装器 我试图构建的界面非常简单 Python 将图像传递给 C 代码 C 代码检测标记并将其位置和其他信息作为字典元组返回给 Python 但是 我不知道如何在 Pytho

随机推荐

  • 《Java进阶学习+面试宝典》高级架构师指南-剑指阿里P8

    企业对Java的需求最大 Java程序员的群体也最为庞大 有着 1200万之多 彼此之间都有更多的选择 换句话说 也是最修罗场的 要想在明年的金三银四拿下自己心仪的offer 咱就一定要做好功课 把那些必考点 套路都给吃透了 为此我专门整理
  • Spring Data CrudRepository增删改查方法(八)

    CrudRepository 的主要方法 long count boolean exists Integer arg0
  • 数据结构有哪些

    概念 数据结构 数据用什么样的方式组合在一起 数据结构是计算机存储数据的方式 指相互之间存在一种或多种特定关系的数据元素集合 常见数据结构 数据存储的常用结构有 栈 队列 数组 链表和红黑树 栈 stack 又称堆栈 它是运算受限的线性表
  • springboot基于Java的衣服穿搭推荐系统-计算机毕业设计

    收藏关注不迷路 文章目录 一 项目介绍 二 开发环境 三 功能介绍 四 核心代码 五 效果图 六 文章目录 一 项目介绍 随着人们物质生活水平的提高 对于精神需求也日趋增长 在日常生活中会更加注意外在形象 尤其是在穿衣搭配方面 无论是日常生
  • C++智能指针详解

    1 概述 我们知道除了静态内存和栈内存外 每个程序还有一个内存池 这部分内存被称为自由空间或者堆 程序用堆来存储动态分配的对象即那些在程序运行时分配的对象 当动态对象不再使用时 我们的代码必须显式的销毁它们 在C 中 动态内存的管理是用一对
  • Linux下的两个特殊的文件(可用来清理日志)——/dev/null与/dev/zero

    1 dev null简介 在类Unix系统中 dev null被称为空设备 是一个特殊的设备文件 写入 dev null 会丢弃一切写入其中的数据 但报告写入操作成功 读取 dev null 则会立即得到一个EOF 在Unix行话中 dev
  • OpenMP、MPI、CUDA总结

    文章目录 一 OpenMP 1 1 多执行绪的概念 1 2 多执行绪的程式 1 3 OpenMP 的基本使用 1 4 OpenMP使用详解 二 MPI Message Passing Interface 三 CUDA 3 1 CUDA发展历
  • 华为OD2023(A卷)基础题23【最短木板长度】

    题目描述 小明有n块木板 第i 1 i n 块木板的长度为ai 小明买了一块长度为m的木料 这块木料可以切割成任意块 拼接到已有的木板上 用来加长木板 小明想让最短的木板尽量长 请问小明加长木板后 最短木板的长度最大可以为多少 输入描述 输
  • Git超实用总结,再也不怕记忆力不好了

    欢迎大家前往腾讯云 社区 获取更多腾讯海量技术实践干货哦 本文由腾讯工蜂发表于云 社区专栏 Git 是什么 Git 是一个分布式的代码管理容器 本地和远端都保有一份相同的代码 Git 仓库主要是由是三部分组成 本地代码 缓存区 提交历史 这
  • js if判断多个条件_python量化基础

    编辑 Cowboy 校对 李明 来源 牛角财经 目的 python量化基础 条件分支与循环 IF条件分支判断语句的用法 python教程 从入门到高级 免费 特点 案例基于金融市场数据展开 让python量化初学者快速上手 一 基础部分 人
  • springboot/cloud版本升级常见问题和文档

    版本对照链接 https spring io projects spring cloud overview 升级mybatis的starter版本后 集成mybatis spring尽量用高版本 要不然容易出现datesource无法找到或
  • MATLAB R2021b(07)

    详细原文介绍 神经网络入门详解 nftool MathWoks 神经网络入门随记 以及 matlab中神经网络工具箱的使用 关于神经网络的非常基础概念 个人笔记 不具权威性 仅供参考 欢迎指正错误 提供意见 交流讨论等 1 思路简介 我们有
  • 【PCIe】3: PCIe BDF(Bus,Device,Function)

    目录 1 概述 2 BUS 总线号 3 Device 设备号 4 Function 功能号 1 概述 PCIe总线中的每一个功能都有一个唯一的标识符与之对应 这个标识符就是BDF Bus Device Function
  • Knife4j 基础(OpenAPI2)

    1 Knife4j OpenApi2 入门示例 Knife4j是一个集Swagger2 和 OpenAPI3 为一体的增强解决方案 本文按照官方文档 在 SpringBoot2 7 项目中 集成 Knife4j 的 OpenApi2 版本
  • vscode中编译时当前工作目录的设置

    options cwd usr bin 在tasks json中options选项中 使用cwd项进行编译过程当前工作目录的设置 上面的代码把编译时的当前工作目录强制设置到 usr bin 如果使用该选项不设置 则工作目录为当前打开工程的文
  • go ethereum private net 在miner.start()后返回null及停止挖矿的问题

    查了好久在go ethereum社区查到一个情况相同的提问 why does miner start return null does not start in private testchain 提问者也是在miner start 后进入
  • 1、asyncio aiohttp aiofile 异步爬取图片

    1 asyncio aiohttp aiofile 异步爬取图片 前后折腾了好多天 不废话 先直接上代码 再分析 1 import aiohttp 2 import asyncio 3 import aiofiles 4 5 header
  • Surround the Trees

    http acm zju edu cn onlinejudge showProblem do problemId 453 There are a lot of trees in an area A peasant wants to buy
  • Linux下的grub2引导修复

    目录 引导故障分析处理 1 修复grub2引导故障 2 修复grub2 误删掉 boot grub2 3 修复grub2 引导破坏故障 4 修复 boot 下所有文件被删除故障 引导故障分析处理 1 修复grub2引导故障 故障原因 gru
  • 第五章-数字水印-2-原理及实现

    数字水印原理 根据之前图像获取位平面的操作可知 最低位位平面对整体图像的影响最小 因此数字水印的原理为在图像的最低有效位上嵌入隐藏信息 即在图像的最低位替换为数字水印位平面 完成数字的嵌入操作 对已嵌入数字水印的图片提取最低位位平面 即可得