数字水印 | 盲水印嵌入:量化索引机制 QIM

目录

    • 1 什么是量化索引调制?
      • 1.1 为什么使用 QIM?
      • 1.2 QIM 的算法思想
      • 1.3 什么是量化操作?
      • 1.4 论文中对 QIM 的介绍
    • 2 盲水印论文中的实际应用
      • 2.1 均匀量化器
      • 2.2 对论文的分析


😇前言:不知道为什么,QIM 相关的博客就是很少,我也是花了一周的时间才大致搞懂的

😇说明:本文中的载体信息 == 原始信息



1 什么是量化索引调制?

量化索引调制 是一种基于量化思想的非线性信息隐藏技术。基于量化思想的水印嵌入模型的主要目的是为了实现水印信息的 盲检测,即不需要原始载体就可以直接从载体中提取水印信息。其主要思想是根据水印信息的不同将原始载体数据量化到不同的量化区间,提取水印信息时根据载体数据所属的量化区间来识别对应的水印信息。

Quantization Index Modulation,QIM



1.1 为什么使用 QIM?

基于量化思想的水印嵌入模型旨在实现水印信息的盲检测,使得我们可以直接从载体信息中提取水印信息,而无需依赖原始的载体信息。其核心思想是根据水印信息的差异,将原始的载体信息量化到不同的量化区间。在提取水印信息时,通过识别载体信息所处的量化区间来确定相应的水印信息。

注意:不加前缀的 “载体信息” 指的是嵌入水印后的载体信息,“原始的载体信息” 指的是嵌入水印前的载体信息。



1.2 QIM 的算法思想

假设水印信息是一个二进制信息,即仅由 0 0 0 1 1 1 组成。我们设置两个量化器 Q 0 Q_0 Q0 Q 1 Q_1 Q1,分别对应水印信息为 0 0 0 1 1 1 的情况。

个人理解:量化器听起来高级,但感觉本质上就是若干数值的集合,即一个值域。

在嵌入水印信息时,我们根据水印信息为 0 0 0 还是为 1 1 1,分别选择量化器 Q 0 Q_0 Q0 Q 1 Q_1 Q1 对载体信息进行量化,得到量化后的载体信息。

你没有看错!虽然量化器是根据水印信息选择的,但它处理的是载体信息,而非水印信息。

在提取水印信息时,让 Q 0 Q_0 Q0 Q 1 Q_1 Q1 分别对载体信息进行量化,相应地得到两个量化的结果。

注意:载体信息在信道传输中可能发生变化,不一定等于嵌入水印时的量化结果。

Q 0 Q_0 Q0 所对应的量化结果与载体信息之间的距离为 d 0 d_0 d0,令 Q 1 Q_1 Q1 所对应的量化结果与载体信息之间的距离为 d 1 d_1 d1。如果 d 0 < d 1 d_0<d_1 d0<d1,那么认为被嵌入的水印信息为 0 0 0;如果 d 0 > d 1 d_0>d_1 d0>d1,那么认为被嵌入的水印信息为 1 1 1

个人理解:所谓的距离,其实就是两个数值之间的差值。



1.3 什么是量化操作?

画二维图只是为了方便说明,并不代表 Q 0 Q_0 Q0 Q 1 Q_1 Q1 的值域就很复杂

现在需要将一个水印信息嵌入到载体信息当中。假设 A A A 点代表的是一个载体信息,黄色的点表示量化器 Q 0 Q_0 Q0 所包含的元素,绿色的点表示量化器 Q 1 Q_1 Q1 所包含的元素。如下图所示:

在这里插入图片描述

如上图所示, 1 1 1 号点是 Q 0 Q_0 Q0 中距离 A A A 最近的元素, 2 2 2 号点是 Q 1 Q_1 Q1 中距离 A A A 最近的元素。如果待嵌入的水印信息是 0 0 0,那么使用 1 1 1 号点的值替换掉 A A A 的值;如果待嵌入的水印信息是 1 1 1,那么使用 2 2 2 号点的值替换掉 A A A 的值。

