🍍原文: 基于 dwt (离散小波变换) 实现彩色图像水印嵌入部分_2.0
🍍写在前面: 本文在原文的基础上进行了代码补全。
正文
修改了尺寸变换导致的图像失真问题,同时简化了部分代码。
效果确实很好😉
1 通道调序的简化
将之前的两句代码简化为了一句代码:
Img_path = 'white_bear.jpg'
Img = cv2.imread(Img_path)
Img = Img[:, :, [2, 1, 0]] # 调整通道顺序
这里的 I m g \mathsf{Img} Img 是一个三维数组,其中每个维度分别代表:
- 第一个维度是图像的高度(或行数)
- 第二个维度是图像的宽度(或列数)
- 第三个维度是图像的通道数
由于 c v 2 \mathsf{cv2} cv2 读取图像通道的顺序是 B , G , R \mathsf{B,G,R} B,G,R,因此上述代码将其更改为 R , G , B \mathsf{R,G,B} R,G,B 顺序。
2 多级小波变换
# 水印图像一级小波变换
coeffs1 = pywt.wavedec2(waterImg_new, 'db2', level=1)
[ca, (ch1, cv1, cd1)] = coeffs1
# 原始图像B通道三级小波变换
coeffs2 = pywt.wavedec2(b, 'db2', level=3)
[cA, (cH3, cV3, cD3), (cH2, cV2, cD2), (cH1, cV1, cD1)] = coeffs2
'db2'
:是选定的小波类型。这里是 D a u b e c h i e s \mathsf{Daubechies} Daubechies 长度为 2 的整数系小波。level=3
:是小波分解的级别。级别决定了分解的深度,也就是小波变换的层数。
3 图像尺寸裁剪
由嵌入公式可以看出, c A \mathsf{cA} cA 等的形状要和 c a \mathsf{ca} ca 等的形状相同,否则无法相加:
cA = cA + ca * a1
cH3 = cH3 + ch1 * a2
cV3 = cV3 + cv1 * a3
cD3 = cD3 + cd1 * a4
而每做一次小波变换,图像的尺寸都会减小到原本的 1 / 2 1/2 1/2: