离散小波变换Matlab

Discrete Wavelet Transform Matlab

我正在尝试使用 Matlab 小波工具箱中提供的函数来创建图像的多级离散小波分解,提取系数,处理它们,然后将它们重新组合回图像中。

我尝试使用一些函数,但 none 似乎可以满足我的需要。这些是执行此操作的步骤。

  1. 使用wavedec2将图像分解为[C,S]。 [C,S] = wavedec2(X,N,Lo_D,Hi_D)

  2. 然后我必须使用 detcoef2 从 [C,S] 中提取细节系数。 [C,S]即'wavelet decomposition structure',不代表cD、cH、cV等实际系数。 [H,V,D] = detcoef2('all',C,S,N)

  3. 处理数据

  4. 重构 [C,S] ????没有函数执行此操作。

  5. 使用waverec2对原图进行重构。 X = waverec2(C,S,Lo_R,Hi_R)

问题出在第 4 步。没有重新创建 [C,S] 的函数,我无法调用函数 waverec2,因为它需要 C 和 S 的操纵版本。

我不需要 wavedec2 和 waverec2 吗?也许我应该只使用 detcoef2 和 upcoef2?

有一些 DWT 经验的人可以在一分钟内解决这个问题,我对它还很陌生。

谢谢

我很好奇为什么您不能使用 dwt2 来计算图像的 2D DWT。你所拥有的比你应该做的要多得多。 dwt2更适合随心所欲。您可以这样调用 dwt2

[LL,LH,HL,HH] = dwt2(X,Lo_D,Hi_D);

X 是您的图像,Lo_DHi_D 是您要应用于图像的低通和高通滤波器。 LL是图像的低通版本,水平和垂直方向都是低通,LH是垂直方向是低通,水平方向是高通,HL是垂直方向高通,水平方向低通,HH是两个方向都高通。因此 LHHLHH 是细节系数,而 LL 包含结构。

您还可以使用字符串作为第二个参数来指定您想要的过滤器:

[LL,LH,HL,HH] = dwt2(X,'wname');

'wname' 是一个字符串,用于指定您想要的过滤器。您可以输入 help wfilters 以查看可用的过滤器。

例如,通过使用 MATLAB 系统路径中的 cameraman.tif,我们可以进行一级二维 DWT(使用 Haar 小波)并显示所有组件,如下所示:

im = imread('cameraman.tif');
[LL, LH, HL, HH] = dwt2(im2double(im), 'haar');
imshow([LL LH; HL HH], []);

我使用im2double将图片转为双精度,以保证准确性。我们得到这张图片:

请注意,图像被二次采样 2 以产生 LL, LH, HLHH 的分解。

一旦拥有这些组件,您当然可以随心所欲地操纵它们。一旦你操作了它们,你可以像这样简单地使用 idwt2

Y = idwt2(LL,LH,HL,HH,Lo_R,Hi_R); %//or
Y = idwt2(LL,LH,HL,HH,'wname');

假定这四个组件是 double,因此您可以将图像转换回表示图像的任何类型。假设你的图像是 uint8,你可以这样做:Y = im2uint8(Y); 转换回来。

希望这就是您要找的!