opencv-15 数字水印原理

news2024/10/6 8:33:59

最低有效位(Least Significant Bit,LSB)指的是一个二进制数中的第 0 位(即最低位)。
最低有效位信息隐藏指的是,将一个需要隐藏的二值图像信息嵌入载体图像的最低有效位,即将载体图像的最低有效位层替换为当前需要隐藏的二值图像,从而实现将二值图像隐藏的目的。
由于二值图像处于载体图像的最低有效位上,所以对于载体图像的影响非常不明显,其具有较高的隐蔽性。

这种信息隐藏也被称为数字水印,通过该方式可以实现信息隐藏、版权认证、身份认证等功能。
例如,如果嵌入载体图像内的信息是秘密信息,就实现了信息隐藏;如果嵌入载体图像内的信息是版权信息,就能够实现版权认证;如果嵌入载体图像内的信息是身份信息,就可以实现数字签名,等等。所以,被嵌入载体图像内的信息也被称为数字水印信息。
数字水印信息可以是文本、视频、音频等多种形式

内容有点多,要是我看到直接就蒙圈了,一点点看,一天看一些理解下也可以

原理

从位平面的角度考虑,数字水印的处理过程分为下面两步。
 嵌入过程:将载体图像的第 0 个位平面替换为数字水印信息(一幅二值图像)。
 提取过程:将载体图像的最低有效位所构成的第 0 个位平面提取出来,得到数字水印信
息。

1.嵌入过程

嵌入过程是将数字水印嵌入载体图像的过程。该过程实现的是,将载体图像的最低有效位
用数字水印信息替换,得到包含水印信息的载体图像。
为了处理和说明起来方便,这里以原始图像为灰度图像、水印图像为二值图像为例。在实际处理中,原始图像、水印图像均可以为彩色图像,这时需要先对它们进行通道分解、图层分解,后续的处理方法与在灰度图像内嵌入二值水印图像的处理方法相同。

(1)原始载体图像预处理
为了便于理解,我们将载体图像处理为二进制形式,并标记出最低有效位。
例如,有灰度图像 O 作为载体图像,图像 O 中各个像素点的像素值为:

在这里插入图片描述
其对应的二进制表示 OB 为:

在这里插入图片描述
为了更直观,我们用下画线将图像的二进制表示 OB 的最低有效位标记出来了。被标记的值构成了载体图像 O 的第 0 个位平面,即“最低有效位”位平面 OBLSB,其具体值为:

在这里插入图片描述

(2)水印图像处理
为了方便处理,在嵌入水印前,需要将水印信息处理为二值图像。比较典型的情况是将灰度二值水印信息进行阈值处理,将其处理为二进制二值水印信息。
在灰度二值图像中,像素值只有 0 和 255 两种类型值,分别用来表示黑色和白色。可以将其中的 255 转换为 1,这样就得到了一幅二进制二值图像。在二进制二值图像中,仅仅用一个比特位表示一个像素值,像素值只有 0 和 1 两种可能值。经过上述处理,能够更方便地实现水印嵌入。
例如,有灰度二值水印图像 W,其像素值为

在这里插入图片描述
不能直接将上述水印图像嵌入载体图像内,需要将其转换为二进制二值水印图像,以方便嵌入。通过阈值处理,得到二进制二值水印图像 WB,其具体值为:

(在OpenCV中,阈值处理是一种常用的图像处理技术,它可以将图像中的像素值分成两个或多个区域,从而实现图像的分割和二值化)

在这里插入图片描述
经过处理后,二进制二值水印信息正好可以嵌入载体图像的最低有效位上。

(3)嵌入水印
将载体图像的最低有效位替换为二进制水印图像,完成水印的嵌入。
例如,将载体图像 OB 的最低有效位用水印信息 WB 替换,得到含水印载体图像的二进制形式 WOB,其具体值为:

在这里插入图片描述
将 WOB 转为十进制形式,即得到含水印载体图像的十进制值形式 WO,其值为:

在这里插入图片描述

由于信息的最低有效位对值的大小影响有限,因此,将载体图像最低有效位的值用水印信息替换后,载体图像像素的值并没有发生太大变化,人眼不足以看出区别,水印具有较高的隐蔽性。

提取水印

