本文主要是介绍数字水印 | 基于小波变换的数字水印技术,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
🍍原文: 基于小波变换的数字水印技术
🍍写在前面: 本文属搬运博客,自己留存学习。
正文
小波变换 把一个信号分解成由基本小波经过移位和缩放后的一系列小波,它是一种 “时间——尺度” 信号的多分辨率分析方法,在时域和频域都具有表征信号局部特征的能力。
小波图像处理 把图像进行多分辨率分解,得到不同空间、频率的子图像,然后对图像的小波系数进行处理。一般而言, 小波变换在信号的高频部分可以获得比较好的时间分辨率,而在信号的低频部分可以获得比较好的频率分辨率,这样就能够有针对性地从信号中提取所需的目标信息。
小波数字水印技术 首先对图像进行小波变换,并对水印信息进行预处理,然后将处理后的水印通过一定的算法嵌入到选定的小波系数中,最后对含有水印的小波系数进行小波逆变换得到含有水印的数字图像。检验和提取的过程正好是以上过程的逆变换。
1 载体图像的小波变换
数字图像经过小波分解后被分割成 4 4 4 个频带:
- 水平方向 ( L H ) \mathsf{(LH)} (LH):表征了图像在水平方向的边缘细节信息;
- 垂直方向 ( H L ) \mathsf{(HL)} (HL):表征了图像在垂直方向的边缘细节信息;
- 对角线方向 ( H H ) \mathsf{(HH)} (HH):表征了图像在对角线方向的边缘细节信息;
- 低频部分 ( L L ) \mathsf{(LL)} (LL)
其中低频部分 ( L L ) \mathsf{(LL)} (LL) 可以继续分解,如图下所示:
说明:1 代表是一级分解得到的,2 代表是二级分解得到的。所谓的二级分解,貌似就是对低频 ( L L ) \mathsf{(LL)} (LL) 子带再次进行了一次小波分解。
图像的能量主要集中于低频 ( L L ) \mathsf{(LL)} (LL) 部分,因此低频 ( L L ) \mathsf{(LL)} (LL) 子带是原始图像的逼近子图,具有较强的抵抗外来影响的能力,稳定性较好。其他三个子带分别表征了,原始图像在水平 ( L H ) \mathsf{(LH)} (LH)、垂直 ( H L ) \mathsf{(HL)} (HL) 和对角线 ( H H ) \mathsf{(HH)} (HH) 部分的边缘细节信息,容易受外来噪声、图像操作等的影响,稳定性较差。
GPT 说:图像的能量通常是指图像中像素值的平方和。在某些应用中,能量可以被理解为图像的粗糙度或者复杂度。
一级分解:
二级分解:
Python 显示灰度图的效果貌似和 Matlab 的效果不一样,白熊的小脸雀黑😇
2 水印图像的预处理
为了保证水印的安全性,在嵌入水印前需要对水印进行加密处理。
置乱预处理 是一种简单常用的加密方法,水印图像置乱可以消除像素间的相关性,从而提高水印的鲁棒性。图像置乱算法有很多,如幻方置乱、Hilbert 置乱、随机数置乱,本文采用 A r n o l d \mathsf{Arnold} Arnold 置乱算法,将有意义的水印内容掩盖。
下述内容参考博客:图像加密笔记之 Arnold 变换及 Matlab 代码实现
A r n o l d \mathsf{Arnold} Arnold 置乱,又称阿诺德置乱或猫脸变换 C a t M a p \mathsf{Cat\ Map} Cat Map,因为提出这种算法的数学家拉基米尔·阿诺德最早将其应用于一张猫的图片上。所谓置乱,就是打乱图片上各个像素点的位置,以消除原图片相邻像素间的相关性。这个算法的实现并不复杂:
[ x n + 1 y n + 1 ] = [ 1 b a a b + 1 ] [ x n y n ] m o d ( N ) \begin{bmatrix} x_{n+1} \\ y_{n+1} \end{bmatrix}= \begin{bmatrix} 1 & b\\ a & ab+1 \end{bmatrix} \begin{bmatrix} x_{n} \\ y_{n} \end{bmatrix} mod(N) [xn+1yn+1]=[1abab+1][xnyn]mod(N)
( x n , y n ) (x_n, y_n) (xn,yn) 表示像素的原始位置, ( x n + 1 , y n + 1 ) (x_{n+1}, y_{n+1}) (xn+1,yn+1) 表示像素置乱后的位置。 a a a 和 b b b 是扰乱 s c r a m b l i n g \mathsf{scrambling} scrambling 参数,可以自己进行指定。 m o d ( N ) mod(N) mod(N) 是指对 N N N 取余, N N N 为图像的长或宽。对于简单的情况,即长宽相同的图像,长和宽都等于 N N N。取余应该是为了让置乱后的像素位置限定在原始图像的长和宽 N N N 以内。
个人理解:就是要求置乱后的位置不能超出原始图像的范围。
该算法的逆变换,即将置乱后的图像恢复到原始图像的算法为:
[ x n y n ] = [ a b + 1 − b − a 1 ] [ x n + 1 y n + 1 ] m o d ( N ) \begin{bmatrix} x_{n} \\ y_{n} \end{bmatrix}= \begin{bmatrix} ab+1 & -b\\ -a & 1 \end{bmatrix} \begin{bmatrix} x_{n+1} \\ y_{n+1} \end{bmatrix} mod(N) [xnyn]=[ab+1−a−b1][xn+1yn+1]mod(N)
下面是一个图像使用 A r n o l d \mathsf{Arnold} Arnold 变换 ( a = 2 , b = 3 ) \mathsf{(a=2,b=3)} (a=2,b=3) 后的置乱效果:
对置乱效果进行还原:
经典的 A r n o l d \mathsf{Arnold} Arnold 变换具有许多局限性。比如说只能对长宽相等的图像进行处理,一般可以通过对图像进行分块填充等克服这个问题。除此之外,还有一些其他缺点,比如它必须通过多次置乱来达到一个较好的效果,且变换具有周期性,密钥空间不足等问题。
3 小波数字水印的嵌入
✒️ 将水印信息嵌入到小波系数上
根据人类视觉系统的照明和纹理掩蔽特性,将水印嵌入到图像的纹理和边缘上不易被觉察,但对图像的滤波操作和有损压缩操作容易丢失信息。小波变换的低频 ( L L ) \mathsf{(LL)} (LL) 部分集中了图像的大部分能量,它是视觉上最重要的部分,在这部分嵌入水印容易引起图像失真。但从鲁棒性出发,水印应当嵌入到视觉最重要的区域。
原文:图像的纹理和边缘是指, H H , H L , L H \mathsf{HH,HL,LH} HH,HL,LH 细节子图中的一些有较大值的小波系数。
水印的嵌入:
4 小波数字水印的提取
本节参考博客:离散小波变换含数字水印嵌入的图像水印提取
小波数字水印的原理总结如下:
- 嵌入水印:首先,选择一个合适的小波函数作为基函数,并对原始图像进行小波变换,得到图像的低频和高频分量。然后,将水印信息嵌入到选定的高频分量中。嵌入过程可以通过修改高频系数的幅值或相位来实现。常用的嵌入方法有替换法、加减法和乘除法等。
- 提取水印:首先,对带有水印的图像进行小波变换,得到图像的低频和高频分量。然后,根据预先设定的提取算法,从高频分量中提取出水印信息。提取算法通常与嵌入算法相对应,可以通过比较高频系数的差异或解码隐藏在高频系数中的信息来实现。
水印的提取:
这效果真是一言难尽啊😇
这篇关于数字水印 | 基于小波变换的数字水印技术的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!