如何在matlab

时间:2015-08-11 06:16:18

标签: matlab haar-wavelet dwt wavelet-transform

我在图像上应用dwt2函数以应用小波变换,其给出四个结果图像cA(低通图像),cH(水平细节图像),cV(垂直细节图像),cD(对角细节图像)。这一切都很好,直到现在。我想要想象那些结果图像。

目前我正在使用以下代码可视化这四个结果图像。

image = imread(imagePath);
wavename = 'haar';
[cA,cH,cV,cD] = dwt2(im2double(iamge),wavename);
imshow([cA,cH; cV,cD],'Colormap',gray);

当我运行此代码时,可视化结果看起来像这样 enter image description here

但我希望我的结果应该看起来像任何人都可以帮助我。

enter image description here

2 个答案:

答案 0 :(得分:1)

在问题的第二张图像中,显示两级小波变换。使用dwt2的代码示例,您只进行单级分解。 要进行两级分解,您可以将wavedec2函数与N=2一起使用。要创建如图所示的绘图,您必须仔细查看wavedec2的返回值:

data(图片来自Mathworks,来自[2])

向量C包含以列方式存储的所有近似系数。 S是所谓的"簿记"矩阵,因为它包含有关数据存储方式的信息。

现在,上面示例中的第一个图像cA2C的前32 * 32个条目。使用iijj作为索引变量,我们可以获取C的相关部分并使用reshape来恢复图像格式:

ii = 1; jj = prod(S(1,:));
cA2 = reshape(C(ii:jj),S(1,:));

类似地获得其他第二级系数:

ii = jj+1; jj = ii + prod(S(2,:)) - 1;
cH2 = reshape(C(ii:jj),S(2,:));

ii = jj+1; jj = ii + prod(S(2,:)) - 1;
cV2 = reshape(C(ii:jj),S(2,:));

ii = jj+1; jj = ii + prod(S(2,:)) - 1;
cD2 = reshape(C(ii:jj),S(2,:));

使用S的第三行,也可以以相同的方式获得第一级系数:

ii = jj+1; jj = ii + prod(S(3,:)) - 1;
cH1 = reshape(C(ii:jj),S(3,:));

ii = jj+1; jj = ii + prod(S(3,:)) - 1;
cV1 = reshape(C(ii:jj),S(3,:));

ii = jj+1; jj = ii + prod(S(3,:)) - 1;
cD1 = reshape(C(ii:jj),S(3,:));

现在可以通过根据需要排列图像来简单地创建绘图:

imshow([[cA2,cH2; cV2,cD2],cH1;cV1,cD1],'Colormap',pink)

要添加边框,您可以使用rectangle功能和S中的信息:

% Small rectangles
rectangle('Position',[0,0,S(1,1),S(1,2)],'LineWidth',2,'EdgeColor','y');
rectangle('Position',[S(1,1),0,S(1,1),S(1,2)],'LineWidth',2,'EdgeColor','y');
rectangle('Position',[0,S(1,2),S(1,1),S(1,2)],'LineWidth',2,'EdgeColor','y');
rectangle('Position',[S(1,1),S(1,2),S(1,1),S(1,2)],'LineWidth',2,'EdgeColor','y');

% Large rectangles
rectangle('Position',[0,S(3,2),S(3,1),S(3,2)],'LineWidth',2,'EdgeColor','y');
rectangle('Position',[S(3,1),0,S(3,1),S(3,2)],'LineWidth',2,'EdgeColor','y');
rectangle('Position',[S(3,1),S(3,2),S(3,1),S(3,2)],'LineWidth',2,'EdgeColor','y');

答案 1 :(得分:1)

Another method is simply to re-compute wavelet of the Approximation coefficients and the concatenate the results as matrix.

image = imread(imagePath);
wavename = 'haar';
[cA,cH,cV,cD] = dwt2(im2double(image),wavename);
[cAA,cAH,cAV,cAD] = dwt2(cA,wavename); % Recompute Wavelet of Approximation Coefs.
Level2=[cAA,cAH; cAV,cAD]; %contacinat
imshow([Level2,cH; cV,cD],'Colormap',gray);

Results for "cameraman.tif" image is:

2 Level Haar Wavelet Image

For more levels simply compute wavelet of the approximation coefficients of the second level.