数字水印 | 盲水印嵌入:量化索引机制 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

相关文章

JVM 的类初始化机制

前言 当你在 Java 程序中new对象时,有没有考虑过 JVM 是如何把静态的字节码(byte code)转化为运行时对象的呢,这个问题看似简单,但清楚的同学相信也不会太多,这篇文章首先介绍 JVM 类初始化的机制,然后给出几个易出错的实例来分析,帮助大家更好理解这个知识点。 JVM 将字节码转化为运行时对象分为三个阶段,分别是:loading 、Linking、initialization

性能分析之MySQL索引实战案例

文章目录 一、前言二、准备三、MySQL索引优化四、MySQL 索引知识回顾五、总结 一、前言 在上一讲性能工具之 JProfiler 简单登录案例分析实战中已经发现SQL没有建立索引问题,本文将一起从代码层去分析为什么没有建立索引? 开源ERP项目地址:https://gitee.com/jishenghua/JSH_ERP 二、准备 打开IDEA找到登录请求资源路径位置

【生成模型系列(初级)】嵌入(Embedding)方程——自然语言处理的数学灵魂【通俗理解】

【通俗理解】嵌入(Embedding)方程——自然语言处理的数学灵魂 关键词提炼 #嵌入方程 #自然语言处理 #词向量 #机器学习 #神经网络 #向量空间模型 #Siri #Google翻译 #AlexNet 第一节:嵌入方程的类比与核心概念【尽可能通俗】 嵌入方程可以被看作是自然语言处理中的“翻译机”,它将文本中的单词或短语转换成计算机能够理解的数学形式,即向量。 正如翻译机将一种语言

Java ArrayList扩容机制 (源码解读)

结论:初始长度为10,若所需长度小于1.5倍原长度,则按照1.5倍扩容。若不够用则按照所需长度扩容。 一. 明确类内部重要变量含义         1:数组默认长度         2:这是一个共享的空数组实例,用于明确创建长度为0时的ArrayList ,比如通过 new ArrayList<>(0),ArrayList 内部的数组 elementData 会指向这个 EMPTY_EL

【编程底层思考】垃圾收集机制,GC算法,垃圾收集器类型概述

Java的垃圾收集(Garbage Collection,GC)机制是Java语言的一大特色,它负责自动管理内存的回收,释放不再使用的对象所占用的内存。以下是对Java垃圾收集机制的详细介绍: 一、垃圾收集机制概述: 对象存活判断:垃圾收集器定期检查堆内存中的对象,判断哪些对象是“垃圾”,即不再被任何引用链直接或间接引用的对象。内存回收:将判断为垃圾的对象占用的内存进行回收,以便重新使用。

【Tools】大模型中的自注意力机制

摇来摇去摇碎点点的金黄 伸手牵来一片梦的霞光 南方的小巷推开多情的门窗 年轻和我们歌唱 摇来摇去摇着温柔的阳光 轻轻托起一件梦的衣裳 古老的都市每天都改变模样                      🎵 方芳《摇太阳》 自注意力机制(Self-Attention)是一种在Transformer等大模型中经常使用的注意力机制。该机制通过对输入序列中的每个元素计算与其他元素之间的相似性,

如何通俗理解注意力机制?

1、注意力机制(Attention Mechanism)是机器学习和深度学习中一种模拟人类注意力的方法,用于提高模型在处理大量信息时的效率和效果。通俗地理解,它就像是在一堆信息中找到最重要的部分,把注意力集中在这些关键点上,从而更好地完成任务。以下是几个简单的比喻来帮助理解注意力机制: 2、寻找重点:想象一下,你在阅读一篇文章的时候,有些段落特别重要,你会特别注意这些段落,反复阅读,而对其他部分

【Tools】大模型中的注意力机制

摇来摇去摇碎点点的金黄 伸手牵来一片梦的霞光 南方的小巷推开多情的门窗 年轻和我们歌唱 摇来摇去摇着温柔的阳光 轻轻托起一件梦的衣裳 古老的都市每天都改变模样                      🎵 方芳《摇太阳》 在大模型中,注意力机制是一种重要的技术,它被广泛应用于自然语言处理领域,特别是在机器翻译和语言模型中。 注意力机制的基本思想是通过计算输入序列中各个位置的权重,以确

FreeRTOS内部机制学习03(事件组内部机制)

文章目录 事件组使用的场景事件组的核心以及Set事件API做的事情事件组的特殊之处事件组为什么不关闭中断xEventGroupSetBitsFromISR内部是怎么做的? 事件组使用的场景 学校组织秋游,组长在等待: 张三:我到了 李四:我到了 王五:我到了 组长说:好,大家都到齐了,出发! 秋游回来第二天就要提交一篇心得报告,组长在焦急等待:张三、李四、王五谁先写好就交谁的

UVM:callback机制的意义和用法

1. 作用         Callback机制在UVM验证平台,最大用处就是为了提高验证平台的可重用性。在不创建复杂的OOP层次结构前提下,针对组件中的某些行为,在其之前后之后,内置一些函数,增加或者修改UVM组件的操作,增加新的功能,从而实现一个环境多个用例。此外还可以通过Callback机制构建异常的测试用例。 2. 使用步骤         (1)在UVM组件中内嵌callback函