提取过程是指将水印信息从包含水印信息的载体图像内提取出来的过程。提取水印时,先
将含水印载体图像的像素值转换为二进制形式,然后从其最低有效位提取出水印信息即可。因
此,可以通过提取含水印载体图像的“最低有效位”位平面的方式来得到水印信息。
例如,有包含水印信息的载体图像 WOE,其具体值为:

在这里插入图片描述
将含水印信息的载体图像 WOE 转换为二进制形式 WOEB,得到:

在这里插入图片描述
提取 WOEB 的最低有效位信息(“最低有效位”位平面,即第 0 个位平面),即可得到水印信息 WE,其值为:

在这里插入图片描述

根据需要,决定是否进行阈值处理。如有必要,则通过阈值处理将其中值为 1 的像素点转换为 255,得到含有 0 和 255 两个值的二值水印图像 WET,具体值为:

在这里插入图片描述
通过上述例题可以发现,经过上述处理后,得到的水印图像 WET 与嵌入的水印图像 W 是一致的。
为了便于理解,这里仅介绍了原始载体图像为灰度图像的情况,在实际中可以根据需要在多个通道内嵌入相同的水印(提高鲁棒性,即使部分水印丢失,也能提取出完整水印信息),
或在各个不同的通道内嵌入不同的水印(提高嵌入容量)。在彩色图像的多个通道内嵌入水印的方法,与在灰度图像内嵌入水印的方法相同。

实现方法

最低有效位水印的实现包含嵌入过程和提取过程,下面对具体的实现方法进行简单介绍。
1.嵌入过程
嵌入过程完成的操作是,将数字水印信息嵌入载体图像内,其主要步骤如下。

(1)载体图像预处理
读取原始载体图像,并获取载体图像的行数 M 和列数 N。
例如,有原始载体图像 O,其像素值为:

在这里插入图片描述
将其对应的二进制形式记为 OB,其具体值为:

在这里插入图片描述
(2)建立提取矩阵
建立一个 M×N 大小、元素值均为 254 的提取矩阵(数组),用来提取载体图像的高七位。
例如,按照原始图像 O 的大小建立一个 4×4 大小、元素值均为 254 的数组 T,其具体为:

在这里插入图片描述

T 所对应的二进制形式记为 TB,其具体值为:

在这里插入图片描述

(3)保留载体图像的高七位,将最低位置零
为了实现该操作,需要将载体图像与元素值均为 254 的提取矩阵进行按位与运算。
将一个值在[0,255]之间的像素值 P 与数值 254 进行按位与运算,则会将像素值 P 的最低有
效位置零,只保留其高七位。例如:
 某个像素 Pa 的像素值为 217,将像素 Pa 与 254 进行按位与运算,则像素 Pa 的二进制
像素值高七位保持不变,最低有效位被清零。像素 Pa 的最低有效位上原来的值是 1,
因此,经过运算后像素 Pa 的像素值 217 减少 1,变为 216。
 某个像素 Pb 的像素值为 216,将像素 Pb 与 254 进行按位与运算,则像素 Pb 的二进制
像素值高七位保持不变,最低有效位被清零。像素 Pb 的最低有效位上原来的值就是 0,
因此在运算后像素 Pb 的像素值仍然是 216。
该运算示例具体如表 3-17 所示。

在这里插入图片描述
表中的 LSB 表示 Least Significant Bit,即最低有效位。
根据以上分析,将载体图像与元素值均为 254 的提取矩阵进行按位与运算,相当于将载体
图像内的每个像素值均与值 254 进行按位与运算。这样就实现了将整个图像内所有像素二进制值的高七位保留、最低位置零。

例如,将原始载体图像 OB 与元素值均为 254 的提取矩阵 TB 进行按位与运算,则 OB 的
高七位保持不变,而最低有效位被置零。即实现了只保留 OB 的高七位,得到 OBH,其具体值为:

在这里插入图片描述
(4)水印图像处理
有些情况下需要对水印进行简单处理。例如,当水印图像为 8 位灰度图的二值图像时,就需要将其转换为二进制二值图像,以方便将其嵌入载体图像的最低位。
例如,有一幅灰度二值水印图像 W,具体值为:

在这里插入图片描述
我们将其中的像素值 255 转换为像素值 1,以方便嵌入载体图像。该灰度二值图像对应的二进制图像为 WT,其值具体为:

