我正在尝试使用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经验的人可以在一分钟内解决这个问题,我对它很新。
由于
答案 0 :(得分:6)
我很好奇为什么你不能使用dwt2
来计算图像的2D DWT。你所拥有的工作远比你应该做的工作多得多。 dwt2
更适合做你想做的事。你这样打电话给dwt2
:
[LL,LH,HL,HH] = dwt2(X,Lo_D,Hi_D);
X
是您的图片,Lo_D
和Hi_D
是您要应用于图片的低通和高通滤镜。 LL
是图像的低通版本,其中水平和垂直方向低通,LH
是垂直方向低通过的位置,水平方向是高通的,HL
{ {1}}是垂直方向高通,水平方向低通,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);
转换回来。
这应该是你想要的!