个人理解:所谓的量化过程,就是使用相应量化器中距离载体信息最近的值,替换掉载体信息原始的值。比如,由于我们在 1.2 节规定 Q 0 Q_0 Q0 中的元素都对应着 0 0 0,而现在又把载体信息的值替换成了 Q 0 Q_0 Q0 中的一个元素,因此在提取水印时我们就能通过载体信息知道水印信息是 0 0 0 了。至于为什么要选择距离载体信息最近的值,当然是因为我们希望图像的质量不要受到太大的改动。



1.4 论文中对 QIM 的介绍

Q I M \mathsf{QIM} QIM 是将一个水印信息嵌入到一个原始信息中,从而产生一个复合信息的方法。例如,将一个比特信息 m m m 嵌入到原始信息 x x x 中,得到的复合信息可以表示为如下形式:

s ( x , m ) = { Q 0 ( x ) , i f m = 0 Q 1 ( x ) , i f m = 1 s(x,m)= \left\{\begin{matrix} Q_{0}(x),\ \mathrm{if}\ m=0 \\ \\ Q_{1}(x),\ \mathrm{if}\ m=1 \end{matrix}\right. s(x,m)= Q0(x), if m=0Q1(x), if m=1

其中 Q 0 Q_0 Q0 Q 1 Q_1 Q1 是值域不相交的两个量化器, m m m 是待嵌入的水印信息,复合信息 s ( x , m ) s( x , m) s(x,m) 在本质上是一个隐写信息。

量化器对原始信息进行量化处理,使得处理后的原始信息成为该量化器中的一员。

嵌入的水印信息可以使用最小距离解码器提取:

m ′ = a r g m ∥ y − s ( y , m ) ∥ m'=\mathrm{arg}_m\left \| y-s(y,m) \right \| m=argmys(y,m)

其中 m ′ m' m 是根据接收到的信息 y y y 提取出的水印信息, a r g m \mathrm{arg}_m argm 是用于产生 m m m 的参数,即 ∥ y − s ( y , m ) ∥ \left \| y-s(y,m) \right \| ys(y,m) 取最小值时 m m m 的取值。

注意:理论上 y y y 应该等于 s ( x , m ) s(x,m) s(x,m),其值位于某个量化器的值域中。但是 y y y 在传输的过程中可能发生了变化而不再等于 s ( x , m ) s(x,m) s(x,m),从而无法直接通过 y y y 的值来判断嵌入的水印信息到底是 0 0 0 还是 1 1 1。因此我们对 y y y 进行量化 s ( y , m ) s(y,m) s(y,m),以得到两个量化器中离 y y y 最近的元素,分别是 Q 0 ( y ) Q_0(y) Q0(y) Q 1 ( y ) Q_1(y) Q1(y),然后再看 y y y 离哪个量化器的元素更近。“更近” 在某种程度上意味着 y y y 原本的值应该就是这个值。

可以看出,论文中对 Q I M \mathsf{QIM} QIM 的介绍和前文的介绍是一致的。在嵌入水印时,根据水印信息选择相应的量化器对原始信息进行处理;在提取水印时,通过判断原始信息距离哪个量化器的元素更近,来判断嵌入的水印信息是 0 0 0 还是 1 1 1



2 盲水印论文中的实际应用

在第 1 节中,我们讲的都是 Q I M \mathsf{QIM} QIM 的抽象概念,没有落实具体的做法。比如:我们并没有介绍 Q ( ⋅ ) Q(\cdot) Q() 量化器的函数公式是什么。接下来,我将介绍我在论文中看到的真实做法。



2.1 均匀量化器

论文中具体采用的是均匀量化器。

量化器 Q 0 Q_0 Q0 Q 1 Q_1 Q1 的元素之间的最小距离 d m i n d_{min} dmin 通常被称为 Δ \Delta Δ 量化步长:

在这里插入图片描述

量化步长 Δ \Delta Δ 可以用于衡量算法的鲁棒性,一般来说 Δ \Delta Δ 越大,算法的鲁棒性越强。

个人理解:均匀量化器是指任意且相邻的两个元素之间的距离是相同的。

我们在 1.4 节提到, Q 0 Q_0 Q0 Q 1 Q_1 Q1 是值域不相交的两个量化器。

通常采用如下方式来为两个量化器分配值域:

在这里插入图片描述

这是一个实数数轴,任意两个端点之间的距离均为 Δ \Delta Δ,即每个区间的长度均为 Δ \Delta Δ

然后再将一个一个的区间分别分配给两个量化器,作为它们的值域:

  • Q 0 Q_0 Q0 的值域为 [ − 2 Δ , − Δ ) , [ 0 Δ , 1 Δ ) , [ 2 Δ , 3 Δ ) [-2\Delta,-\Delta),[0\Delta,1\Delta),[2\Delta,3\Delta) [,Δ),[,),[,)
  • Q 1 Q_1 Q1 的值域为 [ − 3 Δ , − 2 Δ ) , [ − Δ , 0 Δ ) , [ 2 Δ , 3 Δ ) [-3\Delta,-2\Delta),[-\Delta,0\Delta),[2\Delta,3\Delta) [,),[Δ,),[,)

呈现出了间隔分布的美感。同时,这样的分配是有一定的巧妙之处的。

Q 0 Q_0 Q0 [ − 2 Δ , − Δ ) , [ 0 Δ , 1 Δ ) , [ 2 Δ , 3 Δ ) [-2\Delta,-\Delta),[0\Delta,1\Delta),[2\Delta,3\Delta) [,Δ),[,),[,) 举例,这些区间上的任意数值整除 Δ \Delta Δ 后再对 2 2 2 取余,余数一定等于 0 0 0,从而对应到水印信息 0 0 0 Q 1 Q_1 Q1 的值域同理,其值域上的任意数值整除 Δ \Delta Δ 后再对 2 2 2 取余,余数一定一定等于 1 1 1,从而对应到水印信息 1 1 1



2.2 对论文的分析

后文中的量化值 Q Q Q 其实就是前文中的量化步长 Δ \Delta Δ

论文原文:水印的嵌入

基于给定的量化值 Q Q Q,通过以下公式构造一个包含 L H 1 LH1 LH1 子带调整系数的新矩阵 S S S

S ( i , j ) = ⌊ L H 1 ( i , j ) Q ⌋ S(i,j)=\left \lfloor \frac{LH1(i,j)}{Q} \right \rfloor S(i,j)=QLH1(i,j)

将加密后的水印图像 E W EW EW 按照下以下规则嵌入到 L H 1 LH1 LH1 子带中,从而得到 L H 1 ′ LH1' LH1

if mod(S(i, j), 2) = EW(k) thenLH1(i, j) = S(i, j) * Q + Q / 2
End ifif mod(S(i, j), 2) != EW(k) thenif LH1(i, j) - S(i, j) * Q ∈ [0, Q/2] thenLH1(i, j) = (S(i, j) - 1) * Q + Q / 2ElseLH1(i, j) = (S(i, j) + 1) * Q + Q / 2End if
End if


论文原文:水印的提取

首先

S ′ ( i , j ) = ⌊ L H 1 ′ ( i , j ) Q ⌋ S'(i,j)=\left \lfloor \frac{LH1'(i,j)}{Q} \right \rfloor S(i,j)=QLH1(i,j)

然后通过下式提取加密水印图像 E W EW EW

E W ′ ( k ) = m o d ( S ′ ( i , j ) , 2 ) EW'(k)=\mathrm{mod}(S'(i,j),2) EW(k)=mod(S(i,j),2)

