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

2024-06-03 11:52

本文主要是介绍数字水印 | 盲水印嵌入:量化索引机制 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 的应用是从第二篇论文里抄的。



这篇关于数字水印 | 盲水印嵌入:量化索引机制 QIM的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1026918

相关文章

Python FastAPI+Celery+RabbitMQ实现分布式图片水印处理系统

《PythonFastAPI+Celery+RabbitMQ实现分布式图片水印处理系统》这篇文章主要为大家详细介绍了PythonFastAPI如何结合Celery以及RabbitMQ实现简单的分布式... 实现思路FastAPI 服务器Celery 任务队列RabbitMQ 作为消息代理定时任务处理完整

java中反射(Reflection)机制举例详解

《java中反射(Reflection)机制举例详解》Java中的反射机制是指Java程序在运行期间可以获取到一个对象的全部信息,:本文主要介绍java中反射(Reflection)机制的相关资料... 目录一、什么是反射?二、反射的用途三、获取Class对象四、Class类型的对象使用场景1五、Class

Mysql中InnoDB与MyISAM索引差异详解(最新整理)

《Mysql中InnoDB与MyISAM索引差异详解(最新整理)》InnoDB和MyISAM在索引实现和特性上有差异,包括聚集索引、非聚集索引、事务支持、并发控制、覆盖索引、主键约束、外键支持和物理存... 目录1. 索引类型与数据存储方式InnoDBMyISAM2. 事务与并发控制InnoDBMyISAM

StarRocks索引详解(最新整理)

《StarRocks索引详解(最新整理)》StarRocks支持多种索引类型,包括主键索引、前缀索引、Bitmap索引和Bloomfilter索引,这些索引类型适用于不同场景,如唯一性约束、减少索引空... 目录1. 主键索引(Primary Key Index)2. 前缀索引(Prefix Index /

Nginx之upstream被动式重试机制的实现

《Nginx之upstream被动式重试机制的实现》本文主要介绍了Nginx之upstream被动式重试机制的实现,可以通过proxy_next_upstream来自定义配置,具有一定的参考价值,感兴... 目录默认错误选择定义错误指令配置proxy_next_upstreamproxy_next_upst

MySQL进阶之路索引失效的11种情况详析

《MySQL进阶之路索引失效的11种情况详析》:本文主要介绍MySQL查询优化中的11种常见情况,包括索引的使用和优化策略,通过这些策略,开发者可以显著提升查询性能,需要的朋友可以参考下... 目录前言图示1. 使用不等式操作符(!=, <, >)2. 使用 OR 连接多个条件3. 对索引字段进行计算操作4

Spring排序机制之接口与注解的使用方法

《Spring排序机制之接口与注解的使用方法》本文介绍了Spring中多种排序机制,包括Ordered接口、PriorityOrdered接口、@Order注解和@Priority注解,提供了详细示例... 目录一、Spring 排序的需求场景二、Spring 中的排序机制1、Ordered 接口2、Pri

MySQL 缓存机制与架构解析(最新推荐)

《MySQL缓存机制与架构解析(最新推荐)》本文详细介绍了MySQL的缓存机制和整体架构,包括一级缓存(InnoDBBufferPool)和二级缓存(QueryCache),文章还探讨了SQL... 目录一、mysql缓存机制概述二、MySQL整体架构三、SQL查询执行全流程四、MySQL 8.0为何移除查

Java实现Elasticsearch查询当前索引全部数据的完整代码

《Java实现Elasticsearch查询当前索引全部数据的完整代码》:本文主要介绍如何在Java中实现查询Elasticsearch索引中指定条件下的全部数据,通过设置滚动查询参数(scrol... 目录需求背景通常情况Java 实现查询 Elasticsearch 全部数据写在最后需求背景通常情况下

一文详解Java Condition的await和signal等待通知机制

《一文详解JavaCondition的await和signal等待通知机制》这篇文章主要为大家详细介绍了JavaCondition的await和signal等待通知机制的相关知识,文中的示例代码讲... 目录1. Condition的核心方法2. 使用场景与优势3. 使用流程与规范基本模板生产者-消费者示例