# 一、经典数字图像水印算法
## 1.LSB 算法
LSB(Least Significant Bits)算法,全称为最低有效位算法,是利用载体对象的二进制的最低一位(或几位)来进行秘密信息的隐藏。LSB 算法是隐写术中最常见的算法,多用于图像和声音载体之中[9]。
**LSB 算法的可行性说明**
- 图像/音频对象均可数字化为{}序列;
- 每一个对象均由若干二进制位组成;
- 每一个对象的二进制低位在某种意义上“不重要”。
对于具体图像来说:
- 去掉最低 1 位甚至最低 1-4 位对图像的整体视觉效果没有太大影响;
- 去掉最低 1 位对图像的统计特性影响不明显。
**LSB 算法嵌入基本步骤**
- 将要隐藏的水印文本信息的转换为二进制数据;
- 读入载体图像,将图像矩阵的每个像素转换成二进制。用水印信息的二进制数据的每一比特位替换与之相对应的载体图像的最低有效位(LSB 位);
- 将载体图像的每一像素再由二进制转换为十进制,从而获得含有水印信息的图像。
![](https://www.writebug.com/myres/static/uploads/2021/11/20/ce95dd96b8456e7c5b0e149e77b12ef3.writebug)
```
图 3.1 LSB 算法嵌入图解
```
**LSB 算法提取基本步骤**
① 将嵌入水印信息的载体图像的像素转换成二进制,依次取出每一个像素的二进制的最后一位,拼接成二进制数据。
③ 将得到的二进制数据转换成文本数据,便可得到隐藏的信息。
![](https://www.writebug.com/myres/static/uploads/2021/11/20/2c8b5ce57720b0a59864626668a66ab5.writebug)
图 3.2 LSB 算法提取图解
## 2.DCT 算法
DCT 算法(Discrete Cosine Transform),即离散余弦变换算法,它与离散傅里叶变换类似,但是只使用实数。DCT 算法于 1974 年被提出,被认为是对语音和图像信号进行变换的最佳方法。DCT 算法目前在图像编码中占有极其重要的地位,是 H.261、JPEG、MPEG、H.264 等国际上公用的编码标准的重要基础。在视频压缩中,最常用的变换方法就是 DCT 算法。
在自然界中,大多数信号的能量都集中在余弦变换后的低频部分。并且人眼对于细节信息并不敏感,含有多数能量的低频部分几乎可以代表整幅图像,使用
DCT 算法进行信息隐藏就是在这个特点之上进行的。
**DCT 变换的原理**
数字图像 S 是具有 M 行 N 列的一个矩阵。为了减弱或去除图像数据相关性,可以运用二维 DCT,将图像从空间域转换到 DCT 变换域。
① 一维 DCT 变换离散余弦变换
![](https://www.writebug.com/myres/static/uploads/2021/11/20/918509b291c482da32b27bba518eddf4.writebug)
逆变换
![](https://www.writebug.com/myres/static/uploads/2021/11/20/6319721e9d37f3960fd1ba461d80e0b3.writebug)
其中
![](https://www.writebug.com/myres/static/uploads/2021/11/20/1a01668c11e8910cc2f2f134afad7d27.writebug)
**二维 DCT 变换**
![](https://www.writebug.com/myres/static/uploads/2021/11/20/6aae2fb134240851d1d5f59eeeed852c.writebug)
```
2 2 二维 DCT 逆变换
```
![](https://www.writebug.com/myres/static/uploads/2021/11/20/38201377cb73c8efb71e855f557a74b4.writebug)
```
2 2 对于二维图像来说,s 表示空域(灰度)值,S 表示频率系数。
```
**DCT 变换的特点**
在基于 DCT 的变换编码中,图像是先经分块(8×8 或 16×16)后再经过 DCT 变换,这种变换是局部的,只反映了图像某一部分的信息。当然也可以对整幅图像进行 DCT 变换,但是运算速度比分块 DCT 要慢。
图像经 DCT 后,得到的 DCT 图像有三个特点:
- 系数值全部集中在 0 值附近,动态范围很小;
- DCT 变换后图像能量集中在图像的低频部分,即 DCT 图像中不为零的系数大部分集中在一起;
- 没有保留原图像块的精细结构,从中反映不了原图像块的边缘、轮廓等信息。
**DCT 信息嵌入算法**
DCT 信息嵌入算法是以 DCT 变换为基础,对图像经过 DCT 变换后的 DCT 系数进行适当改变,以达到隐藏秘密信息的目的。将载体图像分成 8×8 的像素块,每一块只精确地编码(隐藏)一个秘密信息位。在每一块中,根据每一个图像块的两个 DCT 系数的相对大小来标明所隐藏的信息位。
生物学研究表明,人眼对图像平滑区域的变换比较敏感,而对纹理区域的变换不太敏感。经过离散余弦变换之后,图像信息集中在少数低频系数上,而纹理和边缘信息则在中高频系数中,所以低频系数的改变对图像视觉上的影响远大于高频系数。因此,在 DCT 信息嵌入的时候我们也是选择中频系数来隐藏信息,在 8×8 的像素块中,我们选择(4,1)和(3,2)这两个位置的中频系数来隐藏信息。当然,这只是其中一种选择,选择(4,2)和(2,4)等也是可以的。
嵌入过程开始时,首先随机地选择一个图像块,它经二维 DCT 变换后得到,用它对第 i 个消息比特进行编码。发送者和接收者必须事先约定嵌入过程中使用的两个 DCT 系数的位置,为了达到隐藏的健壮性和不可察觉性,应该在 DCT 的中频系数中选取,比如用(1, 1)和(2, 2)代表所选定的两个系数的坐标。嵌入过程为:
- 如果(1, 1)> (2, 2),就代表隐藏信息“1”;
- 如果(1, 1)< (2, 2),就代表“0”。
如果需要隐藏的信息位为“1”,但是(1, 1)< (2, 2),那么就把两个系数相互交换。最后发送者做二维逆 DCT 变换,将图像变回空间域,进行传输。
![](https://www.writebug.com/myres/static/uploads/2021/11/20/3b6009e3569f60260db4b0f4f9ebd9ad.writebug)
图 3.3 DCT 信息嵌入示意图
![](https://www.writebug.com/myres/static/uploads/2021/11/20/6d18fa6eb5e6155af58129b516a1ecb2.writebug)
图 3.4 DCT 数字水印嵌入算法流程
**DCT 信息提取算法**
DCT 信息提取是 DCT 信息嵌入的逆变换,将图像进行 DCT 变换后,从 DCT 系数中按照嵌入时的规则提取出隐藏信息。
- 如果(1, 1)> (2, 2),代表本信息块隐藏的信息为“1”; 如果(1, 1)< (2, 2),代表本信息块隐藏的信息为“0”。
将提取的信息拼接起来得到的就是隐藏的水印信息
![](https://www.writebug.com/myres/static/uploads/2021/11/20/d2c47b9d3d40f78452a4a864889c9219.writebug)
图 3.5 DCT 数字水印提取算法流程
## 二、经典数字图像水印算法的改进
## 2.1 随机间隔算法
随机间隔算法是 LSB 算法的改进,发送者和接受者使用同一个密钥作为随机数生成器的种子,生成随机序列 k1,k2,…,kl(m),并进一步以此生成隐藏位置的指标集。
**随机间隔法嵌入水印**
随机间隔法嵌入水印的过程与 LSB 基本算法嵌入水印的过程基本相似,可以参见图 3.1,只是不再按顺序依次在载体图像的每一位像素中嵌入了,而是根据随机序列和步长来跳跃一段间隔,这也是为什么叫做随机间隔算法的原因。
水印信息
![](https://www.writebug.com/myres/static/uploads/2021/11/20/274ff71acbf0f64ee8c3e4202c6a1946.writebug)
随机间隔法嵌入信息示意图
**伪代码示意为:**
使用种子生成随机序列 ki
n←k1
for i=1…,l(m) do
si←mi
n← n+ki+1
end for
**随机间隔法提取水印**
随机间隔算法提取水印是随机间隔法嵌入水印的逆操作,提取信息时使用与嵌入时相同的随机数序列,即可跳跃到相同的位置提取出隐藏信息。
伪代码示意为:使用种子生成随机序列 ki n←k1
for i=1…,l(m) do mi ← LSB(sn) n← n+ki+1
end for
**随机间隔法性能分析**
- 优点
随机确定水印信息比特嵌入的位置,提高了安全性,使水印位置不容易被定位。
因为有随机间隔步