说明:加上一撇是为了和原始的值进行区分。




论文分析:水印的嵌入

首先,一上来就是原始信息 L H 1 LH1 LH1 对量化步长 Q Q Q 的整除。由于 S S S 是整数,因此 S ⋅ Q S\cdot Q SQ 一定等于某端点的值,但是该端点可能是 Q 0 Q_0 Q0 的元素,也可能是 Q 1 Q_1 Q1 的元素。因此,我们需要根据待嵌入的水印信息对 S ⋅ Q S\cdot Q SQ 进行调整,以得到符合要求的 L H 1 ′ LH1' LH1



情况一

假设 L H 1 = 1.7 Δ LH1=1.7\Delta LH1=1.7Δ 且待嵌入的水印信息为 1 1 1。由于整除的结果是 1 ∈ Q 1 1\in Q_1 1Q1,因此我们不需要调整 S ⋅ Q S\cdot Q SQ。但是为了防止 S ⋅ Q S\cdot Q SQ 在传输过程中发生微小偏移而落入到 Q 0 Q_0 Q0 的区间中,我们将 S ⋅ Q S\cdot Q SQ 移动到当前 Q 1 Q_1 Q1 区间的中心。如下图所示:

在这里插入图片描述
对应以下代码:

if mod(S(i, j), 2) = EW(k) thenLH1(i, j) = S(i, j) * Q + Q / 2
End if


