我正在尝试使用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_D
和Hi_D
是要应用于图像的低通和高通滤波器。 LL
是图像的低通版本,其中水平和垂直方向是低通,LH
是垂直方向是低通,水平方向是高通,HL
是图像的低通。垂直方向是高通,水平方向是低通,HH
是两个方向都高通的位置。因此,LH
,HL
和HH
是详细系数,而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, 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);
转换回来。希望这应该是您想要的!