目录

基于频域的图片数字水印实现与原理

基于频域的图片数字水印实现与原理

一、什么是数字水印

数字水印是指在图像、音频等载体中嵌入不可见的信息来实现防伪等功能。评价数字水印有三个维度(以图像为例):

  1. 不可见性:肉眼无法分辨出图像嵌入了信息
  2. 鲁棒性:压缩、旋转、裁剪甚至截屏、录屏后依然能提取信息
  3. 安全性:不容易被破解

二、什么叫频域

频域相对于空间域。对空间域的处理就是直接改像素,而频域是将图片从空间域通过一个变换方法变换到一个新的域,即频域,在这个频域处理信息,然后可以将频域变换回空间域,从而实现在图片中嵌入内容。常用的变换方法有DCT、DFT等。

与音频类似,有了频域变换,我们也可以针对图片等“频率”进行分析,比如分成低频、中频、高频三部分。

一张图片,本质上可以看成不同变化速度的叠加。如果变化很慢,就是低频信息,比如大块的相同或近似颜色;如果变化很快,就是高频信息,比如线条边缘、噪声;如果变化适中,就是中频信息。例如一张天空的图片,蓝色的天空几乎没有变化,就是低频;一片片云朵有一定变化,是中频;云朵边缘的锐利轮廓变化很剧烈,就是高频。可以尝试将图片变换到频域后只保留低频再逆变换回去,会发现图片变模糊;如果只保留高频,图片会只剩下边缘。

三、DCT水印

flowchart LR A[原始图像] --> B[分块处理<br/>8×8 Blocks] B --> C[DCT 变换<br/>进入频域] C --> D[选择中频区域<br/>避免低频/高频] D --> E[系数修改<br/>嵌入 0/1] E --> F[IDCT 逆变换<br/>回到空间域] F --> G[输出水印图像]

1.为什么选择中频?

因为如果将水印内容放在低频,逆变换后会很明显,不符合不可见性的要求。如果放在高频,那么很容易被压缩算法给破坏,不符合鲁棒性的要求。中频是一个折中点。

例如JPEG压缩,本质就是保留低频,丢弃人眼不敏感的高频,从而在视觉几乎无法区分的情况下大大减小图片的体积。其实音频压缩算法也是类似的。

2.如何把信息写入中频?

这里就是核心了,可以做得简单也可以做得复杂。这里的算法也会直接影响水印实现的不可见性、鲁棒性和安全性。例如,一个很简单的做法是:

if watermark_bit == 1:
    DCT[u][v] += k
else:
    DCT[u][v] -= k

提取水印时,就是把上面写入水印的方式反过来,不再赘述。