情况二

假设 L H 1 = 1.7 Δ LH1=1.7\Delta LH1=1.7Δ 且待嵌入的水印信息为 0 0 0。由于整除的结果是 1 ∈ Q 1 1\in Q_1 1Q1,因此我们需要调整 S ⋅ Q S\cdot Q SQ,使其移动到 Q 0 Q_0 Q0 的值域中。我们既可以往左边的 Q 0 Q_0 Q0 区间移动,也可以往右边的 Q 0 Q_0 Q0 区间移动。如下图所示:

在这里插入图片描述

由于我们希望 L H 1 ′ LH1' LH1 L H 1 LH1 LH1 的差值不要太大,以保证图像的质量,因此我们选择向距离 L H 1 = 1.7 Δ LH1=1.7\Delta LH1=1.7Δ 更近的区间移动。在代码中,使用了以下条件进行判断:

if LH1(i, j) - S(i, j) * Q ∈ [0, Q/2] thenLH1(i, j) = (S(i, j) - 1) * Q + Q / 2
ElseLH1(i, j) = (S(i, j) + 1) * Q + Q / 2
End if

即如果 L H 1 LH1 LH1 距离所处区间的左端点超过 0.5 Δ 0.5\Delta 0.5Δ,那么往右边的 Q 0 Q_0 Q0 区间移动;否则往左边的 Q 0 Q_0 Q0 区间移动。如下图所示:

在这里插入图片描述

上述距离是通过 LH1(i, j) - S(i, j) * Q 求得的。



论文分析:水印的提取

已知: L H 1 = 1.7 Δ LH1=1.7\Delta LH1=1.7Δ 且待嵌入的水印信息为 0 0 0,量化后得到 L H 1 ′ = 2.5 Δ LH1'=2.5\Delta LH1=2.5Δ

在接收到 L H 1 ′ LH1' LH1 后,首先对其进行量化:

