如何在matlab中显示小波变换函数dwt2的结果
How to Display wavelet transformation function dwt2 results in matlab
我正在图像上应用 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);
当我 运行 此代码可视化结果如下所示
但我希望我的结果应该是这样的,谁能帮帮我。
在你的问题的第二个图像中,显示了二级小波变换。对于使用 dwt2
的代码示例,您只是在进行单级分解。
要进行两级分解,可以使用 wavedec2
函数和 N=2
。要创建如图所示的图,您必须仔细查看 wavedec2
:
的 return 值
(Image by Mathworks, from [2])
向量C
包含所有近似系数,以列方式存储。 S
是所谓的 "book-keeping" 矩阵,因为它包含有关数据存储方式的信息。
现在第一张图片,上面例子中的cA2
,是C
的前32*32个条目。使用ii
和jj
作为索引变量,我们可以得到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');
一个更简单的方法是简单地将结果连接成矩阵,然后填充后续矩阵:
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);
"cameraman.tif" 图片的结果是:
对于更多的层次,只需计算第二层次的近似系数的小波。也就是说,取多个小波,即对当前小波结果的逼近系数重新计算小波,得到下一级小波。
我正在图像上应用 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);
当我 运行 此代码可视化结果如下所示
但我希望我的结果应该是这样的,谁能帮帮我。
在你的问题的第二个图像中,显示了二级小波变换。对于使用 dwt2
的代码示例,您只是在进行单级分解。
要进行两级分解,可以使用 wavedec2
函数和 N=2
。要创建如图所示的图,您必须仔细查看 wavedec2
:
向量C
包含所有近似系数,以列方式存储。 S
是所谓的 "book-keeping" 矩阵,因为它包含有关数据存储方式的信息。
现在第一张图片,上面例子中的cA2
,是C
的前32*32个条目。使用ii
和jj
作为索引变量,我们可以得到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');
一个更简单的方法是简单地将结果连接成矩阵,然后填充后续矩阵:
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);
"cameraman.tif" 图片的结果是:
对于更多的层次,只需计算第二层次的近似系数的小波。也就是说,取多个小波,即对当前小波结果的逼近系数重新计算小波,得到下一级小波。