在这里插入图片描述
其对应的 8 位二进制形式 WTB 为:

在这里插入图片描述
(5)嵌入水印
将原始载体图像进行“保留高七位、最低位置零”的操作后,我们得到一幅新的图像,将新图像与水印图像进行按位或运算,就能实现将水印信息嵌入原始载体图像内的效果。

将一个最低有效位(LSB)为 0 的数值 A 与一个只有一位的二进制值 B(单位二进制值)进行按位或运算时:

 当该二进制值 B 为 0 时,按位或运算的结果是 0,数值 A 的值保持不变。由于 B 的值为 0,因此,如果从最低有效位的角度理解,可以理解为数值 A 的最低有效位被替换为单位二进制值 B 的值,也可以理解为将单位二进制值 B 嵌入数值 A 内(的最低有效位上)。

 当该二进制值 B 为 1 时,按位或运算的结果是 1,数值 A 的高七位保持变,而最低有效位变为 1。因此,如果从最低有效位的角度理解,可以理解为数值 A 的最低有效位被替换为单位二进制值 B 的值,也可以理解为将单位二进制值 B 嵌入数值 A 内(的最低有效位上)。

总结来看,将一个最低有效位(LSB)为 0 的数值 A 与一个单位二进制值 B 进行按位或运算,相当于用该单位二进制值 B 替换原始数值 A 的最低有效位,即可以实现将单位二进制值 B嵌入数值 A 的最低有效位上。

例如,将最低有效位是 0 的数字 216 分别与单位二进制值 0 和单位二进制值 1 进行按位或
运算,如表 3-18 所示。

在这里插入图片描述
可以推断,如果将二进制二值水印图像(单位二进制值的水印图像)与最低有效位被置零
后得到的原始载体图像进行按位或运算,就可以实现将水印信息嵌入原始载体图像内。
因此,将水印信息 WB 与原始载体图像 O 的高七位图像 OBH 进行按位或运算,即完成将
水印信息嵌入原始载体图像 O 的 OBH 内,就可以得到含水印载体图像 WO。WO 的具体值为:
在这里插入图片描述
(6)显示图像
完成上述处理后,分别显示原始载体图像、水印图像、含水印图像。水印嵌入过程的流程图如图 3-12 所示。
在这里插入图片描述

2.提取过程

提取过程将完成数字水印的提取,具体步骤如下。
(1)含水印载体图像处理
读取包含水印的载体图像,获取含水印载体图像的大小 M×N。
例如,读取含水印载体图像 WO,获取其大小为 4×4。WO 的具体值为:

在这里插入图片描述
(2)建立提取矩阵
定义一个与含水印载体图像等大小的值为 1 的矩阵(数组)作为提取矩阵。
例如,定义一个大小为 4×4 的矩阵作为提取矩阵,使其中的值均为 1,将该矩阵标记为 T1:

在这里插入图片描述
其对应的 8 位二进制形式 Te 为:

在这里插入图片描述
(3)提取水印信息
将含水印载体图像与提取矩阵进行按位与运算,提取水印信息。
将一个值在[0, 255]之间的像素 P 与数值 1 进行按位与运算,则会将像素 P 的像素值的高七
位置零,只保留像素 P 的最低有效位(LSB)。

下面分别以像素 P 的最低有效位为 0 和 1 为例进行说明。
 如果像素 P 的最低有效位为 1,则会得到值 1。
例如,某像素 Pa 的值为 217,将其与数值 1 进行按位与运算,则 Pa 的高七位被置零,
只有其最低有效位被保留,得到值 1。
 如果像素 P 的最低有效位为 0,则会得到值 0。
例如,某像素 Pb 的值为 216,将其与数值 1 进行按位与运算,则 Pb 的高七位被置零,
只有其最低有效位被保留,得到值 0。

该实例的具体计算如表 3-19 所示。

在这里插入图片描述
基于上述规则,针对图像内的每个像素,将其与数值 1 进行按位与操作,即可将图像的最
低有效位提取出来。
因此,可以将含水印载体图像与元素值均为 1 的提取矩阵进行按位与运算,以实现提取水
印信息。

例如,含水印载体图像 WO 为:

在这里插入图片描述

