在您问题的第二张图片中,显示了两级小波变换。使用您的代码示例dwt2
,您只进行单级分解。要进行两级分解,您可以使用wavedec2
函数 with N=2
。要创建如图所示的绘图,您必须仔细查看 的返回值wavedec2
:
(图片来自 Mathworks,来自 [ 2 ])
该向量C
包含所有近似系数,以列方式存储。S
是所谓的“簿记”矩阵,因为它包含有关如何存储数据的信息。
现在,cA2
在上面的示例中,第一张图像是C
. 使用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');