本文主要是介绍数字水印 | 盲水印嵌入:量化索引机制 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′=argm∥y−s(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 \| ∥y−s(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) [−2Δ,−Δ),[0Δ,1Δ),[2Δ,3Δ)
- Q 1 Q_1 Q1 的值域为 [ − 3 Δ , − 2 Δ ) , [ − Δ , 0 Δ ) , [ 2 Δ , 3 Δ ) [-3\Delta,-2\Delta),[-\Delta,0\Delta),[2\Delta,3\Delta) [−3Δ,−2Δ),[−Δ,0Δ),[2Δ,3Δ)
呈现出了间隔分布的美感。同时,这样的分配是有一定的巧妙之处的。
拿 Q 0 Q_0 Q0 的 [ − 2 Δ , − Δ ) , [ 0 Δ , 1 Δ ) , [ 2 Δ , 3 Δ ) [-2\Delta,-\Delta),[0\Delta,1\Delta),[2\Delta,3\Delta) [−2Δ,−Δ),[0Δ,1Δ),[2Δ,3Δ) 举例,这些区间上的任意数值整除 Δ \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 S⋅Q 一定等于某端点的值,但是该端点可能是 Q 0 Q_0 Q0 的元素,也可能是 Q 1 Q_1 Q1 的元素。因此,我们需要根据待嵌入的水印信息对 S ⋅ Q S\cdot Q S⋅Q 进行调整,以得到符合要求的 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 1∈Q1,因此我们不需要调整 S ⋅ Q S\cdot Q S⋅Q。但是为了防止 S ⋅ Q S\cdot Q S⋅Q 在传输过程中发生微小偏移而落入到 Q 0 Q_0 Q0 的区间中,我们将 S ⋅ Q S\cdot Q S⋅Q 移动到当前 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 1∈Q1,因此我们需要调整 S ⋅ Q S\cdot Q S⋅Q,使其移动到 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) [2Δ,3Δ) 这个区间内,就能提取出正确的水印信息。这就是为什么我们在嵌入水印时,要求把 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的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!