二维离散小波变换函数使用总结

前言

地球物理信号不止有地表检波器接收的一维信号!当把检波器排列为一个阵列时,将它们各自记录的信号集合在一起就是一个二维信号。有些背景噪声:在一维信号中体现的是随机性,但有可能在二维信号中就显示出很强的区域性或具有较明显的特征性!所以我们有必要学习小波处理二维信号的方式方法!

二维信号的直观反映就是图像!不管是地球物理的二维信号还是普通的一张图片,其本质都是一个数值的二维矩阵;在往本质上说它和一维离散数据信号其实内涵都是相同的。总之:二维离散小波变换处理的是二维数值离散矩阵

和一维离散小波函数的名称和使用方法差不多。二维离散小波变换的函数同样可分为3大功能:

(1)分解与重构/恢复信号:

  • 1级分解重构原始信号函数为:dwt2idwt2
  • 多级(包括1级)分解重构原始信号函数为:wavedec2waverec2

(2)系数重构:

  • 1级分解的系数重构用函数的是:upcoef2

  • 多级分解的系数重构用函数的是: wrcoef2

(3)系数提取:

  • 多级分解低频近似系数提取:appcoef2

  • 多解分解高频细节系数提取:detcoef2

说明:相关注意与说明和一维下是完全一样的!下面还是先给出一个具体的例子来看看各个函数间是如何搭配使用的,然后再给出每个函数的详细使用语法。


二维离散小波变换的例子就用matlab自带的一张图像来展示。下面直接上代码:

例1:二维1级小波分解

clc; clear;

I = imread('lena512.bmp');

figure(1);
subplot(2,2,1);
imshow(I,[]);
title('原图');
fprintf('原图尺寸为:%f\n',size(I));
fprintf('\n');

% 2维离散小波变换: 小波基函数为haar
[cA,cH,cV,cD] = dwt2(I,'haar');

subplot(2,2,2);
imshow(cA,[]);
title('近似矩阵');
fprintf('近似矩阵尺寸为:%f\n',size(cA));
fprintf('\n');

f_hb = [cA cH;cV cD];
subplot(2,2,3);
imshow(f_hb,[]);
title('4个图合并展示');

% 逆变换的结果: 再得回原图像
I_n = idwt2(cA,cH,cV,cD,'haar');
subplot(2,2,4);
imshow(I_n,[]);
title('逆回原图结果');
fprintf('逆回原图尺寸为:%f\n',size(I_n));

figure(2)
subplot(2,2,1);
imshow(cA,[]);
title('近似矩阵');
subplot(2,2,2);
imshow(cH,[]);
title('水平近似矩阵');
subplot(2,2,3);
imshow(cV,[]);
title('垂向近似矩阵');
subplot(2,2,4);
imshow(cD,[]);
title('对角近似矩阵');

figure(1) 效果:

二维离散小波变换函数使用总结_第1张图片
图2:二维1级分解后相关图像展示

figure(2) 效果:

二维离散小波变换函数使用总结_第2张图片
图2:二维1级分解后4个子图的详细展示

例2:二维多级小波分解

clc; clear;

s = imread('lena512.bmp');

% 多级分解: 
% 命令: wavedec2
[C,S] = wavedec2(s,2,'db1');

% 多级分解系数提取: 只有多级分解会用到
% 命令: appcoef2低频系数提取; detcoef2高频系数提取
% 参数说明: h、v、d 分别代表水平、垂直、对角; 数字代表层数/级数
cA2 = appcoef2(C,S,'db1',2); 
cH2 = detcoef2('h',C,S,2); 
cV2 = detcoef2('v',C,S,2);
cD2 = detcoef2('d',C,S,2);  % 2代表2级, 尺寸: 128x128

cH1 = detcoef2('h',C,S,1);
cV1 = detcoef2('v',C,S,1);
cD1 = detcoef2('d',C,S,1);  % 1代表1级, 尺寸: 256x256

figure(1);
% imshow([ [cA2 cH2;cV2 cD2] cH1;cV1 cD1],[]);
f_tmp1 = [cA2 cH2;cV2 cD2];
f_tmp2 = [f_tmp1 cH1;cV1 cD1];
imshow(f_tmp2,[]);
title('时域→小波域');

% 多级分解系数重构: 小波域→时域
% 说明: 所有子图的尺寸全部和原始大小一样 512x512
% 命令: wrcoef2
% 参数说明: a、h、v、d 分别代表近似、水平、垂直、对角; 数字代表层数/级数
A2 = wrcoef2('a',C,S,'db1',2); 
H2 = wrcoef2('h',C,S,'db1',2);  
V2 = wrcoef2('v',C,S,'db1',2);  
D2 = wrcoef2('d',C,S,'db1',2);  % 重构第2层的

A1 = wrcoef2('a',C,S,'db1',1); 
H1 = wrcoef2('h',C,S,'db1',1); 
V1 = wrcoef2('v',C,S,'db1',1);
D1 = wrcoef2('d',C,S,'db1',1);  % 重构第1层的

