当前位置: 首页 > news >正文

基于离散小波变换(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), ')']);

优化方向

  1. 多级分解提升鲁棒性
    二级DWT分解后嵌入低频子带(LL2),抵抗压缩攻击能力更强:

    % 二级分解示例
    [cA1, cH1, cV1, cD1] = dwt2(original, 'haar');
    [cA2, ~, ~, ~] = dwt2(cA1, 'haar');
    % 在cA2中嵌入水印
    
  2. 自适应嵌入强度
    根据局部纹理复杂度动态调整 α:平滑区域降低 α 减少可见性,边缘区域增大 α 提升鲁棒性。

  3. 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方法构建混合鲁棒水印系统。

http://www.dtcms.com/a/355820.html

相关文章:

  • @Indexed注解的作用
  • 整理3点结构点与点之间的距离
  • Paimon——官网阅读:非主键表
  • 基于pytorch的垃圾分类识别项目实战
  • Qt|QElapsedTimer 的使用详解
  • H5小游戏-超级马里奥
  • 【涂鸦T5】2. 光感bh1750
  • 效率飙升200%:Appsmith开发结合cpolar远程访问实战解析
  • 前端面试题2(vue)
  • 高并发内存池(14)- PageCache回收内存
  • Go 语言常用命令使用与总结
  • 【Agent】AutoAgent: A Fully-Automated and Zero-Code Framework for LLM Agents
  • 从零开始:手写数字识别程序的深度学习实践
  • 《实际项目》空调水系统群控方案
  • TensorFlow 深度学习 | 三种创建模型的 API
  • Promptalot-Midjourney提示词分享平台
  • Java爬虫是什么,如何获取API接口
  • 嵌入式开发学习———Qt软件环境下的C++学习(七)
  • Nginx中`location`路径匹配规则
  • 20250828_学习JumpServer开源堡垒机使用:统一访问入口 + 安全管控 + 操作审计
  • AI翻唱-RVC在线使用-AutoDL
  • 现代数据架构中的核心技术组件解析
  • RPM Spec 文件中 `Provides` 与 `%py_provides` 实现原理及应用场景解析
  • AP化学课程知识点解析学习计划及培训机构推荐
  • 解决pycharm中已经设置python解释器但是terminal中没有变成对应的conda环境
  • 步进电机、直流电机常见问题
  • ASCM-专有云公共云
  • C#写的一键自动测灯带的应用 AI帮写的。
  • 梯度下降,梯度消失,梯度爆炸
  • hintcon2025 Verilog OJ