将含水印图像 WO 与提取矩阵 Te 进行按位与运算,即可得到二进制值水印信息 We,其值为:

在这里插入图片描述
将提取出来的二进制水印信息 We 进行阈值处理,将其中值为 1 的像素值调整为 255,以
便显示。阈值处理后,得到二值水印图像 WG,具体值为:
在这里插入图片描述
(4)计算去除水印后的载体图像
有时需要删除包含在水印载体图像内的水印信息。通过将含水印载体图像的最低有效位置
零,即可实现删除水印信息。
建立一个大小为 4×4、元素值均为 254 的矩阵,将该矩阵标记为 T2,其具体为:

在这里插入图片描述
将上述 T2 所对应的二进制形式记为 TB,其具体值为:

在这里插入图片描述
通过将含水印载体图像 WO 与 TB 进行按位与运算,即可将载体图像 WO 的最低有效位置
零,得到删除水印信息的载体图像 ODW。该操作的具体实现原理及过程,与水印嵌入时对原
始图像的最低有效位置零操作是类似的。

(5)显示图像
根据需要,分别显示提取出来的水印图像 WG、删除水印信息的载体图像 ODW。
水印提取过程的流程图如图 3-13 所示。

在这里插入图片描述
就是说,也可以通过让含水印载体图像像素值对 2 取模的方式,来获取最低有效位水印。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/777438.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

央视报道!北京筑龙深度参编的 《企业采购供应链数字化成熟度模型》开始实施

7月12日,由中国物流与采购联合会牵头,北京筑龙深度参与编写的《企业采购供应链数字化成熟度模型》团体标准在“第四届国有企业数智化采购与智慧供应链论坛”上重磅发布。该标准于7月15日起正式实施,并将在企业中开展模型应用评估试点工作。 图…

服务器量化训练操作说明

Freespace服务器预训练主要步骤: 首先登录堡垒机,命令如下: ssh xxxrelay.baidu-int.com (xxx为个人邮箱前缀) 密码为个人邮箱密码 登录工作机,命令如下: ssh l3yq01-gpu-255-122-22-00.e…

Redis源码篇 - inset数据结构

inset是Redis中set类型的一种底层存储结构(编码),它是基于整数数组来实现的,用于存储数值类型set集合数据,并具备长度可变、有序等特征。 有序性 为了方便查找,Redis会将intset中整数数据按照从小到大的顺…

017-从零搭建微服务-系统服务(四)

写在最前 如果这个项目让你有所收获,记得 Star 关注哦,这对我是非常不错的鼓励与支持。 源码地址(后端):https://gitee.com/csps/mingyue 源码地址(前端):https://gitee.com/csps…

【服务器】零成本搭建网站并内网穿透实现公网访问

零成本搭建网站并内网穿透实现公网访问 在普通电脑用户看来,建立自己的网站总是一件高大上的事情,这个网站不仅可以成为展示自己的平台,还能成为商业的载体。在以往,建立一个像样的网站,不仅需要过硬的编程知识做基础…

在外远程桌面控制家里的电脑

在外远程桌面控制家里的电脑 电脑作为现代家庭不可或缺的电子设备之一,早已在广大家庭中普及。不仅年轻人需要在工作、生活中使用电脑,在老家的父母也在熟悉和使用电脑。但身在外乡打工的我们,总会碰到家中父母抱怨电脑卡、慢、不好用的情况…

微信小程序学习笔记(四)——自定义组件

自定义组件 组件的创建与引用 创建组件 在根目录下创建 components 文件夹右键点击 components 文件夹,选择新建 Component,就会自动生成.wxml、.wxss、.js、.json文件 引用组件 组件的引用方式分为“局部引用”和“全局引用”,故名思义…

【指针的进阶(3)】回调函数和qsort排序各种类型的数据

文章目录 前言一、回调函数是什么?如何实现回调函数 二、回调函数的应用——qsortqsort排序各种类型的数据 总结 前言 前两章讲了指针的类型,数组传参和指针传参,还有函数指针和函数指针数组,接下来第三章讲回调函数 指针函数非常…

MySQL-运维

1、日志 1.1 错误日志 错误日志是MysQL中最重要的日志之一,它记录了当mysqld启动和停止时,以及服务器在运行过程中发生任何严重错误时的相关信息。当数据库出现任何故障导致无法正常使用时,建议首先查看此日志。 该日志是默认开启的&#…

