实验要求

每位同学任意选取彩色载体图像矩阵A(MN3),W(mn3)作为待嵌入水印的彩色图像矩阵,M>m,N>n,选择合适的水印强度参数a,通过SVD将W(mn3)嵌入到A(MN3)中,交给其他同学必须的数据进行水印的验证。

实验分析

  • 数字水印技术
    数字水印技术是一种基于内容的、非密码机制的计算机信息隐藏技术。它可以将一些标识信息直接嵌入数字载体当中,且不影响原载体的使用价值,也不容易被探知和再次修改,从而实现保护版权、信息隐藏的功能。

  • 奇异值分解(SVD)
    奇异值分解(Singular Value Decomposition,SVD)是线性代数中一种重要的矩阵分解方法,适用于任意形状的矩阵(包括非方阵)。其核心思想是将一个复杂的矩阵分解为三个简单矩阵的乘积形式,分别描述矩阵的旋转、缩放和旋转操作。

实验过程

(1)水印嵌入

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
%% 水印嵌入主程序 
% 读取图像并调整尺寸
A = imread('航天员.png'); % 载体图像 MxNx3
W_orig = imread('水印.png'); % 原始水印 mxnx3

% 自动调整水印尺寸(保证M>m且N>n)
max_ratio = 0.5; % 水印最大尺寸比例(建议0.3-0.5)
[m_orig, n_orig, ~] = size(W_orig);
[M, N, ~] = size(A);

% 计算缩放因子
scale = min(max_ratio*M/m_orig, max_ratio*N/n_orig);
W = imresize(W_orig, scale);
[m, n, ~] = size(W);
assert(m < M && n < N, '水印缩放后尺寸仍需小于载体');

% 参数设置
a = 0.06; % 强度参数(0.05-0.15)
A_double = im2double(A);
W_double = im2double(W);

% 初始化存储矩阵
U_A = cell(3,1); V_A = cell(3,1); S_W = cell(3,1);
A_watermarked = zeros(size(A_double));

%% 分通道处理
for channel = 1:3
% 载体图像SVD分解
[U_A{channel}, S_A, V_A{channel}] = svd(A_double(:,:,channel));

% 水印图像SVD分解
[~, S_W{channel}, ~] = svd(W_double(:,:,channel));

% 动态调整奇异值矩阵尺寸
min_rows = min(size(S_A,1), size(S_W{channel},1));
min_cols = min(size(S_A,2), size(S_W{channel},2));
S_A(1:min_rows,1:min_cols) = S_A(1:min_rows,1:min_cols) + a * S_W{channel}(1:min_rows,1:min_cols);

% 重构含水印通道
A_watermarked(:,:,channel) = U_A{channel} * S_A * V_A{channel}';
end

%% 保存结果与验证数据
imwrite(A_watermarked, 'watermarked_image.jpg');
save('validation_data.mat', 'U_A', 'V_A', 'S_W', 'a', 'm', 'n', '-v7.3');


(2)水印提取
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
%%水印提取主程序   
load('validation_data.mat');
A_loaded = im2double(imread('watermarked_image.jpg'));
W_extracted = zeros(m, n, 3);

for channel = 1:3
% 含水印图像分解
[~, S_emb, ~] = svd(A_loaded(:,:,channel));

% 提取水印奇异值
S_W_extracted = (S_emb(1:size(S_W{channel},1), 1:size(S_W{channel},2)) - ...
S_W{channel}) / a;

% 重构水印(使用原始水印的U和V)
[U_W, ~, V_W] = svd(W_double(:,:,channel));
W_extracted(:,:,channel) = U_W(:,1:size(S_W_extracted,1)) * S_W_extracted * V_W(:,1:size(S_W_extracted,2))';
end

% 显示提取结果
figure;
subplot(1,2,1); imshow(W_double); title('原始水印');
subplot(1,2,2); imshow(W_extracted); title('提取水印');

实验结果

实验总结

通过本次实验了解了基于SVD的水印嵌入和提取技术,体验了该技术存在的优点及不足。