离散小波变换Matlab
Discrete Wavelet Transform Matlab
我正在尝试使用 Matlab 小波工具箱中提供的函数来创建图像的多级离散小波分解,提取系数,处理它们,然后将它们重新组合回图像中。
我尝试使用一些函数,但 none 似乎可以满足我的需要。这些是执行此操作的步骤。
使用wavedec2将图像分解为[C,S]。
[C,S] = wavedec2(X,N,Lo_D,Hi_D)
然后我必须使用 detcoef2 从 [C,S] 中提取细节系数。 [C,S]即'wavelet decomposition structure',不代表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
,我们可以进行一级二维 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);
转换回来。
希望这就是您要找的!
我正在尝试使用 Matlab 小波工具箱中提供的函数来创建图像的多级离散小波分解,提取系数,处理它们,然后将它们重新组合回图像中。
我尝试使用一些函数,但 none 似乎可以满足我的需要。这些是执行此操作的步骤。
使用wavedec2将图像分解为[C,S]。
[C,S] = wavedec2(X,N,Lo_D,Hi_D)
然后我必须使用 detcoef2 从 [C,S] 中提取细节系数。 [C,S]即'wavelet decomposition structure',不代表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
,我们可以进行一级二维 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);
转换回来。
希望这就是您要找的!