加载中…
个人资料
  • 博客等级:
  • 博客积分:
  • 博客访问:
  • 关注人气:
  • 获赠金笔:0支
  • 赠出金笔:0支
  • 荣誉徽章:
正文 字体大小:

Matlab 图像小波变换

(2014-02-19 16:09:54)
标签:

wavelet

dwt2

upcoef2

waverec2

wavedec2

分类: 数字图像
二维小波变换和一维小波变换十分类似,下面直接通过例子说明。

1. 读入原始图像并显示
I_noise = imread( 'coins.png');
figure, imshow(I_noise);
title( '原始图像' );
http://s16/middle/002pSPISzy6GI6PdJtdcf&690图像小波变换" TITLE="Matlab 图像小波变换" />

2. 对图像进行一层小波分解 dwt2
[cA1, cH1, cV1, cD1] dwt2(I_noise, 'bior3.7');
figure
subplot(221), imshow(cA1, []);
subplot(222), imshow(cH1, []);
subplot(223), imshow(cV1, []);
subplot(224), imshow(cD1, []);
http://s6/middle/002pSPISzy6GI6PgKvX65&690图像小波变换" TITLE="Matlab 图像小波变换" />
可以看出,第一张图是图像的近似,相当于图像的低频部分,而其它三张图是图像的轮廓,也就是水平,垂直和对角三个方向的细节。是图像的高频部分。至此,各变量的维数如下所示。
http://s15/middle/002pSPISzy6GI6PicGy5e&690图像小波变换" TITLE="Matlab 图像小波变换" />

3. 使用upcoef2 从系数中构建近似和细节
A1 upcoef2('a'cA1, 'bior3.7'1);
H1 upcoef2('d'cH1, 'bior3.7'1);
V1 upcoef2('v'cV1, 'bior3.7'1);
D1 upcoef2('d'cD1, 'bior3.7'1);
figure
subplot(221), imshow(A1, []);
subplot(222), imshow(H1, []);
subplot(223), imshow(V1, []);
subplot(224), imshow(D1, []);
http://s16/middle/002pSPISzy6GI6PmmT56f&690图像小波变换" TITLE="Matlab 图像小波变换" />
从结果上看,似乎与小波分解得到的直接结果非常接近。但查看一下变量的大小,就会发现重构得到的结果,其维数与原始图像的维数基本一致(稍大一些),而小波分解得到的结果则近似是一个1/2 递减的过程。
http://s8/middle/002pSPISzy6GI6PpDxB67&690图像小波变换" TITLE="Matlab 图像小波变换" />

4. 多重小波分解 wavedec2
[C, S] wavedec2(I_noise, 2, 'bior3.7');
C代表分解系数的组合,是一个向量
http://s10/middle/002pSPISzy6GI6PqZJf89&690图像小波变换" TITLE="Matlab 图像小波变换" />
S表示每一层分解结果的维数,如果进行n层小波分解,S 的大小是(n+1)*2,最后一行表示的是原始图像的size
http://s8/middle/002pSPISzy6GI6PsM1Vc7&690图像小波变换" TITLE="Matlab 图像小波变换" />

5. 利用 waverec2 进行小波重构
I_wrec waverec2(C, S, 'bior3.7');
figure, imshow(I_wrec, []);
http://s16/middle/002pSPISzy6GI6PuTynaf&690图像小波变换" TITLE="Matlab 图像小波变换" />
可以看出,使用 waverec2 重构得到的结果不像使用 upcoef2 那样多出黑边,此外,通过查看变量维数可以发现,I_wrec 的维数与原图像相同。
http://s4/middle/002pSPISzy6GI6Pxzgvf3&690图像小波变换" TITLE="Matlab 图像小波变换" />

6. 利用 appcoef2 抽取第一层低频近似系数和第二层低频近似系数。
wcA2 appcoef2(C, S, 'bior3.7'2);
figure, imshow(wcA2, []);
wcA1 appcoef2(C, S, 'bior3.7'1);
figure, imshow(wcA1, [])
http://s15/middle/002pSPISzy6GI6PBIGG4e&690图像小波变换" TITLE="Matlab 图像小波变换" />

可以看出,二者大小上存在差异,但显示内容大致相同。
http://s10/middle/002pSPISzy6GI6PCTxv39&690图像小波变换" TITLE="Matlab 图像小波变换" />
对比还可发现,wcA1 的 size 与 dwt2 分解得到的 cA1 是相同的,事实上,二者基本是等价的。

7. 使用 upcoef 重构
I_wup2 upcoef2('a'wcA2, 'bior3.7'2)
figure, imshow( I_wup2, []);
I_wup1 upcoef2('a'wcA1, 'bior3.7'1);
figure, imshow(I_wup1, []); 这个结果与dwt2 部分得到的 A1 相同
http://s5/middle/002pSPISzy6GI6PG0XWa4&690图像小波变换" TITLE="Matlab 图像小波变换" />

这里为了简便,只重构了一层和二层的近似结果,如果需要对细节进行重构,只需将'a' 换成'h', 'v' 或者 'd' 即可。从图中可以发现,一层重构得到的图像要相对准确很多,这是因为二层小波近似所丢失的信息更多。

8. 抽取第一层细节 detcoef2
[chd1, cvd1, cdd1] detcoef2('all'C, S, 1);
figure
subplot(131), imshow(chd1, []);
subplot(132), imshow(cvd1, []);
subplot(133), imshow(cdd1, []);
http://s6/middle/002pSPISzy6GI6PJ0BT35&690图像小波变换" TITLE="Matlab 图像小波变换" />
同理,这个结果与 dwt2 得到的结果是一致的,所有变量的 size 如下图所示。
http://s11/middle/002pSPISzy6GI6PKQOu0a&690图像小波变换" TITLE="Matlab 图像小波变换" />

9. wrcoef2 对小波进行单支重构
Matlab help 中的例子如下
http://s16/middle/002pSPISzy6GI6PNHQP5f&690图像小波变换" TITLE="Matlab 图像小波变换" />
实际上,wrcoef2 的过程就相当于 appcoef2 或者 detcoef2 后再进行 upcoef2。其得到结果的 size 应该比原信号稍大一些。














0

阅读 收藏 喜欢 打印举报/Report
  

新浪BLOG意见反馈留言板 欢迎批评指正

新浪简介 | About Sina | 广告服务 | 联系我们 | 招聘信息 | 网站律师 | SINA English | 产品答疑

新浪公司 版权所有