[隐写术] J_UNIWARD介绍

UNIWARD是Vojtˇech Holub和Jessica Fridrich提出的一种通用失真设计方案,适用空域和JPEG域,分别用S-UNIWARD,J-UNIWARD和SI-UNIWARD表示不同域。

本文对J-UNIWARD进行介绍,首先介绍方向滤波器组,然后解释失真函数的设计思想,最后介绍UNIWARD的加性近似过程。

此外,因水平有限,部分术语暂未翻译,只用了原文中的术语,见谅。

1. 参考论文

TitleAuthors
Universal distortion function for steganography in an arbitrary domainVojtˇech Holub, Jessica Fridrich and Tomáš Denemark
Digital Image Steganography Using Universal DistortionVojtˇech Holub and Jessica Fridrich

1.1. 摘要

近几年来,最成功的隐写术是在嵌入秘密数据的同时最小化一个适合定义的失真函数。而由于一些高效实用的编码存在(能够达到逼近率失真边界的嵌入效果),对于从事隐写术的科研工作者来说,本质上唯一剩下的任务就是设计失真函数。

这篇paper中提出了一种通用失真设计方案,UNIWARD(UNIversal WAvelet Relative Distortion,通用小波相对失真)。UNIWARD可以适用任何域,如空域,JPEG域还有基于边信息的JPEG域。

最近的隐写分析技术,如RM(Rich Model,富模型)可以通过使用局部多项式模型来很好地拟合clean edges上的改变,因而可以有效检测出clean edges上的改变。因此嵌入算法需要能够将数据嵌入在纹理或噪声区域,这些区域从任何方向上都不容易被建模,因此难以被检测。

UNIWARD的嵌入失真是载体图像的方向滤波器组分解中的系数的相对变化总和。这种方向性使得嵌入变化区域多集中在那些难以建模在多个方向的区域,如纹理和噪声区域,而避免了光滑区域或者clean edges被修改。

1. 2. 符号解释

NotationExpalanation
X \pmb{X} XXXcover的量化后DCT系数矩阵
Y \pmb{Y} YYYstego的量化后DCT系数矩阵
X i j X_{ij} Xijcover中第 i i i行第 j j j列的量化后DCT系数值
Y i j Y_{ij} Yijstego中第 i i i行第 j j j列的量化后DCT系数值
n 1 n_1 n1行数
n 2 n_2 n2列数

2. 方向滤波器组(Directional filter bank)

方向滤波器组包括三个线性平移不变滤波器,他们的核用 B = { K ( 1 ) , K ( 2 ) , K ( 3 ) } \pmb{B}=\{\pmb{K}^{(1)},\pmb{K}^{(2)},\pmb{K}^{(3)}\} BBB={KKK(1),KKK(2),KKK(3)}表示。

这三个滤波器通过计算方向残差 W ( k ) = K ( k ) ⋆ X \pmb{W}^{(k)}=\pmb{K}^{(k)}\star \pmb{X} WWW(k)=KKK(k)XXX来分别从水平、垂直和对角线方向来评估给定图像 X \pmb{X} XXX的光滑程度,其中 ′ ⋆ ′ '\star' 表示镜像填充(mirror-padded)卷积操作使得方向残差 W ( k ) \pmb{W}^{(k)} WWW(k)的尺寸与cover的量化后DCT系数矩阵尺寸一致,都是 n 1 × n 2 n_1\times n_2 n1×n2镜像填充的作用是防止在边界处引入embedding artifacts。

滤波器组的选择是任意的,而在这里作者根据比对各种滤波器组之后,最终选择了从一维低通(和高通)小波分解滤波器来构建滤波器组的核:

K 1 = h ⋅ g T , K 2 = g ⋅ h T , K 3 = g ⋅ g T . \pmb{K}^{1}=\pmb{h}\cdot\pmb{g}^T,\pmb{K}^{2}=\pmb{g}\cdot\pmb{h}^T,\pmb{K}^{3}=\pmb{g}\cdot\pmb{g}^T. KKK1=hhhgggT,KKK2=ggghhhT,KKK3=ggggggT.

这种情况下的滤波器分别对应于二维的LH,HL和HH小波方向高通滤波器,并且残差与 X \pmb{X} XXX的第一级未抽取小波LH,HL和HH方向分解一致。滤波器只限于小波滤波器组,是因为小波表示是已知的能够为自然场景提供良好的去相关性(decorrelation)和能量紧凑化(energy compactification)

3. 失真函数(Distortion function)

对于JPEG图像来说,计算cover和stego之间的失真,首先要将JPEG文件解压到空域,即此时的 X \pmb{X} XXX Y \pmb{Y} YYY是对应的空域像素矩阵,而非DCT系数矩阵,失真可表示如下:

D ( X , Y ) = ∑ k = 1 3 ∑ u , v ∣ W u v k ( X ) − W u v k ( Y ) ∣ ϵ + ∣ W u v k ( X ) ∣ \mathrm{D}(\pmb{X,Y})=\sum_{k=1}^3 \sum_{u,v} \frac{|W_{uv}^{k}(X)-W_{uv}^{k}(Y)|}{\epsilon+|W_{uv}^{k}(X)|} D(X,YX,YX,Y)=k=13u,vϵ+Wuvk(X)Wuvk(X)Wuvk(Y)

其中 ϵ \epsilon ϵ是一个正数标量,用于避免分母为0。从上式看出,分母越大,最终失真也就越小。也就是在cover矩阵中,更大的小波系数发生修改造成更小的失真,而这一般是发生在纹理/噪声区域以及图像边缘部分。而另一方面,如果至少一个小的小波系数发生了较大改变,都会造成很大的失真。因此,在至少一个方向上,上式的设计不鼓励嵌入修改发生在内容相对平滑(平滑也更容易被建模)的区域。

