多维小波变换工具箱.docx
《多维小波变换工具箱.docx》由会员分享,可在线阅读,更多相关《多维小波变换工具箱.docx(12页珍藏版)》请在冰豆网上搜索。
多维小波变换工具箱
多维小波变换工具箱
Multi-dimensionWaveletToolbox
Version1.0
作者:
***
一、函数的简要说明
convnd
对多维数据在某一维向上做线性卷积
convndcut
和convnd差不多,但加上了可以截取卷积结果的中间一部分而把两边删去的功能
dyaddownnd
隔点采样
dyadupnd
在两点间添0
dwtnd1
多维空间中一个维向上的一次小波变换
dwtndn
多维空间一次小波变换(各维向都做一次)
wavedecnd
多维空间多次小波变换分解
idwtnd1
多维空间中一个维向上的一次小波逆变换
idwtndn
多维空间一次小波逆变换
waverecnd
多维空间多次小波逆变换重构
packup
利用dwtndn和wavedecnd的结果拼成多维系数空间的表示形式
fitscale
改变数据值的分布以利于图像显示
show3d
用图像显示三维空间的小波变换系数
二、实例
实例一dwtnd1和idwtnd1
r=rand(4,4,4)%随机生成一个多维空间的数据,这里是个4*4*4的三维空间
r(:
:
1)=
0.20280.19880.93180.5252
0.19870.01530.46600.2026
0.60380.74680.41860.6721
0.27220.44510.84620.8381
r(:
:
2)=
0.01960.50280.18970.5417
0.68130.70950.19340.1509
0.37950.42890.68220.6979
0.83180.30460.30280.3784
r(:
:
3)=
0.86000.89980.66020.5341
0.85370.82160.34200.7271
0.59360.64490.28970.3093
0.49660.81800.34120.8385
r(:
:
4)=
0.56810.44490.95680.9797
0.37040.69460.52260.2714
0.70270.62130.88010.2523
0.54660.79480.17300.8757
[ca,cd]=dwtnd1(r,1,'haar')%对数据r在第一维向即row方向做一次haar小波分解
ca(:
:
1)=
0.28390.15140.98840.5146
0.61940.84280.89441.0679
ca(:
:
2)=
0.49560.85720.27090.4897
0.85650.51870.69650.7610
ca(:
:
3)=
1.21171.21720.70870.8918
0.77081.03440.44610.8116
ca(:
:
4)=
0.66360.80571.04610.8847
0.88341.00140.74470.7977
cd(:
:
1)=
0.00290.12980.32940.2280
0.23450.2133-0.3023-0.1174
cd(:
:
2)=
-0.4678-0.1461-0.00270.2763
-0.31980.08790.26830.2259
cd(:
:
3)=
0.00450.05530.2250-0.1365
0.0686-0.1224-0.0364-0.3742
cd(:
:
4)=
0.1398-0.17660.30710.5008
0.1104-0.12270.5001-0.4408
这里得到ca,cd分别是小波分解后的近似分量和细节分量,都是2*4*4的三维空间。
q=idwtnd1(ca,cd,1,'haar')%用分解的结果做一次逆变换来得到原来的数据
q(:
:
1)=
0.20280.19880.93180.5252
0.19870.01530.46600.2026
0.60380.74680.41860.6721
0.27220.44510.84620.8381
q(:
:
2)=
0.01960.50280.18970.5417
0.68130.70950.19340.1509
0.37950.42890.68220.6979
0.83180.30460.30280.3784
q(:
:
3)=
0.86000.89980.66020.5341
0.85370.82160.34200.7271
0.59360.64490.28970.3093
0.49660.81800.34120.8385
q(:
:
4)=
0.56810.44490.95680.9797
0.37040.69460.52260.2714
0.70270.62130.88010.2523
0.54660.79480.17300.8757
可以看到和原来的数据是一致的。
实例二dwtndn和idwtndn
还用刚才生成的数据r
y=dwtndn(r,'haar')%对三个方向都做小波变换
y=
Columns1through4
[2x2x2double][2x2x2double][2x2x2double][2x2x2double]
Columns5through8
[2x2x2double][2x2x2double][2x2x2double][2x2x2double]
得到的是一个cell,里面有8个2*2*2的数据,第一个是所谓的aaa即三个维向上的近似系数,而最后一个是所谓的ddd即三个维向上的细节系数。
x=idwtndn(y,'haar')%利用分解结果恢复原有的数据
x(:
:
1)=
0.20280.19880.93180.5252
0.19870.01530.46600.2026
0.60380.74680.41860.6721
0.27220.44510.84620.8381
x(:
:
2)=
0.01960.50280.18970.5417
0.68130.70950.19340.1509
0.37950.42890.68220.6979
0.83180.30460.30280.3784
x(:
:
3)=
0.86000.89980.66020.5341
0.85370.82160.34200.7271
0.59360.64490.28970.3093
0.49660.81800.34120.8385
x(:
:
4)=
0.56810.44490.95680.9797
0.37040.69460.52260.2714
0.70270.62130.88010.2523
0.54660.79480.17300.8757
可以看到得到了恢复
实例三wavedecnd和waverecnd
r=rand(8,8,8);%生成一个8*8*8的三维空间
x=wavedecnd(r,2,'haar')%做两层的haar小波变换
x=
Columns1through4
[2x2x2double][2x2x2double][2x2x2double][2x2x2double]
Columns5through8
[2x2x2double][2x2x2double][2x2x2double][2x2x2double]
Columns9through12
[4x4x4double][4x4x4double][4x4x4double][4x4x4double]
Columns13through15
[4x4x4double][4x4x4double][4x4x4double]
4*4*4有七个它们是第一层的结果,其中的一个做了第二层变换而变成了8个2*2*2。
y=waverecnd(x,2,'haar');%恢复
any(abs(r-y)>1e-10)%是不是和原来的一样?
者利用等于0是不行的,因为计算由误差,当小于一个很小的数是就可以认为恢复了。
ans(:
:
1)=
00000000
ans(:
:
2)=
00000000
ans(:
:
3)=
00000000
ans(:
:
4)=
00000000
ans(:
:
5)=
00000000
ans(:
:
6)=
00000000
ans(:
:
7)=
00000000
ans(:
:
8)=
00000000
这就说明恢复是成功的。
实例四一个图像序列的处理
loadwoman%这个文件在原来的matlab小波工具箱的目录里
x=X(51:
199,51:
199);%大了点,切一小块吧
r=turndata(x,8,0.1);%这是一个生成图像序列的自定义程序,其实也就是故意做出一些变化
colormap(map);
function[d]=turndata(x,pages,step)
d=zeros(size(x,1),size(x,2),pages);
d(:
:
1)=x;
fori=2:
pages
d(:
:
i)=d(:
:
i-1)+x*step;
[a,b]=find(d(:
:
i)>255);
forj=1:
length(a)
d(a(j),b(j),i)=255;
end
end;
从侧面看可以发现下边的层次比上面的亮一些,而这种亮度的提高程度是和原来的亮度成正比的,也就是亮者愈亮。
下边我们对它做两层haar变换
h=wavedecnd(r,2,'haar')
h=
Columns1through3
[38x38x2double][38x38x2double][38x38x2double]
Columns4through6
[38x38x2double][38x38x2double][38x38x2double]
Columns7through9
[38x38x2double][38x38x2double][75x75x4double]
Columns10through12
[75x75x4double][75x75x4double][75x75x4double]
Columns13through15
[75x75x4double][75x75x4double][75x75x4double]
f=packup(h);%拼成一整个三维空间
g=fitscale(f);%适合256灰度的显示
show3d(g,2)%加上两级的辅助线
很不错的效果吧,其中最亮的一块是两次变换后的近似系数的表示。
小波变换没有减少空间的规模(还是150*150*8)但其中的近似部分区集中到一小块地方,这就是数据压缩的基本出发点。
还可以看看第一层的情况
imagesc(f(:
:
1))
三、一些值得注意的问题
1、做变换的数据的维的长度不要小于2,也就是说不能是(…3*2*…*4*1*…),这样的分解没有什么意义,而且可能会出现不可预料的结果。
2、关于奇偶数的问题
先看一个用matlab5.2上的函数算一个题
x=rand(5,5)
x=
0.20750.34900.54010.01980.6700
0.85060.16250.69840.09840.4562
0.71310.53980.00210.37420.8380
0.08040.92330.83660.96750.8231
0.81870.43710.88940.61960.5421
[c,s]=wavedec2(x,2,'haar');%做两层的haar分解
h=waverec2(c,s,2,'haar')%试图恢复
Errorusing==>+
Matrixdimensionsmustagree.
Errorin==>F:
\MATLAB\toolbox\wavelet\wavelet\idwt2.m
Online48==>t0=conv2(dyadup(a,'r'),LoF_R')+conv2(dyadup(h,'r'),HiF_R');
Errorin==>F:
\MATLAB\toolbox\wavelet\wavelet\appcoef2.m
Online54==>a=idwt2(a,h,v,d,LoF_R,HiF_R,s(rm-p,:
));
Errorin==>F:
\MATLAB\toolbox\wavelet\wavelet\waverec2.m
Online28==>x=appcoef2(c,s,arg3,arg4,0);
很奇怪吧,能够分解,却在恢复的时候出错。
让我们看看到底发生了什么。
u=wavedecnd(x,2,'haar')
u=
Columns1through4
[2x2double][2x2double][2x2double][2x2double]
Columns5through7
[3x3double][3x3double][3x3double]
在第一层分解后生成3*3的矩阵,第二层分解为2*2的矩阵。
但在逆小波变换恢复是就会有问题。
拿前四个矩阵反变换之后生成的是4*4的矩阵,这样和后面的三个就不匹配了。
这是一个奇偶数的问题,如果是rand(4,4)就不会有这样的毛病。
我对这个问题进行了一些处理,详见源代码。
h=waverecnd(u,2,'haar')
h=
0.20750.34900.54010.01980.67000.0000
0.85060.16250.69840.09840.45620.0000
0.71310.53980.00210.37420.83800.0000
0.08040.92330.83660.96750.82310.0000
0.81870.43710.88940.61960.54210.0000
0.00000.00000.00000.000000.0000
很不幸,还是多了一行一列0,但5*5位置上的数却是正确的。