S ( i , j ) = ⌊ L H 1 ′ ( i , j ) Q ⌋ = 2 S(i,j)=\left \lfloor \frac{LH1'(i,j)}{Q} \right \rfloor = 2 S(i,j)=QLH1(i,j)=2

注意:这一节所有公式里的 Q Q Q 就是量化步长 Δ \Delta Δ,我只是懒得改了😇

然后通过下式提取嵌入其中的水印信息:

E W ( k ) = m o d ( S ( i , j ) , 2 ) = 0 EW(k)=\mathrm{mod}(S(i,j),2)=0 EW(k)=mod(S(i,j),2)=0

水印信息提取成功!

事实上,即使 L H 1 ′ LH1' LH1 在传输的过程中发生了变化,只要它的值还在 [ 2 Δ , 3 Δ ) [2\Delta,3\Delta) [,) 这个区间内,就能提取出正确的水印信息。这就是为什么我们在嵌入水印时,要求把 L H 1 ′ LH1' LH1 移动到区间的中心。本质上,就是提供 ± 0.5 Δ \pm 0.5 \Delta ±0.5Δ 的误差空间,以提高本水印嵌入方式的鲁棒性。




参考的博客和论文:

  • 基于量化索引调制的信息隐藏方法 - CSDN
  • QIM blind video watermarking scheme based on Wavelet transform and principal component analysis
  • A blind and robust color image watermarking scheme based on DCT and DWT domains

对 QIM 的介绍是从第一篇论文里抄的,对 QIM 的应用是从第二篇论文里抄的。



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

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

相关文章

Windows下如何把Oracle从C盘整体迁移到D盘?

&#xff08;一&#xff09;写这篇文章的起因 这篇文章适合刚接触的技术小白follow操作&#xff0c;整理文章不易&#xff0c;大家多多点赞转发 起因是昨天有会员在群里发问&#xff0c;客户要把Oracle整个目录从C盘挪到D盘怎么弄 客户那边的人把Oracle整个程序数据文件都安装…

【C++】vector的模拟实现

&#x1f497;个人主页&#x1f497; ⭐个人专栏——C学习⭐ &#x1f4ab;点击关注&#x1f929;一起学习C语言&#x1f4af;&#x1f4ab; 目录 导读 1. vector的核心框架接口 2. 构造函数 2.1 基本构造 2.2 拷贝构造&#xff08;传统写法&#xff09; 2.3 析构函数 2…

《python》poetry install下载缓慢,网络问题断开连接--poetry换源镜像下载

在使用打包工具poetry进行打包的是出现了一个问题就是&#xff0c;在使用poetry进行打包的时候出现了&#xff0c;连接断开这样的问题&#xff0c;这个问题是可以通过换源&#xff0c;通过国内的镜像来解决这个问题就可以了。 找到项目中的pyoroject。toml文件这个文件中写了一…

FJSP:蛇鹫优化算法(SBOA)求解柔性作业车间调度问题(FJSP),提供MATLAB代码

详细介绍 FJSP&#xff1a;蛇鹫优化算法&#xff08;Secretary bird optimization algorithm&#xff0c;SBOA&#xff09;求解柔性作业车间调度问题&#xff08;FJSP&#xff09;&#xff0c;提供MATLAB代码-CSDN博客 完整MATLAB代码 FJSP&#xff1a;蛇鹫优化算法&#xff…

设计模式(十三)行为型模式---命令模式(command)

文章目录 命令模式简介结构UML图具体实现UML图代码实现 命令模式简介 命令模式&#xff08;command pattern&#xff09;也叫动作模式或者事务模式。它是将请求&#xff08;命令&#xff09;封装成对象&#xff0c;使得可以用不同的请求对客户端进行参数化&#xff0c;具体的请…

梯度下降: 01.原理与代码实操

1. 简介 梯度下降法(GradientDescent) 算法,不像多元线性回归那样是一个具体做回归任务的算法,而是一个非常通用的优化算法来帮助一些机器学习算法(都是无约束最优化问题)求解出最优解,所谓的通用就是很多机器学习算法都是用梯度下降,甚至深度学习也是用它来求解最优解。…

区块链--Ubuntu上搭建以太坊私有链

1、搭建私链所需环境 操作系统&#xff1a;ubuntu16.04&#xff0c;开虚拟机的话要至少4G&#xff0c;否则会影响测试挖矿时的速度 软件&#xff1a; geth客户端 Mist和Ethereum Wallet&#xff1a;Releases ethereum/mist GitHub 2、安装geth客户端 sudo apt-get update …

Java——常见进制

在计算机领域有四种比较常见的进制&#xff0c;分别是二进制、八进制、十进制和十六进制。 一、二进制&#xff08;Binary&#xff09; 二进制&#xff08;Binary&#xff09;是一种基数为2的数值系统&#xff0c;仅使用两个符号&#xff1a;0和1。所以它的进位规则就是逢二进…

MYSQL一、MYSQL的了解

一、MySQL概述 1、数据库相关概念 为了方便&#xff0c;我们一般把mysql数据库管理系统简称位mysql数据库 通过可以操作数据库管理系统&#xff0c;然后再通过数据库管理系统操作&#xff08;数据库&#xff09;和&#xff08;数据库里面的数据&#xff09; 2、当前主流的关系…

视频汇聚EasyCVR平台视图库GA/T 1400协议与GB/T 28181协议的区别

在公安和公共安全领域&#xff0c;视频图像信息的应用日益广泛&#xff0c;尤其是在监控、安防和应急指挥等方面。为了实现视频信息的有效传输、接收和处理&#xff0c;GA/T 1400和GB/T 28181这两个协议被广泛应用。虽然两者都服务于视频信息处理的目的&#xff0c;但它们在实际…

Llama(一):Mac M1芯片运行Llama3

目录 安装Ollama for Mac 下载Llama 3模型 运行Llama3 试用Llama3 在命令行中使用Llama3 背景 本地环境&#xff1a;Mac M1,16GB内存 安装Ollama for Mac 官方地址 https://ollama.com/download/Ollama-darwin.zip 链接: 百度网盘 提取码: 8wqx 下载Llama 3模型 oll…

从国产低代码龙头企业零赛云看零(低)代码在软件开发行业和工业企业的应用趋势

从国产低代码龙头企业零赛云看零&#xff08;低&#xff09;代码在软件开发行业和工业企业的应用趋势 --- 什么是零&#xff08;低&#xff09;代码&#xff1f;零&#xff08;低&#xff09;代码开发完整指南 一、什么是零&#xff08;低&#xff09;代码&#xff1f; 零&am…

pdb文件名称被修改导致pdb文件加载失败的实战排查案例分享

目录 1、概述 2、问题说明 3、pdb文件加载失败的可能原因有哪些&#xff1f; 4、使用!sym noisy打开pdb加载详情&#xff0c;发现pdb文件名称确实被修改了 5、Windbg是如何知道要加载pdb文件名称的&#xff1f; C软件异常排查从入门到精通系列教程&#xff08;专栏文章列表…

linux进程加载和启动过程分析

我们的源代码通过预处理,编译,汇编,链接后形成可执行文件,那么当我们在终端敲下指令$ ./a.out argv1 argv2 后,操作系统是怎么将我们的可执行文件加载并运行的呢? 首先知道,计算机的操作系统的启动程序是写死在硬件上的,每次计算机上电时,都将自动加载启动程序,之后…

翻译《The Old New Thing》- What a drag: Dragging a Uniform Resource Locator (URL)

What a drag: Dragging a Uniform Resource Locator (URL) - The Old New Thing (microsoft.com)https://devblogs.microsoft.com/oldnewthing/20080312-00/?p23133 Raymond Chen 2008年03月12日 麻烦的拖拽&#xff1a;拖拽统一资源定位符&#xff08;URL&#xff09; 简要 …

Java(十二)---认识异常

文章目录 前言1. 异常的概念与体系结构1.1.异常的概念1.异常的体系1.3 异常的分类 2. 异常的处理2.1 防御式编程2.2 异常的抛出2.3 异常的捕获2.3.1 异常声明throws2.3.2 try-catch捕获并处理2.3.3 finally 2.4 异常的处理流程 3. 自定义异常类 前言 这一篇就是咱们学习JavaSE…

C++ : 模板初阶

标题&#xff1a;C : 模板初阶 水墨不写bug 正文开始&#xff1a; C语言的问题 &#xff1a; 写不完的swap函数 在学习C语言时&#xff0c;我们有一个经常使用的函数swap函数&#xff0c;它可以将两个对象的值交换。 我们通常这样实现它&#xff1a; void swap(int t1,int t…

【vue实战项目】通用管理系统:作业列表

目录 目录 1.前言 2.后端API 3.前端API 4.组件 5.分页 6.封装组件 1.前言 本文是博主前端Vue实战系列中的一篇文章&#xff0c;本系列将会带大家一起从0开始一步步完整的做完一个小项目&#xff0c;让你找到Vue实战的技巧和感觉。 专栏地址&#xff1a; https://blog…

uni-app解决表格uni-table样式问题

一、如何让表格文字只显示一行&#xff0c;超出部分用省略号表示 步骤 &#xff1a; 给table设置table-layout:fixed; 列宽由表格宽度和列宽度设定。&#xff08;默认是由单元格内容设定&#xff09;让表格元素继承父元素宽度固定table-layout: inherit;overflow: hidden;超过…

list的简单模拟实现

文章目录 目录 文章目录 前言 一、使用list时的注意事项 1.list不支持std库中的sort排序 2.去重操作 3.splice拼接 二、list的接口实现 1.源码中的节点 2.源码中的构造函数 3.哨兵位头节点 4.尾插和头插 5.迭代器* 5.1 迭代器中的operator和-- 5.2其他迭代器中的接口 5.3迭代器…