二维小波变换算法程序目录 ################################# appcoef2函数 % 当前延拓模式是补零 % 装载原始图像 load sinsin; % 绘制原始图像 subplot(2,2,1); image(X); colormap(map); title('原始图像'); % X 包含装载的图像 % 使用db1对X进行尺度为2的分解 [c,s] = wavedec2(X,2,'db1'); sizex = size(X) sizec = size(c) val_s = s % 提取尺度为2时的低频系数 ca2 = appcoef2(c,s,'db1',2); sizeca2 = size(ca2) % 绘制尺度为2时的低频图像 subplot(2,2,2); image(ca2); colormap(map); title('尺度为2时的图像'); % 计算尺度为1时的低频系数 ca1 = appcoef2(c,s,'db1',1); sizeca1 = size(ca1) % 绘制尺度为1时的低频图像 subplot(2,2,3); image(ca1); colormap(map); title('尺度为1时的图像'); ################################# detcoef2函数 % 当前延拓模式是补零 % 装载原始图像 load woman; % X 包含原始图像 % 绘制原始图像 subplot(3,3,1); image(X); colormap(map); title('原始图像'); % 使用db1对X进行尺度为2的分解 [c,s] = wavedec2(X,2,'db1'); sizex = size(X) sizec = size(c) val_s = s % 对于各个方向,从小波分解结构[c,s]中提取尺度为2时的高频系数 [chd2,cvd2,cdd2] = detcoef2('all',c,s,2); sizecd2 = size(chd2) % 绘制尺度为2时高频图像 subplot(3,3,4); image(chd2); title('尺度为2时高频图像的水平部分'); subplot(3,3,5); image(cvd2); title('尺度为2时高频图像的垂直部分'); subplot(3,3,6); image(cdd2); title('尺度为2时高频图像的对角部分'); % 对于各个方向,从小波分解结构[c,s]中提取尺度为1时的高频系数 [chd1,cvd1,cdd1] = detcoef2('all',c,s,1); sizecd1 = size(chd1) % 绘制尺度为1时高频图像 subplot(3,3,7); image(chd1); title('尺度为1时高频图像的水平部分'); subplot(3,3,8); image(cvd1); title('尺度为1时高频图像的垂直部分'); subplot(3,3,9); image(cdd1); title('尺度为1时高频图像的对角部分'); ################################# idwt2函数 % 当前延拓模式是补零 % 装载原始图像 load sinsin; % X 包含装载的图像 % 绘制原始图像 subplot(1,2,1); image(X); colormap(map); title('原始图像'); sX = size(X); % 使用db4对X进行单尺度分解 [cA1,cH1,cV1,cD1] = dwt2(X,'db4'); % 利用尺度为1时的系数直接重构 A0 = idwt2(cA1,cH1,cV1,cD1,'db4',sX); % 绘制重构图像 subplot(1,2,2); image(A0); title('重构图像'); % 检查重构效果 max(max(abs(X-A0))) ################################# iswt2函数 % 载入原始图像 load sinsin; % X 包含装载的图像 % 绘制原始图像 subplot(2,2,1); image(X); colormap(map); title('原始图像'); % 使用sym4对X在第3层进行SWT分解 swc = swt2(X,3,'sym4'); % 第二种用法 [ca,chd,cvd,cdd] = swt2(X,3,'sym4'); % 从小波分解结构swc,重构s a0 = iswt2(swc,'sym4'); % 绘制重构图像1 subplot(2,2,3); image(a0); colormap(map); title('重构图像1'); % 第二种用法 a0 = iswt2(ca,chd,cvd,cdd,'sym4'); % 绘制重构图像2 subplot(2,2,4); image(a0); colormap(map); title('重构图像2'); % 检查重构的效果 err = max(max(abs(X-a0))) errbis = max(max(abs(X-a0bis))) ################################# wavedec2函数 % 当前延拓模式是补零 % 装载原始图像 load woman; % X 包含装载的图像 % 使用db1对X进行尺度为2时的小波分解 [c,s] = wavedec2(X,2,'db1'); % 分解结构 sizex = size(X) sizec = size(c) val_s = s ################################# swt2函数 %载入原始图像 load sinsin; % 使用sym4在第3层对X进行SWT分解 [ca,chd,cvd,cdd] = swt2(X,3,'sym4'); whos ################################# upcoef2函数 % 当前延拓模式是补零 % 装载原始图像 load sinsin; % X 包含装载的图像 subplot(3,2,1); image(X); colormap(map); title('原始图像'); % 使用db4对X进行尺度为2的分解 [c,s] = wavedec2(X,2,'db4'); % 由系数重构第1层低频和细节部分 % 也可以使用wrcoef2完成,或者使用下面的步骤等价实现 % Step 1: 从分解结构[c,s]中提取系数 % Step 2: 使用upcoef2进行重构 siz = s(size(s,1),:); ca1 = appcoef2(c,s,'db4',1); a1 = upcoef2('a',ca1,'db4',1,siz); % 绘制低频重构图 subplot(3,2,3); image(a1); colormap(map); title('低频重构图'); chd1 = detcoef2('h',c,s,1); hd1 = upcoef2('h',chd1,'db4',1,siz); % 绘制高频水平部分重构图 subplot(3,2,4); image(hd1); colormap(map); title('高频水平部分重构图'); cvd1 = detcoef2('v',c,s,1); vd1 = upcoef2('v',cvd1,'db4',1,siz); % 绘制高频垂直部分重构图 subplot(3,2,5); image(vd1); colormap(map); title('高频垂直部分重构图'); cdd1 = detcoef2('d',c,s,1); dd1 = upcoef2('d',cdd1,'db4',1,siz); % 绘制高频对角部分重构图 subplot(3,2,6); image(dd1); colormap(map); title('高频对角部分重构图'); ################################# upwlev2函数 % 当前延拓模式是补零 % 装载原始图像 load woman; % X 包含装载的图像 % 使用db1在尺度为2时进行对X分解 [c,s] = wavedec2(X,2,'db1'); sc = size(c) val_s = s % 对小波分解结构[c,s]进行一步重构 [nc,ns] = upwlev2(c,s,'db1'); snc = size(nc) val_ns = ns ################################# waverec2函数 % 当前延拓模式是补零 % 装载原始图像 load sinsin; % X 包含装载的图像 % 绘制原始图像 subplot(1,2,1); image(X); colormap(map); title('原始图像'); % 使用sym4对X进行尺度为2时的小波分解 [c,s] = wavedec2(X,2,'sym4'); % 由小波分解结构[c,s]重构X a0 = waverec2(c,s,'sym4'); % 绘制重构图像 subplot(1,2,2); image(a0); colormap(map); title('重构图像'); % 检查重构效果 max(max(abs(X-a0))) ################################# wenergy2函数 load detail [C,S] = wavedec2(X,2,'sym4'); [Ea,Eh,Ev,Ed] = wenergy2(C,S) [Ea,EDetails] = wenergy2(C,S) ################################# wrcoef2函数 % 当前延拓模式是补零 % 装载图像 load sinsin; % X包含载入的图像 % 绘制原始图像 figure(1); subplot(2,2,1); image(X); colormap(map); title('原始图像'); % 使用sym5对X进行尺度为2的分解 [c,s] = wavedec2(X,2,'sym5'); % 从小波分解结构[c,s]进行尺度为1和2时的低频重构 a1 = wrcoef2('a',c,s,'sym5',1); a2 = wrcoef2('a',c,s,'sym5',2); % 绘制尺度为1时的低频图像 subplot(2,2,3); image(a1);colormap(map); title('尺度为1时的低频图像'); % 绘制尺度为2时的低频图像 subplot(2,2,4); image(a2);colormap(map); title('尺度为2时的低频图像'); % 从小波分解结构[c,s]在尺度为2时重构高频 % 'h' 是水平方向 % 'v' 是垂直方向 % 'd' 是对角方向 hd2 = wrcoef2('h',c,s,'sym5',2); vd2 = wrcoef2('v',c,s,'sym5',2); dd2 = wrcoef2('d',c,s,'sym5',2); % 绘制高频图像 figure(2); subplot(2,2,1); image(hd2);colormap(map); title('尺度为2时的水平高频图像'); subplot(2,2,2); image(vd2);colormap(map); title('尺度为2时的垂直高频图像'); subplot(2,2,3); image(dd2);colormap(map); title('尺度为2时的对角高频图像'); % 验证这些图像的长度都是sX sX = size(X) sa1 = size(a1) shd2 = size(hd2) ################################# 二维离散小波变换1函数 % 装载图像 load belmont2; % 显示图像 image(X); colormap(map); colorbar; % 执行图像的单尺度小波分解 [cA1,cH1,cV1,cD1] = dwt2(X,'bior3.7'); % 由系数重构低频和高频部分 A1 = upcoef2('a',cA1,'bior3.7',1); H1 = upcoef2('h',cH1,'bior3.7',1); V1 = upcoef2('v',cV1,'bior3.7',1); D1 = upcoef2('d',cD1,'bior3.7',1); % 显示低频和高频部分 figure(2); colormap(map); nbcol = size(map,1) subplot(2,2,1); image(wcodemat(A1,nbcol)); title('低频A1') subplot(2,2,2); image(wcodemat(H1,nbcol)); title('水平高频H1') subplot(2,2,3); image(wcodemat(V1,nbcol)); title('垂直高频V1') subplot(2,2,4); image(wcodemat(D1,nbcol)); title('对角高频D1') % 由小波逆变换恢复原图像信号 Xsyn = idwt2(cA1,cH1,cV1,cD1,'bior3.7'); % 图像的多尺度二维小波分解 [C,S] = wavedec2(X,2,'bior3.7'); % 提取系数的低频和高频部分 cA2 = appcoef2(C,S,'bior3.7',2); % 重构第二层的低频信号 A2 = wrcoef2('a',C,S,'bior3.7',2); % 重构第1、2层的高频信号 H1 = wrcoef2('h',C,S,'bior3.7',1); V1 = wrcoef2('v',C,S,'bior3.7',1); D1 = wrcoef2('d',C,S,'bior3.7',1); H2 = wrcoef2('h',C,S,'bior3.7',2); V2 = wrcoef2('v',C,S,'bior3.7',2); D2 = wrcoef2('d',C,S,'bior3.7',2); % 显示多尺度二维分解结果 figure(3) colormap(map); subplot(2,4,1);image(wcodemat(A1,nbcol)); title('低频A1') subplot(2,4,2);image(wcodemat(H1,nbcol)); title('水平高频H1') subplot(2,4,3);image(wcodemat(V1,nbcol)); title('垂直高频V1') subplot(2,4,4);image(wcodemat(D1,nbcol)); title('对角高频D1') subplot(2,4,5);image(wcodemat(A2,nbcol)); title('低频A2') subplot(2,4,6);image(wcodemat(H2,nbcol)); title('水平高频H2') subplot(2,4,7);image(wcodemat(V2,nbcol)); title('垂直高频V2') subplot(2,4,8);image(wcodemat(D2,nbcol)); title('对角高频D2') % 重构原始图像信号 X0 = waverec2(C,S,'bior3.7'); % 显示重构得到的图像 figure(4) image(X0); colormap(map); ################################# 二维离散小波变换2函数 % 当前延拓模式是补零 % 装载原始图像 load sinsin; % X 包含原始图像 % 绘制原始图像 figure(1); image(X); colormap(map); title('原始图像'); % map 包含原始彩图 nbcol = size(map,1); % 使用db1对X进行单尺度分解 [cA1,cH1,cV1,cD1] = dwt2(X,'db1'); % 绘制各分解系数图像 figure(2); subplot(2,2,1); image(cA1);colormap(map); title('db1低频系数图像'); subplot(2,2,2); image(cH1); title('db1水平高频图像'); subplot(2,2,3); image(cV1); title('db1垂直高频图像'); subplot(2,2,4); image(cD1); title('db1对角高频图像'); % 通过图像量化编码改善图像质量 cod_X = wcodemat(X,nbcol); cod_cA1 = wcodemat(cA1,nbcol); cod_cH1 = wcodemat(cH1,nbcol); cod_cV1 = wcodemat(cV1,nbcol); cod_cD1 = wcodemat(cD1,nbcol); dec2d = [... cod_cA1, cod_cH1; ... cod_cV1, cod_cD1; ... ]; % 绘制各分解系数图像 figure(3); subplot(2,2,1); image(cod_cA1);colormap(map); title('编码后低频系数图像'); subplot(2,2,2); image(cod_cH1); title('编码后水平高频图像'); subplot(2,2,3); image(cod_cV1); title('编码后垂直高频图像'); subplot(2,2,4); image(cod_cD1); title('编码后对角高频图像'); ################################# 二维离散小波变换3函数 % 装载图像信号 load belmont2; % 完成图像的单层次小波分解 [swa,swh,swv,swd] = swt2(X,1,'db1'); % 显示低频和高频系数 map = pink(size(map,1)); figure(1) colormap(map) nbcol = size(map,1) subplot(2,2,1), image(wcodemat(swa,nbcol)); title('低频系数swa') subplot(2,2,2), image(wcodemat(swh,nbcol)); title('水平方向高频系数swh') subplot(2,2,3), image(wcodemat(swv,nbcol)); title('垂直方向高频系数swv') subplot(2,2,4), image(wcodemat(swd,nbcol)); title('对角方向高频系数swd') % 通过平稳小波逆变换重构图像 A0 = iswt2(swa,swh,swv,swd,'db1'); nulcfs = zeros(size(swa)); % 由分解系数重构第一层的低频和高频部分 A1 = iswt2(swa,nulcfs,nulcfs,nulcfs,'db1'); H1 = iswt2(nulcfs,swh,nulcfs,nulcfs,'db1'); V1 = iswt2(nulcfs,nulcfs,swv,nulcfs,'db1'); D1 = iswt2(nulcfs,nulcfs,nulcfs,swd,'db1'); % 显示第一层的分解结果,包括显示低频和高频部分 figure(2) colormap(map) subplot(2,2,1), image(wcodemat(A1,nbcol)); title('低频 A1') subplot(2,2,2), image(wcodemat(H1,nbcol)); title('水平高频H1') subplot(2,2,3), image(wcodemat(V1,nbcol)); title('垂直高频V1') subplot(2,2,4), image(wcodemat(D1,nbcol)); title('对角高频D1') % 图像的多层二维离散平稳小波分解 [swa,swh,swv,swd] = swt2(X,3,'db1'); % 显示多层二维离散平稳小波分解结果 figure(3) colormap(map) kp = 0; for i = 1:3 subplot(3,4,kp+1), image(wcodemat(swa(:,:,i),nbcol)); title(['低频系数:level ',num2str(i)]) subplot(3,4,kp+2), image(wcodemat(swh(:,:,i),nbcol)); title(['水平高频系数:level ',num2str(i)]) subplot(3,4,kp+3), image(wcodemat(swv(:,:,i),nbcol)); title(['垂直高频系数:level ',num2str(i)]) subplot(3,4,kp+4), image(wcodemat(swd(:,:,i),nbcol)); title(['对角高频系数:level ',num2str(i)]) kp = kp + 4; end % 从系数中重构第3层的低频信号 mzero = zeros(size(swd)); A = mzero; A(:,:,3) = iswt2(swa,mzero,mzero,mzero,'db1'); % 由系数重构第1、2、3层的高频信号 H = mzero; V = mzero; D = mzero; for i = 1:3 swcfs = mzero; swcfs(:,:,i) = swh(:,:,i); H(:,:,i) = iswt2(mzero,swcfs,mzero,mzero,'db1'); swcfs = mzero; swcfs(:,:,i) = swv(:,:,i); V(:,:,i) = iswt2(mzero,mzero,swcfs,mzero,'db1'); swcfs = mzero; swcfs(:,:,i) = swd(:,:,i); D(:,:,i) = iswt2(mzero,mzero,mzero,swcfs,'db1'); end % 重构第1、2层的低频部分 A(:,:,2) = A(:,:,3) + H(:,:,3) + V(:,:,3) + D(:,:,3); A(:,:,1) = A(:,:,2) + H(:,:,2) + V(:,:,2) + D(:,:,2); figure(4) % 显示第1、2、3层的低频和高频部分 colormap(map) kp = 0; for i = 1:3 subplot(3,4,kp+1), image(wcodemat(A(:,:,i),nbcol)); title(['低频:level ',num2str(i)]) subplot(3,4,kp+2), image(wcodemat(H(:,:,i),nbcol)); title(['水平高频:level ',num2str(i)]) subplot(3,4,kp+3), image(wcodemat(V(:,:,i),nbcol)); title(['垂直高频:level ',num2str(i)]) subplot(3,4,kp+4), image(wcodemat(D(:,:,i),nbcol)); title(['对角高频:level ',num2str(i)]) kp = kp + 4; end ########################### |
|