🥳原文: Embedding color watermark image to color host image based on 2D-DCT
🥳前言: 这是一篇 2023 年的 SCI 物理 3 区,采用量化机制实现的盲水印嵌入。
- 本人对量化的介绍:数字水印 | 盲水印嵌入:量化索引机制 QIM
1 Watermark Embedding Procedure
本文所提出的水印嵌入过程如下图所示:
步骤一
针对一个大小为 M × M M × M M×M 的原始图像 H H H:
- ① 将其分离成 R , G , B \mathsf{R,G,B} R,G,B 三层,并把它们视作载体图像 H i ( i = 1 , 2 , 3 ) H_i(i=1,2,3) Hi(i=1,2,3);
- ② 将 H i H_i Hi 分割成大小为 4 × 4 4 × 4 4×4 的非重叠图像块。
针对一个大小为 N × N N × N N×N 的水印 W W W:
- ① 将其分离成 R , G , B \mathsf{R,G,B} R,G,B 三层;
- ② 为了提高算法的安全性,将基于密钥 K a i Ka_i Kai 的仿射变换和基于密钥 K b i Kb_i Kbi 的 A r n o l d \mathsf{Arnold} Arnold 变换依次分别应用于 3 3 3 个水印层,从而得到 3 3 3 个混沌的水印层 W i W_i Wi;
- ③ 将 W i W_i Wi 的像素由十进制值转换为二进制值,并将所有结果拼接起来,得到一个长度为 8 N 2 8N^2 8N2 的序列 S W i SW_i SWi,其中 i = 1 , 2 , 3 i=1,2,3 i=1,2,3 代表 R G B \mathsf{RGB} RGB 颜色模型中的 3 3 3 层。
说明:本文处理的水印是彩色水印,因此像素值不是 0 0 0 和 1 1 1。而在后面使用量化机制进行水印嵌入时,我们希望水印信息是以 01 01 01 的二进制形式出现的,因此这里将水印转换为二进制序列。
步骤二
为了提高抵抗裁剪攻击的鲁棒性,利用 randperm()
函数生成随机数矩阵,并基于密钥
K
c
i
Kc_i
Kci 和
K
d
i
Kd_i
Kdi 从
H
i
H_i
Hi 中选择一个图像块
A
A
A,其中
i
=
1
,
2
,
3
i=1,2,3
i=1,2,3 代表
R
G
B
\mathsf{RGB}
RGB 颜色模型中的
3
3
3 层。
说明:
randperm()
是 Matlab 提供的一个函数,用于生成随机数矩阵。但我感觉原文对各个密钥的使用都没有进行具体介绍,不过大家应该都知道如何对水印进行置乱预处理,因此也没必要细究本文的方法😇
步骤三
对图像块 A A A 进行 2 D - D C T \mathsf{2D\text{-}DCT} 2D-DCT 变换,得到系数矩阵 d c t A \mathsf{dct}A dctA,如下所示:
d c t A = d c t 2 ( A ) \mathsf{dct}A=\mathsf{dct2}(A) dctA=dct2(A)
说明: d c t A \mathsf{dct}A dctA 是一个变量名,
dct2()
是一个 Matlab 提供的函数,用于做 2D - DCT 变换。请勿混淆!
根据 z i g - z a g \mathsf{zig \text{-} zag} zig-zag 形状,从 d c t A \mathsf{dct}A dctA 中选取两个中频系数对 ( c p 1 , c p 2 ) (c_{p1},c_{p2}) (cp1,cp2):
其中 p = 1 , 2 p=1,2 p=1,2 表示从矩阵 d c t A \mathsf{dct}A dctA 中选取的第 p p p 个中频系数对, c p 1 c_{p1} cp1 表示第 p p p 个中频系数对中的一个中频系数。本文共选取 2 2 2 对中频系数,第一对中频系数的坐标分别为 ( 3 , 1 ) (3,1) (3,1) 和 ( 2 , 2 ) (2,2) (2,2),第二对中频系数的坐标分别为 ( 1 , 3 ) (1,3) (1,3) 和 ( 2 , 3 ) (2,3) (2,3)。
说明:貌似 z i g - z a g \mathsf{zig \text{-} zag} zig-zag 一词只是为了形容形状,中文翻译过来是 “之字形”。
步骤四(核心步骤)
说明:已知 S W i SW_i SWi 是一个二进制序列,其中的一个比特被称为水印位 w p w_p wp。
依次从 S W i SW_i SWi 中获取水印位 w p w_p wp,然后使用如下公式调整 d c t A \mathsf{dct}A dctA 中的系数 ( c p 1 , c p 2 ) (c_{p1},c_{p2}) (cp1,cp2):
c p 1 ′ = { s i g n c ( c p 1 ) × ( a v g − Δ × T i ) , i f w p = 1 a n d D i f f ≤ T i s i g n c ( c p 1 ) × ( a v g + Δ × T i ) , i f w p = 0 a n d D i f f > − T i c'_{p1}= \left\{\begin{matrix} \mathrm{signc}(c_{p1})\times (avg-\Delta\times T_i),\ \mathrm{if}\ w_p=1\ \mathrm{and}\ \mathrm{Diff} \le T_i \\ \\ \mathrm{signc}(c_{p1})\times (avg+\Delta\times T_i),\ \mathrm{if}\ w_p=0\ \mathrm{and}\ \mathrm{Diff} > -T_i \end{matrix}\right. cp1′=⎩ ⎨ ⎧signc(cp1)×(avg−Δ×Ti), if wp=1 and Diff≤Tisignc(cp1)×(avg+Δ×Ti), if wp=0 and Diff>−Ti
c p 2 ′ = { s i g n c ( c p 2 ) × ( a v g + Δ × T i ) , i f w p = 1 a n d D i f f ≤ T i s i g n c ( c p 2 ) × ( a v g − Δ × T i ) , i f w p = 0 a n d D i f f > − T i c'_{p2}= \left\{\begin{matrix} \mathrm{signc}(c_{p2})\times (avg+\Delta\times T_i),\ \mathrm{if}\ w_p=1\ \mathrm{and}\ \mathrm{Diff} \le T_i \\ \\ \mathrm{signc}(c_{p2})\times (avg-\Delta\times T_i),\ \mathrm{if}\ w_p=0\ \mathrm{and}\ \mathrm{Diff} > -T_i \end{matrix}\right. cp2′=⎩ ⎨ ⎧signc(cp2)×(avg+Δ×Ti), if wp=1 and Diff≤Tisignc(cp2)×(avg−Δ×Ti), if wp=0 and Diff>−Ti
其中, a v g avg avg 是 c p 1 c_{p1} cp1 和 c p 2 c_{p2} cp2 的绝对值的平均值, T i T_i Ti 是 i i i 层的量化步长, D i f f \mathrm{Diff} Diff 的取值为:
D i f f = a b s ( c p 2 ) − a b s ( c p 1 ) \mathrm{Diff}=\mathrm{abs}(c_{p2})-\mathrm{abs}(c_{p1}) Diff=abs(cp2)−abs(cp1)
自定义函数 s i g n c ( ⋅ ) \mathrm{signc}(\cdot) signc(⋅) 的规则如下:
s i g n c ( x ) = { s i g n ( x ) , i f x ≠ 0 1 , e l s e \mathrm{signc}(x)= \left\{\begin{matrix} \mathrm{sign}(x),\ \mathrm{if}\ x\ne0 \\ \\ 1,\ \mathrm{else} \end{matrix}\right. signc(x)=⎩ ⎨ ⎧sign(x), if x=01, else
其中 s i g n ( ⋅ ) \mathrm{sign}(\cdot) sign(⋅) 是判断数值符号的函数,它的规则如下:
s i g n ( x ) = { − 1 , i f x < 0 0 , i f x = 0 1 , i f x > 0 \mathrm{sign}(x)= \left\{\begin{matrix} -1,\ \mathrm{if}\ x<0 \\ 0,\ \mathrm{if}\ x=0 \\ 1,\ \mathrm{if}\ x>0 \end{matrix}\right. sign(x)=⎩ ⎨ ⎧−1, if x<00, if x=01, if x>0
也就是说:在区间 ( − ∞ , 0 ) (-\infty, 0) (−∞,0) 中 s i g n c ( ⋅ ) \mathrm{signc}(\cdot) signc(⋅) 的取值为 − 1 -1 −1,在区间 [ 0 , + ∞ ) [0, +\infty) [0,+∞) 中 s i g n c ( ⋅ ) \mathrm{signc}(\cdot) signc(⋅) 的取值为 1 1 1。
嵌入系数
Δ
\Delta
Δ 的确定规则由下式给出:
Δ
=
α
×
(
d
c
t
A
(
1
,
1
)
−
a
v
g
_
b
l
o
c
k
)
/
d
c
t
A
(
1
,
1
)
\Delta=\alpha \times(\mathrm{dct}A(1,1)-avg\_block)/\mathrm{dct}A(1,1)
Δ=α×(dctA(1,1)−avg_block)/dctA(1,1)
其中
a
v
g
_
b
l
o
c
k
avg\_block
avg_block 是矩阵
d
c
t
A
\mathsf{dct}A
dctA 的所有元素的平均值,
α
\alpha
α 是用于调节不可见性和鲁棒性的系数。
步骤五
将调整后的系数对 ( c p 1 ′ , c p 2 ′ ) (c'_{p1},c'_{p2}) (cp1′,cp2′) 更新到系数对 ( c p 1 , c p 2 ) (c_{p1},c_{p2}) (cp1,cp2) 的原位置,得到含水印的矩阵 d c t A ′ \mathsf{dct}A' dctA′。
步骤六
对含水印的矩阵 d c t A ′ \mathsf{dct}A' dctA′ 进行 2 D - I D C T \mathsf{2D\text{-}IDCT} 2D-IDCT 得到含水印的图像块 A ′ A' A′,公式如下:
A ′ = i d c t 2 ( d c t A ′ ) A'=\mathsf{idct2}(\mathsf{dct}A') A′=idct2(dctA′)
然后将 A ′ A' A′ 更新到载体图像层 H i H_i Hi 中的相应位置。
步骤七
重复上述步骤二到步骤六,直到将 w p w_p wp 全部嵌入完毕,得到含水印的载体图像层 H i ′ H'_i Hi′。最后合并 R , G , B \mathsf{R,G,B} R,G,B 三层的 H i ′ H'_i Hi′,得到最终的含水印图像 H ′ H' H′。
2 Watermark Extraction Procedure
本文所提出的水印提取过程如下图所示:
步骤一
将接收到的 H ′ H' H′ 调整为 M × M M × M M×M 的大小,并分离得到 R , G , B \mathsf{R,G,B} R,G,B 三层的含水印图像 H i ′ H'_i Hi′。然后,将每个 H i ′ H'_i Hi′ 分割成大小为 4 × 4 4 × 4 4×4 的非重叠图像块,其中 i = 1 , 2 , 3 i=1,2,3 i=1,2,3 代表 R G B \mathsf{RGB} RGB 颜色模型中的 3 3 3 层。
步骤二
使用 randperm()
函数之前产生的随机数矩阵,根据密钥
K
c
i
Kc_i
Kci 和
K
d
i
Kd_i
Kdi 从
H
i
′
H'_i
Hi′ 中选择含水印图像块
A
′
A'
A′,其中
i
=
1
,
2
,
3
i=1,2,3
i=1,2,3 代表
R
G
B
\mathsf{RGB}
RGB 颜色模型中的
3
3
3 层。
步骤三
对选定的图像块 A ′ A' A′ 进行二维离散余弦变换,得到系数矩阵 d c t A ′ \mathsf{dct}A' dctA′,并按照 z i g - z a g \mathsf{zig \text{-} zag} zig-zag 形从矩阵 d c t A ′ \mathsf{dct}A' dctA′ 中选取与嵌入过程相同位置的两个系数对 ( c p 1 ′ , c p 2 ′ ) (c'_{p1}, c'_{p2}) (cp1′,cp2′),其中 p = 1 , 2 p=1,2 p=1,2 表示从矩阵 d c t A \mathsf{dct}A dctA 中选取的第 p p p 对中频系数。
步骤四(核心步骤)
使用系数对 ( c p 1 ′ , c p 2 ′ ) (c'_{p1}, c'_{p2}) (cp1′,cp2′) 之间的关系,提取出水印位 w p ′ w_p' wp′,公式如下:
w p ′ = { 1 , i f a b s ( c p 1 ′ ) ≤ a b s ( c p 2 ′ ) 0 , e l s e w_p'= \left\{\begin{matrix} 1,\ \mathrm{if}\ \mathrm{abs}(c'_{p1}) \le \mathrm{abs}(c'_{p2}) \\ \\ 0,\ \mathrm{else} \end{matrix}\right. wp′=⎩ ⎨ ⎧1, if abs(cp1′)≤abs(cp2′)0, else
步骤五
重复上述步骤二到步骤四,得到每个水印层 H i ′ H'_i Hi′ 中含有的二进制序列 S W i ′ SW'_i SWi′。然后将二进制的 S W i ′ SW'_i SWi′ 序列转化为十进制序列,从而得到每个水印层的十进制序列。
步骤六
对三个水印层的十进制序列进行重新排列,得到三个经过置乱的水印层。利用密钥 K b i Kb_i Kbi 和 K a i Ka_i Kai 进行 A r n o l d \mathsf{Arnold} Arnold 变换和仿射变换的逆变换,得到提取的水印层 W i ′ W'_i Wi′。合并 3 3 3 个提取得到的水印层 W i ′ W'_i Wi′,最终得到水印图像 W ′ W' W′。
3 对核心步骤的理解
由水印提取过程的步骤四:
w p ′ = { 1 , i f a b s ( c p 1 ′ ) ≤ a b s ( c p 2 ′ ) 0 , e l s e w_p'= \left\{\begin{matrix} 1,\ \mathrm{if}\ \mathrm{abs}(c'_{p1}) \le \mathrm{abs}(c'_{p2}) \\ \\ 0,\ \mathrm{else} \end{matrix}\right. wp′=⎩ ⎨ ⎧1, if abs(cp1′)≤abs(cp2′)0, else
可以看出,本文的量化方案其实很简单,即通过比较 c p 1 ′ c'_{p1} cp1′ 和 c p 2 ′ c'_{p2} cp2′ 谁更大来判断嵌入的水印信息是 0 0 0 还是 1 1 1。由于 c p 1 c_{p1} cp1 和 c p 2 c_{p2} cp2 原本的大小关系可能不符合待嵌入的水印信息,因此本文使用了水印嵌入过程的步骤四来调整它们的大小关系,其调整结果便是 c p 1 ′ c'_{p1} cp1′ 和 c p 2 ′ c'_{p2} cp2′。
举例说明
假设待嵌入的水印位 w p = 1 w_p=1 wp=1 且 a b s ( c p 1 ) > a b s ( c p 2 ) \mathrm{abs}(c_{p1})>\mathrm{abs}(c_{p2}) abs(cp1)>abs(cp2),同时 c p 1 c_{p1} cp1 是一个负数而 c p 2 c_{p2} cp2 是一个正数。
分析:由于 a b s ( c p 1 ) > a b s ( c p 2 ) \mathrm{abs}(c_{p1})>\mathrm{abs}(c_{p2}) abs(cp1)>abs(cp2),根据水印提取规则是不符合待嵌入水印位 1 1 1 的,因此我们需要对其进行调整。很显然,我们需要减小 a b s ( c p 1 ) \mathrm{abs}(c_{p1}) abs(cp1) 并增大 a b s ( c p 2 ) \mathrm{abs}(c_{p2}) abs(cp2)。又由于调整后的数值不能太离谱,从而导致图像质量失真,因此我们是基于两个数的平均值进行调整的:
a v g = a b s ( c p 1 ) + a b s ( c p 2 ) 2 avg=\frac{\mathrm{abs}(c_{p1})+\mathrm{abs}(c_{p2})}{2} avg=2abs(cp1)+abs(cp2)
得到平均值后就可以以它为中心调整数值了:
{ c p 1 ′ = s i g n c ( c p 1 ) × ( a v g − Δ × T i ) c p 2 ′ = s i g n c ( c p 2 ) × ( a v g + Δ × T i ) \left\{\begin{matrix} c'_{p1} = \mathrm{signc}(c_{p1})\times (avg-\Delta\times T_i)\\ \\ c'_{p2} = \mathrm{signc}(c_{p2})\times (avg+\Delta\times T_i) \end{matrix}\right. ⎩ ⎨ ⎧cp1′=signc(cp1)×(avg−Δ×Ti)cp2′=signc(cp2)×(avg+Δ×Ti)
由于 a v g avg avg 是绝对值,因此需要使用 s i g n c ( ⋅ ) \mathrm{signc}(\cdot) signc(⋅) 函数来还原 c p 1 c_{p1} cp1 和 c p 2 c_{p2} cp2 的符号。
Q:水印嵌入过程中步骤四的 D i f f ≤ T i \mathrm{Diff} \le T_i Diff≤Ti 起到什么作用?
A:假设待嵌入的水印位 w p = 1 w_p=1 wp=1 且 c p 1 c_{p1} cp1 本来就比 c p 2 c_{p2} cp2 小,那么理论上是不需要对 c p 1 c_{p1} cp1 和 c p 2 c_{p2} cp2 进行调整的。但当 c p 1 c_{p1} cp1 和 c p 2 c_{p2} cp2 的绝对值差值 D i f f \mathrm{Diff} Diff 很小时,即 c p 1 c_{p1} cp1 和 c p 2 c_{p2} cp2 的绝对值相差不大,那么传输过程造成的微小变动可能导致 c p 1 c_{p1} cp1 和 c p 2 c_{p2} cp2 的大小关系发生反转。因此原文规定,只有当 D i f f \mathrm{Diff} Diff 大于量化步长 T i T_i Ti 时才不需要调整。