我正在尝试使用Matlab小波工具箱中提供的功能来创建图像的多级离散小波分解,提取系数,对其进行处理,然后将其重新组合为图像。

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


使用wavedec2将图像分解为[C,S]。
[C,S] = wavedec2(X,N,Lo_D,Hi_D)
然后,我必须使用detcoef2从[C,S]中提取详细系数。 [C,S]是“小波分解结构”,它不代表实际的系数,例如cD,cH,cV。
[H,V,D] = detcoef2('all',C,S,N)
处理数据
重建[C,S] ????没有功能可以做到这一点。
使用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,我们可以执行一个一级2D 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);转换回来。

希望这应该是您想要的!

07-24 15:48