跳转至

第 6 章:实用的脏纸编码方法

实用性考虑

  • 编码代价要低:对载体的歪曲较少;效率要高
  • 解码标准要好:可以良好应对各种修改,比如加亮度;效率要高

  • 编码隔离:不同信息对应的编码要足够远。

  • 陪集(coset)形成:编码的构成要科学,有助于提高编码速度和编码量

简单的格点编码

\(N\) 个彼此正交的向量 \(\mathbf{w}_{r1}, \dots, \mathbf{w}_{rN}\) 过来,构造一个 \(N\) 维空间,一个格点 \(\mathbf{p} = \sum_{i} k_i \mathbf{w}_{ri}, k_i \in \mathbb{Z}\)

如果把基向量长度翻倍,\(2 \mathbf{w}_{r1}, \dots, 2 \mathbf{w}_{rN}\),然后定义一个平移向量 \((b_1, \dots, b_n), b_i \in \{0, 1\}\),把这个平移向量作为信息就能把格点表示为:\(\sum_{i} (b_i + 2k_i) \mathrm{w}_{ri}\)

这样的话,信息种类就有 \(2^N\) 种。

\(m = (b_1, \dots, b_N)\) 打进载体 \(\mathbf{v}\) 里面:

映射到每个维度上:\(p[i] = \mathbf{v} \cdot \mathbf{w}_{ri}\)(不一定是整数)

移到最近的格点:\(q[i] = 2 \lfloor \frac{p[i] - b_i + 1}{2} \rfloor + b_i\)

把水印打进去:\(\mathbf{v}_m = \mathbf{v} + \sum_i (q[i] - p[i]) \mathbf{w}_{ri}\)

\(\mathbf{v}\) 里面提取水印:

映射到每个维度上:\(p[i] = \mathbf{v} \cdot \mathbf{w}_{ri}\)

找到最近的格点:\(q[i] = \lfloor p[i] + 0.5 \rfloor\)

得到水印:\(m = (q[1] \bmod 2, \dots, q[N] \bmod 2)\)