高阶C语言|结构体,枚举,联合--自定义类型的使用计算

自定义类型--结构体,枚举,联合 一、结构体1.1结构体类型的声明1.1.1结构的基础知识1.1.2结构的声明1.1.3特殊的声明 1.2结构体的引用1.3结构体变量的定义和初始化1.4结构体内存对齐1.4.1修改默认对齐数 1.5结构体传参1.6结构体实现位段(位段的…

数据结构与算法基础-学习-26-图之MST(最小代价生成树)之Kluskal(克鲁斯卡尔)算法

最小生成树的概念、源码实现和Prim(普利姆)算法的概念和源码实现请参考之前的博客:《数据结构与算法基础-学习-25-图之MST(最小代价生成树)之Prim(普利姆)算法》 一、算法思路 Kluskal算法相较…

11.键盘事件

键盘事件 html部分 <div class"insert"><div class"key">请按下你的键盘</div> </div>css部分 * {margin: 0;padding: 0; }body {display: flex;justify-content: center;align-items: center;height: 100vh;overflow: hidden; }…

Pytorch手动实现softmax回归

参考代码&#xff1a;https://blog.csdn.net/ccyyll1/article/details/126020585 softmax回归梯度计算方式&#xff0c;特别是ij和i! j时的计算问题&#xff0c;请看如下帖子中的描述&#xff0c;这个问题是反向传播梯度计算中的一个核心问题&#xff1a;反向传播梯度计算中的…

哈工大计算机网络课程局域网详解之:MAC地址与ARP协议

哈工大计算机网络课程局域网详解之&#xff1a;MAC地址与ARP协议 文章目录 哈工大计算机网络课程局域网详解之&#xff1a;MAC地址与ARP协议MAC地址ARP&#xff1a;地址解析协议寻址&#xff1a;从一个LAN路由至另一个LAN MAC地址 在介绍MAC地址前&#xff0c;首先回顾一下之前…

SAP ABAP 实现数据库表行项目和程序加解锁功能

1.SAP ABAP 实现数据库表行项目加解锁功能 实现效果&#xff1a; 当一个数据库表以某字段为关键字段的数据被锁定时&#xff0c;同一时间其他程序无法修改改表内被锁定的数据&#xff0c;除非被解锁或退出程序。 1.事务代码&#xff1a;SE11 创建锁对象。PS&#xff1a;命名…

【计组】不同进制数之间的相互转换

前言 1、推荐在线进制转换器&#xff1a;&#xff08;都还不错&#xff09; 在线进制转换 | 进制转换器 — 在线工具 (sojson.com) 在线进制转换器 | 菜鸟工具 (runoob.com) 在线进制转换 - 码工具 (matools.com) 2、进位计数法 &#xff08;1&#xff09;二进制&#xf…

JavaScript字符串和模板字面量

● 上节课我们说明&#xff0c;号可以当作字符串连接符号使用&#xff0c;例如 const firstName "Sun"; const job "技术分享博主"; const birthYear 1991; const year 2023;const sun "我叫" firstName ",是一个" (year - bi…

线性结构:队列

文章目录 队列定义队列应用热土豆问题打印任务 队列定义 队尾进&#xff0c;队头出 队列是一种有次序的数据集合&#xff0c;其特征是新数据项的添加总发生在一端(通常称为“尾rear”端&#xff09;而现存数据项的移除总发生在另一端&#xff08;通常称为“首front”端&#x…

刷题记录-2最短路径

考点&#xff1a; 图论-最短路-Dijkstra 解题&#xff1a; c #include <iostream> #include <vector> #include <queue> using namespace std; const long long inf 0x3f3f3f3f3f3f3f3fLL; const int num 3e52; struct edge {int from,to;long long w;e…

算法竞赛入门【码蹄集新手村600题】(MT1001-1020)

算法竞赛入门【码蹄集新手村600题】(MT1001-1020&#xff09; 目录MT1001 程序设计入门MT1002 输入和输出整型数据MT1003 整数运算MT1004 求余MT1005 输入和输出实型数据MT1006 实型数运算MT1007 平均分MT1008 圆球等的相关运算MT1009 公式计算MT1010 输入和输出字符型数据MT10…