离散小波变换Matlab

时间:2015-03-12 22:18:48

标签: matlab image-processing wavelet dwt

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

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

  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)

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

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

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

    由于

1 个答案:

答案 0 :(得分:6)

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

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

X是您的图片,Lo_DHi_D是您要应用于图片的低通和高通滤镜。 LL是图像的低通版本,其中水平和垂直方向低通,LH是垂直方向低通过的位置,水平方向是高通的,HL { {1}}是垂直方向高通,水平方向低通,HH是两个方向高通的位置。因此LHHLHH是详细系数,而LL包含结构。

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

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

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

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

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

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

enter image description here

请注意,图片会被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);转换回来。

这应该是你想要的!