在你提问的第二张图片中,展示了双层小波变换。使用
dwt2
函数的代码示例只进行了单层分解。如果要进行双层分解,则可以使用带有
N=2
参数的
wavedec2
函数。要创建如图所示的绘图,必须更加仔细地查看
wavedec2
的返回值:
(由Mathworks提供,引自[2])
向量C
以列为单位存储所有近似系数。 S
是所谓的“簿记”矩阵,因为它包含有关数据存储方式的信息。
现在第一幅图像,即上面示例中的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
中的信息:
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');
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');
rectangle('Position',[x,y,w,h])
添加每个边框。您还可以使用S
的内容来计算每个矩形的x,y,w,h
。 - hbaderts