figure(2);
subplot(2,4,1); imshow(A2,[]); title('2级低频近似');
subplot(2,4,2); imshow(H2,[]); title('2级高频水平细节');
subplot(2,4,3); imshow(V2,[]); title('2级高频垂直细节');
subplot(2,4,4); imshow(D2,[]); title('2级高频对角细节');
subplot(2,4,5); imshow(A1,[]); title('1级低频近似');
subplot(2,4,6); imshow(H1,[]); title('1级高频水平细节');
subplot(2,4,7); imshow(V1,[]); title('1级高频垂直细节');
subplot(2,4,8); imshow(D1,[]); title('1级高频对角细节');
suptitle('原始图像的各个成分');

figure(1) 效果:

二维离散小波变换函数使用总结_第3张图片
图3:二维信号2级分解后各个小波域子成分效果图

figure(2) 效果:

二维离散小波变换函数使用总结_第4张图片
图4:对图1各个子成分的拆开展示

函数语法总结

(1)首先总结例1中的语法:

  • 二维1级分解函数:dwt2
[cA, cH, cV, cD] = dwt2(I, 'wavename');

% dwt2参数:I是原始信号,'wavename'小波基函数;
% 左边返回值:cA是低频近似,cH是水平向高频近似,cV是垂直向高频近似,cD是对角向高频近似。
  • 二维1级重构/恢复信号函数:idwt2
I_n = idwt2(cA, cH, cV, cD, 'wavename');

% idwt2参数:前4个就是分解出的东西,'wavename'还是一样的小波基函数;
% 左边返回值:I_n是重构/恢复的原始信号

(2)总结例2中的语法:

  • 二维多级分解函数:wavedec2
[C,S] = wavedec2(s, N, 'wavename');

% wavedec2参数:s是原始信号,N是分解级数,'wavename'小波基函数;
% 左边返回值:C是小波分解后的各个系数,S是相应小波系数的个数;

% 例子2中使用的是:
[C,S] = wavedec2(s, 2, 'db1');
  • 二维多级系数提取函数:appcoef2detcoef2
% 直接看例子中的语句:
cA2 = appcoef2(C,S,'db1',2); 
cH2 = detcoef2('h',C,S,2); 
cV2 = detcoef2('v',C,S,2);
cD2 = detcoef2('d',C,S,2);  % 2代表分解后的2级层次

cH1 = detcoef2('h',C,S,1);
cV1 = detcoef2('v',C,S,1);
cD1 = detcoef2('d',C,S,1);  % 1代表分解后的1级层次

% detcoef2高频细节系数提取,appcoef2低频近似系数提取:
% detcoef2第一位置参数:'h'表示水平高频细节,'v'表示垂直高频细节,'d'表示对角高频细节。

说明:分解N级,要做N个高频细节部分的的系数提取低频近似只用做一次

  • 二维多级系数重构函数:wrcoef2
% 直接看例子中的语句:
A2 = wrcoef2('a',C,S,'db1',2); 
H2 = wrcoef2('h',C,S,'db1',2);  
V2 = wrcoef2('v',C,S,'db1',2);  
D2 = wrcoef2('d',C,S,'db1',2);  % 2代表重构第2级层次

% A1 = wrcoef2('a',C,S,'db1',1); 
H1 = wrcoef2('h',C,S,'db1',1); 
V1 = wrcoef2('v',C,S,'db1',1);
D1 = wrcoef2('d',C,S,'db1',1);  % 1代表重构第1级层次

% wrcoef2第一位置参数:'a'表示低频近似部分,'h'/ 'v'/ 'd'和上面一样
% 注意:1级低频重构可以做也可以不做。
  • 补充二维多级重构/恢复原始信号:waverec2
s_rec = waverec2(C, S, 'wavename');

% waverec2参数:C,S是分解出来的东西,'wavename'保持一致的小波基函数
% s_rec是重构/恢复的原始信号

至此,常见的二维信号小波相关基础函数的使用就介绍完毕了。可以看出基础函数在一、二维小波变换中的用法非常相近。最后用一个表格进行归纳:

  二维1级分解 二维多级分解
分解函数 dwt2 wavedec2
系数提取函数 不需要 appcoef2detcoef2
系数重构函数 upcoef2 wrcoef2
重构/恢复信号函数 idwt2 waverec2

二维离散数据小波变换应该实例

其实二维离散数据(矩阵),就可以看成是多行的一维数据的叠加而已。因为对于二维信号最常做的噪声处理,和一维使用没用差别!阈值去噪还是设定阈值,将阈值与各国高频细节的系数进行对比判断来进行噪声压制。因此这里就不过多累述,详情参考这篇文章:一维离散数据小波变换实用案例。

你可能感兴趣的:(二维离散小波变换函数使用总结)