2

我正在尝试使用 Matlab Wavelet Toolbox 中提供的函数来创建图像的多级离散小波分解,提取系数,对其进行操作,然后将它们重新组合回图像中。

我尝试使用许多功能,但似乎没有一个能满足我的需要。这些是执行此操作的步骤。

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

  2. 然后我必须使用 detcoef2 从 [C,S] 中提取细节系数。[C,S]是'小波分解结构',它不代表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 经验的人可以在一分钟内解决这个问题,我对它还很陌生。

谢谢

4

1 回答 1

6

我很好奇为什么不能dwt2用于计算图像的 2D DWT。你所拥有的工作比你应该做的要多得多。 dwt2更适合做你想做的事。你会这样打电话dwt2

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

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

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

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

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

例如,通过使用cameraman.tifMATLAB 的系统路径,我们可以做一个一级 2D DWT(使用 Haar 小波)并显示所有组件,如下所示:

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

我使用im2double将图像转换为双精度以确保准确性。我们得到这个图像:

在此处输入图像描述

请注意,图像被 2 次采样以产生 和 的LL, LH, HL分解HH

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

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

这四个组件假定为double,因此您可以将图像转换回代表图像的任何类型。假设您的图像是uint8,您可以执行以下操作:Y = im2uint8(Y);转换回来。

这应该是您正在寻找的东西!

于 2015-03-13T02:04:51.177 回答