function plot_wave_coef(cf_vec) dn = 3; num = (length(cf_vec)-1)/dn; figure; subplot(num+1, 3, 2); yt = im2uint8(mat2gray(cf_vec{1})); imshow(yt, []); title(sprintf('近似分量A_{%d}', num)); info = {'垂直细节V', '水平细节H', '对角线细节D'}; ps = 2; for i = 1 : num for j = 1 : dn yt = im2uint8(mat2gray(cf_vec{ps})); subplot(num+1, dn, ps+2); imshow(yt, []); title(sprintf('%s_{%d}', info{j}, num-i+1)); ps = ps+1; end end
时间: 2023-11-20 10:05:53 浏览: 38
这是一个 MATLAB 函数,用于绘制小波变换的系数图。输入参数 cf_vec 是一个元素为向量的单元格数组,每个向量包含了小波变换的一层系数。函数首先绘制近似分量的系数图(subplot(num+1, 3, 2)),然后绘制各个方向细节分量的系数图(subplot(num+1, dn, ps+2))。其中,dn 表示细节分量的数量,num 表示小波变换的层数。变量 info 是一个包含了各个细节分量名称的字符串数组。函数最后返回一个绘制好的图像。
相关问题
function [cf_vec, dim_vec] = wavedec_process(x, num, wave_name) if ndims(x) == 3 x = rgb2gray(x); end [lf, hf] = wfilters(wave_name, 'd'); o = x; x = double(x); cf_vec = []; dim_vec = size(x); for i = 1 : num [ya, yv, yh, yd] = dwt2_process(x, lf, hf); tmp = {yv; yh; yd}; dim_vec = [size(yv); dim_vec]; cf_vec=[tmp; cf_vec]; x = ya; end cf_vec = [ya; cf_vec]; figure; imshow(o, []); title('原图像'); plot_wave_coef(cf_vec); plot_wave_coef_join(cf_vec, dim_vec);
这是一个用于小波分解的函数,输入参数包括待处理的信号 x、分解层数 num 和小波名称 wave_name。如果输入的信号是一个三维信号(比如 RGB 彩色图像),则将其转换为灰度图像。然后使用 wfilters 函数根据指定的小波名称获取低频和高频滤波器系数 lf 和 hf。接着对输入的信号进行 num 层小波分解,每一层分解得到一个低频分量 ya 和三个高频分量 yv、yh、yd,其中 yv、yh、yd 分别表示垂直、水平和对角线方向的高频分量。将每一层的高频分量按顺序存入 cf_vec 中,并将每一层分解得到的分量大小存入 dim_vec 中。最后将最后一层的低频分量 ya 加入到 cf_vec 中,并显示原始图像以及绘制分解得到的小波系数图形。
function plot_wave_coef_join(cf_vec,dim_vec) dn = 3; num = (length(cf_vec)-1)/dn; tmpa = wkeep(cf_vec{1}, dim_vec(1, :), 'c'); tmpa = im2uint8(mat2gray(tmpa)); tmpa(1, :) = 255; tmpa(end, :) = 255; tmpa(:, 1) = 255; tmpa(:, end) = 255; for j = 1:num tmpv = wkeep(cf_vec{(j-1)*dn+2}, dim_vec(j, :), 'c'); tmph = wkeep(cf_vec{(j-1)*dn+3}, dim_vec(j, :), 'c'); tmpd = wkeep(cf_vec{(j-1)*dn+4}, dim_vec(j, :), 'c'); tmpv = im2uint8(mat2gray(tmpv)); tmph = im2uint8(mat2gray(tmph)); tmpd = im2uint8(mat2gray(tmpd)); tmpv(1, :) = 255; tmpv(end, :) = 255; tmpv(:, 1) = 255; tmpv(:, end) = 255; tmph(1, :) = 255; tmph(end, :) = 255; tmph(:, 1) = 255; tmph(:, end) = 255; tmpd(1, :) = 255; tmpd(end, :) = 255; tmpd(:, 1) = 255; tmpd(:, end) = 255; tmp = [tmpa,tmpv;tmph,tmpd]; stc = size(tmp); if stc >= dim_vec(j+1, :) tmpa = tmp(1:dim_vec(j+1, 1), 1:dim_vec(j+1,2)); else tmp = tmp([1:end-1, end-2:end-1], [1:end-1, end-2:end-1]); tmpa = tmp(1:dim_vec(j+1, 1), 1:dim_vec(j+1,2)); end tmpa = im2uint8(mat2gray(tmpa)); tmpa(1, :) = 255; tmpa(end, :) = 255; tmpa(:, 1) = 255; tmpa(:, end) = 255; end figure; imshow(tmpa, []); title('小波系数塔式图');
这段代码实现了小波系数的塔式图绘制。具体来说,输入参数是小波系数向量 cf_vec 和尺度向量 dim_vec,其中 cf_vec 是一个长度为 (3*L+1) 的单元向量,L 是小波变换的层数。每个单元包含一组小波系数(近似、水平、垂直和对角线),即 cf_vec{1} 为第一层近似系数,cf_vec{2} - cf_vec{4} 为第一层细节系数,cf_vec{5} - cf_vec{7} 为第二层细节系数,以此类推。dim_vec 是一个 (L+1)*2 的矩阵,每行表示每一层小波系数的尺度大小。
在代码中,首先将第一层近似系数画出来,并对其进行边界处理,然后循环遍历每一层细节系数,分别画出其水平、垂直和对角线系数,并将它们与上一层的近似系数拼接在一起,形成一个新的小波系数图像。最后将最后一层的小波系数图像输出并显示。
需要注意的是,在代码中使用了 wkeep 函数对小波系数进行了裁剪,以保证每一层小波系数的尺度大小正确。同时,还对小波系数进行了归一化和转换为 uint8 型,以便于图像显示。
相关推荐
![zip](https://img-home.csdnimg.cn/images/20210720083736.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)