如何在Matlab中显示小波变换函数dwt2的结果

3

我正在对一张图片应用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个回答

3
在你提问的第二张图片中,展示了双层小波变换。使用dwt2函数的代码示例只进行了单层分解。如果要进行双层分解,则可以使用带有N=2参数的wavedec2函数。要创建如图所示的绘图,必须更加仔细地查看wavedec2的返回值:

data(由Mathworks提供,引自[2])

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

现在第一幅图像,即上面示例中的cA2,是C的前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');

谢谢,它正在工作,但有一个问题,如何为每个图像添加边框。 - saimadhu.polamuri
完美。最简单的方法是使用 rectangle('Position',[x,y,w,h]) 添加每个边框。您还可以使用 S 的内容来计算每个矩形的 x,y,w,h - hbaderts
我是Matlab的新手,您能向我展示如何使用S计算x、y、w和h吗? - saimadhu.polamuri
我编辑了答案,包括边框。这样可以吗? - hbaderts
谢谢,它正在运行。非常感谢您的解决方案。 - saimadhu.polamuri

2
一个更简单的方法是将结果作为矩阵连接起来,并填充后续的矩阵:
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"图像的结果为:

输入图像描述

要获取更多级别,只需计算第二级的近似系数的小波。换句话说,使用多个小波,即重新计算当前小波结果的近似系数的小波以获得下一阶段的小波。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接