离散小波变换Matlab

con*_*rt3 2 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)

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

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

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

谢谢

ray*_*ica 6

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

[LL,LH,HL,HH] = dwt2(X,Lo_D,Hi_D);
Run Code Online (Sandbox Code Playgroud)

X是你的形象,Lo_D并且Hi_D是要应用到图像的低通和高通滤波器. LL是图像的低通版本,水平和垂直方向低通,LH垂直方向低通,水平方向高通,HL垂直方向高通,水平方向方向低通,HH是两个方向都高通过的地方.因此LH,HL并且HHLL包含结构的细节系数.

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

[LL,LH,HL,HH] = dwt2(X,'wname');
Run Code Online (Sandbox Code Playgroud)

'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], []);
Run Code Online (Sandbox Code Playgroud)

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

在此输入图像描述

注意,图像是由2,以便产生的分解二次取样LL, LH, HLHH.

一旦拥有了这些组件,您当然可以根据自己的内容操纵它们.一旦你操纵它们,你可以简单地使用它们idwt2:

Y = idwt2(LL,LH,HL,HH,Lo_R,Hi_R); %//or
Y = idwt2(LL,LH,HL,HH,'wname');
Run Code Online (Sandbox Code Playgroud)

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

这应该是你想要的!