数字水印 | 量化相关论文:Embedding color watermark image to color host image based on 2D-DCT


🥳原文: Embedding color watermark image to color host image based on 2D-DCT

🥳前言: 这是一篇 2023 年的 SCI 物理 3 区,采用量化机制实现的盲水印嵌入。



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 DiffTisignc(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 DiffTisignc(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 DiffTi 起到什么作用?

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 时才不需要调整。



  • 11
    点赞
  • 22
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值