58_二维离散小波变换matlab代码,图像的离散小波变换 基于matlab2018a及以上版本实现
二维离散小波变换(DWT)在图像处理中就像把照片拆成不同精度的副本,今天手把手教你在MATLAB里实现这个操作。跑出来的效果应该能看到类似这样的结构:近似系数保留主体轮廓,三个细节系数分别对应横向、纵向和对角线方向的边缘信息。是关键,返回的c是系数向量,s记录各层结构。图像的离散小波变换是把其分解为近似系数、水平细节系数、垂直细节系数以及对角细节系数。再次分解时是对这一次分解的近似系数进行分解,其
58_二维离散小波变换matlab代码,图像的离散小波变换 基于matlab2018a及以上版本实现。 其他版本不保证运行。 图像的离散小波变换是把其分解为近似系数、水平细节系数、垂直细节系数以及对角细节系数。 再次分解时是对这一次分解的近似系数进行分解,其他系数不处理。 主要输入参数有:分解层数,小波类型rgb值,展示参数。 并绘图显示近似系数和各个细节系数。 仍以lena图像为例,展示分解后图像。 附带一份数据,可以查看数据格式来调整你的数据最后使用代码运行。
咱们直接上硬货。二维离散小波变换(DWT)在图像处理中就像把照片拆成不同精度的副本,今天手把手教你在MATLAB里实现这个操作。准备好你的MATLAB 2018a,老版本可能扑街。

先看核心代码骨架:
img = imread('lena.jpg');
img = im2double(rgb2gray(img)); % 转灰度图
level = 3; % 分解3层
wname = 'db1'; % 小波基
[c,s] = wavedec2(img, level, wname);
这段代码里wavedec2是关键,返回的c是系数向量,s记录各层结构。有个坑要注意:彩色图需要分通道处理,咱们这里用灰度图演示更直观。
分解后的系数提取要按层级来:
A3 = appcoef2(c, s, wname, 3); % 第3层近似系数
[H3,V3,D3] = detcoef2('all',c,s,3); % 第3层细节系数
A2 = appcoef2(c, s, wname, 2); % 第2层近似系数
[H2,V2,D2] = detcoef2('all',c,s,2);
这里有个冷知识——每往下一层,图像尺寸会缩小一半。比如原始512x512,第三层系数就变成64x64了。所以显示时需要上采样:
A3_up = imresize(A3, size(img)); % 缩放至原图尺寸
imshow(A3_up, 'Colormap', gray); % 显示近似系数
完整的可视化代码应该长这样:
figure('Position', [100 100 1200 800])
subplot(2,2,1)
imshow(A3_up, [])
title('近似系数(第三层)')
subplot(2,2,2)
imshow(imresize(H3, size(img)), [])
title('水平细节')
subplot(2,2,3)
imshow(imresize(V3, size(img)), [])
title('垂直细节')
subplot(2,2,4)
imshow(imresize(D3, size(img)), [])
title('对角细节')
跑出来的效果应该能看到类似这样的结构:近似系数保留主体轮廓,三个细节系数分别对应横向、纵向和对角线方向的边缘信息。重点提醒:小波基类型影响巨大,把db1换成bior3.7试试,边缘检测效果立竿见影。

数据格式方面,你的输入矩阵必须是double类型(0-1范围)。如果遇到维度错误,检查s矩阵的结构——它记录了每层分解后的尺寸变化。举个栗子,512x512的原图分解3层后,s矩阵结构应该是:
[64 64;
64 64;
128 128;
256 256;
512 512]
最后奉劝一句:别在低版本MATLAB上死磕,wavedec2的参数顺序在不同版本有差异。遇到报错先检查函数文档,别头铁硬调参数。代码跑通后建议保存系数矩阵,后续做图像压缩或去噪可以直接调用这些系数操作。
魔乐社区(Modelers.cn) 是一个中立、公益的人工智能社区,提供人工智能工具、模型、数据的托管、展示与应用协同服务,为人工智能开发及爱好者搭建开放的学习交流平台。社区通过理事会方式运作,由全产业链共同建设、共同运营、共同享有,推动国产AI生态繁荣发展。
更多推荐

所有评论(0)