基于离散小波变换(DWT)的数字水印Matlab

基于离散小波变换(DWT)的数字水印Matlab程序实现,核心代码基于小波变换的频域操作,结合人眼视觉特性实现隐蔽且鲁棒的水印保护。

1. 水印嵌入程序
matlab 复制代码
function watermarked_img = dwt_embed(original_img, watermark, alpha)
% 输入: original_img-原始图像, watermark-二值水印矩阵, alpha-嵌入强度
% 输出: watermarked_img-含水印图像

% 转换为灰度图(若为RGB)
if size(original_img, 3) == 3
    original_img = rgb2gray(original_img);
end
original_img = im2double(original_img);

% 一级DWT分解(使用Haar小波)
[cA, cH, cV, cD] = dwt2(original_img, 'haar');

% 调整水印大小匹配中频子带尺寸
watermark = imresize(watermark, size(cH));

% 在水平高频子带(cH)嵌入水印
for i = 1:size(cH, 1)
    for j = 1:size(cH, 2)
        if watermark(i, j) == 1
            cH(i, j) = floor(cH(i, j)/alpha) * alpha + alpha/2;
        else
            cH(i, j) = floor(cH(i, j)/alpha) * alpha;
        end
    end
end

% 逆DWT重构图像
watermarked_img = idwt2(cA, cH, cV, cD, 'haar');
end
2. 水印提取程序
matlab 复制代码
function extracted_watermark = dwt_extract(watermarked_img, original_img, alpha)
% 输入: watermarked_img-含水印图像, original_img-原始图像, alpha-嵌入强度
% 输出: extracted_watermark-提取的水印

% 对含水印图像和原始图像分别DWT分解
[~, cH_w, ~, ~] = dwt2(im2double(watermarked_img), 'haar');
[~, cH_o, ~, ~] = dwt2(im2double(original_img), 'haar');

% 根据系数奇偶性提取水印
extracted_watermark = zeros(size(cH_w));
for i = 1:size(cH_w, 1)
    for j = 1:size(cH_w, 2)
        diff = mod(cH_w(i, j) - cH_o(i, j), alpha);
        if diff > alpha/2
            extracted_watermark(i, j) = 1;  % 奇性区间
        else
            extracted_watermark(i, j) = 0; % 偶性区间
        end
    end
end
end
3. 主程序示例
matlab 复制代码
% 加载图像与水印
original = imread('lena.jpg');
watermark = imbinarize(imread('logo.png')); % 二值水印

% 嵌入水印(α=0.1)
watermarked = dwt_embed(original, watermark, 0.1);

% 提取水印
extracted = dwt_extract(watermarked, original, 0.1);

% 评估性能
psnr_val = psnr(watermarked, original); % 峰值信噪比(>40dB为优)
nc = corr2(watermark, extracted);       % 归一化相关系数(>0.7有效)

% 显示结果
figure;
subplot(2,2,1); imshow(original); title('原始图像');
subplot(2,2,2); imshow(watermark); title('原始水印');
subplot(2,2,3); imshow(watermarked); title(['含水印图像 (PSNR=', num2str(psnr_val), 'dB)']);
subplot(2,2,4); imshow(extracted); title(['提取水印 (NC=', num2str(nc), ')']);

优化方向

  1. 多级分解提升鲁棒性

    二级DWT分解后嵌入低频子带(LL2),抵抗压缩攻击能力更强:

    matlab 复制代码
    % 二级分解示例
    [cA1, cH1, cV1, cD1] = dwt2(original, 'haar');
    [cA2, ~, ~, ~] = dwt2(cA1, 'haar');
    % 在cA2中嵌入水印
  2. 自适应嵌入强度

    根据局部纹理复杂度动态调整 α:平滑区域降低 α 减少可见性,边缘区域增大 α 提升鲁棒性。

  3. Arnold置乱增强安全性

    水印嵌入前进行置乱加密,防止未授权提取:

    matlab 复制代码
    % Arnold置乱(需ntimes置乱次数秘钥)
    H = [1,1;1,2]^ntimes;
    for i=1:nW
        for j=1:nW
            idx = mod(H*[i-1;j-1], nW)+1;
            Wa(idx(1),idx(2)) = W(i,j); % Wa为置乱后水印
        end
    end

资源

通过调整小波基(db4/sym4)、分解层数及嵌入强度,可平衡不可见性与鲁棒性。实际应用中建议结合DCT与LSB方法构建混合鲁棒水印系统。