基于离散小波变换(DWT)的数字水印Matlab
基于离散小波变换(DWT)的数字水印Matlab程序实现,核心代码基于小波变换的频域操作,结合人眼视觉特性实现隐蔽且鲁棒的水印保护。
1. 水印嵌入程序
function watermarked_img = dwt_embed(original_img, watermark, alpha)
% 输入: original_img-原始图像, watermark-二值水印矩阵, alpha-嵌入强度
% 输出: watermarked_img-含水印图像% 转换为灰度图(若为RGB)
if size(original_img, 3) == 3original_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) == 1cH(i, j) = floor(cH(i, j)/alpha) * alpha + alpha/2;elsecH(i, j) = floor(cH(i, j)/alpha) * alpha;endend
end% 逆DWT重构图像
watermarked_img = idwt2(cA, cH, cV, cD, 'haar');
end
2. 水印提取程序
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/2extracted_watermark(i, j) = 1; % 奇性区间elseextracted_watermark(i, j) = 0; % 偶性区间endend
end
end
3. 主程序示例
% 加载图像与水印
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), ')']);
优化方向
-
多级分解提升鲁棒性
二级DWT分解后嵌入低频子带(LL2),抵抗压缩攻击能力更强:% 二级分解示例 [cA1, cH1, cV1, cD1] = dwt2(original, 'haar'); [cA2, ~, ~, ~] = dwt2(cA1, 'haar'); % 在cA2中嵌入水印
-
自适应嵌入强度
根据局部纹理复杂度动态调整α
:平滑区域降低α
减少可见性,边缘区域增大α
提升鲁棒性。 -
Arnold置乱增强安全性
水印嵌入前进行置乱加密,防止未授权提取:% Arnold置乱(需ntimes置乱次数秘钥) H = [1,1;1,2]^ntimes; for i=1:nWfor j=1:nWidx = mod(H*[i-1;j-1], nW)+1;Wa(idx(1),idx(2)) = W(i,j); % Wa为置乱后水印end end
资源
- 代码:关于DWT数字水印的matlab程序 www.youwenfan.com/contentcse/97194.html
- 参考文献:
- [1] 杨春风等. 基于DWT的数字水印新算法. 重庆科技学院学报, 2010
- [8] DWT音频水印的量化嵌入策略. CSDN, 2025
通过调整小波基(
db4
/sym4
)、分解层数及嵌入强度,可平衡不可见性与鲁棒性。实际应用中建议结合DCT与LSB方法构建混合鲁棒水印系统。