4. UNIWARD的加性近似(Addictive approximation of UNIWARD)

4.1 为什么要使用加性近似?

在JPEG域中,当修改一个JPEG系数时,会同时影响一整个 8 × 8 8\times8 8×8的像素块,因此有 23 × 23 23\times 23 23×23大小的小波系数也会受到影响。因此当修改多个邻近的像素或者DCT系数时,造成的嵌入修改发生重叠,相互作用。因此失真 D \mathrm{D} D非加性的。

虽然存在一些使用非加性失真函数的嵌入方法,如Gibbs构造,但使用加性失真更容易进行嵌入。并且在UNIWARD中,相邻的嵌入修改造成的影响过于明显使得Gibbs构造的嵌入效果差强人意。UNIWARD不采用Gibbs构造的进一步解释可参考论文,这里不作过多赘述。

使用加性近似的显著优点是在全局设计上的便利性。因为嵌入过程可以直接通过使用隐写术中的一个标准工具 - STC码来实现。

4.2 如何定义加性近似?

任何失真函数 D ( X , Y ) \mathrm{D}(\pmb{X,Y}) D(X,YX,YX,Y)都可以用来嵌入到加性近似中,通过使用D来计算修改每个像素值或DCT系数 X i , j X_{i,j} Xi,j的成本 ρ i j \rho_{ij} ρij

X i , j X_{i,j} Xi,j修改成 Y i , j Y_{i,j} Yi,j并保持其他系数值不变的代价定义如下:

ρ ( X , Y i j ) = D ( X , X ∼ i j Y i j ) \rho(\pmb{X},Y_{ij})=D(\pmb{X},\pmb{X}_{\sim ij}Y_{ij}) ρ(XXX,Yij)=D(XXX,XXXijYij)

其中 X ∼ i j Y i j \pmb{X}_{\sim ij}Y_{ij} XXXijYij是只有第 i j ij ij个元素发生改变的 X \pmb{X} XXX。当 X = Y \pmb{X}=\pmb{Y} XXX=YYY时, ρ = 0 \rho=0 ρ=0

D A ( X , Y ) D_A(\pmb{X,Y}) DA(X,YX,YX,Y)来表示加性近似:

D A ( X , Y ) = ∑ i = 1 n 1 ∑ j = 1 n 2 ρ i j ( X , Y i j ) [ X i j ≠ Y i j ] D_A(\pmb{X,Y} )=\sum_{i=1}^{n_1} \sum_{j=1}^{n_2} \rho_{ij} (\pmb{X}, Y_{ij} ) [X_{ij}\neq Y_{ij}] DA(X,YX,YX,Y)=i=1n1j=1n2ρij(XXX,Yij)[Xij̸=Yij]

其中 [ S ] [S] [S]用来表示艾弗森括号,当括号中的状态S为真时,等于1,否则为0。

由于失真函数 D ( X , Y ) \mathrm{D}(\pmb{X,Y}) D(X,YX,YX,Y)中的绝对值存在,表明

ρ i j ( X , X i j − 1 ) = ρ i j ( X , X i j + 1 ) \rho_{ij}(\pmb{X},X_{ij}-1)=\rho_{ij}(\pmb{X},X_{ij}+1) ρij(XXX,Xij1)=ρij(XXX,Xij+1)

这就使得UNIWARD可以使用三元嵌入操作,进一步提高嵌入效率。具体的嵌入算法构造可以使用STC码的三元多层版本。

Python3 中有多种实现图片隐写术的库,其中常用的有 stegano 和 pillow 等。 以下是使用 pillow 库实现图片隐写术的示例代码: ```python from PIL import Image def encode_image(image_path, message): # 打开图片并将其转换为 RGB 模式 img = Image.open(image_path).convert('RGB') pixels = img.load() # 获取图片的宽和高 width, height = img.size # 将待隐藏信息的二进制形式转换为字符串 binary_message = ''.join([format(ord(i), "08b") for i in message]) # 检查隐写信息的长度是否超过了图片的容量 if len(binary_message) > width * height: raise ValueError("待隐藏信息过长") # 开始隐写 index = 0 for row in range(height): for col in range(width): # 将每个像素的 RGB 值转换为二进制形式 r, g, b = pixels[col, row] binary_r = format(r, "08b") binary_g = format(g, "08b") binary_b = format(b, "08b") # 如果还有待隐藏的信息,则将其写入像素的最低有效位中 if index < len(binary_message): pixels[col, row] = ( int(binary_r[:-1] + binary_message[index], 2), int(binary_g[:-1] + binary_message[index+1], 2), int(binary_b[:-1] + binary_message[index+2], 2) ) index += 3 # 保存隐写后的图片 img.save("encoded_image.png") def decode_image(image_path): # 打开图片并将其转换为 RGB 模式 img = Image.open(image_path).convert('RGB') pixels = img.load() # 获取图片的宽和高 width, height = img.size # 从图片中读取隐写信息 message = "" for row in range(height): for col in range(width): r, g, b = pixels[col, row] binary_r = format(r, "08b") binary_g = format(g, "08b") binary_b = format(b, "08b") message += binary_r[-1] + binary_g[-1] + binary_b[-1] # 将二进制信息转换为字符串 decoded_message = "" for i in range(0, len(message), 8): decoded_message += chr(int(message[i:i+8], 2)) return decoded_message ``` 使用示例: ```python # 隐写信息到图片中 encode_image("test.png", "Hello World!") # 从图片中读取隐写信息 message = decode_image("encoded_image.png") print(message) # 输出 "Hello World!" ``` 注意:图片隐写术是一种敏感的技术,不应用于违法活动或侵犯他人隐私的行为。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值