马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。
您需要 登录 才可以下载或查看,没有账号?我要加入
x
在 Matlab里读入 Cameraman图像,编程实现如下操作:
1) 用矩阵
⎡1 1⎤
0.5*⎢ ⎥
⎣1 1⎦
对图像 Cameraman进行如图 1 所示操作,将处理结果放入区域(1) ;
2) 分别用矩阵
⎡1 1⎤
0.5*⎢ ⎥
⎣1 1⎦
与
⎡1 1⎤
0.5*⎢ ⎥
⎣1 1⎦
重复步骤 1 的操作,并分别放到区域(2)和区域(3);
3) 推导出与前三个矩阵都正交(内积为零)的矩阵,并用该矩阵重复步骤 1的操作将结果放在区域(4) ,画出如图 1 所示包含四个区域的图像结果;
推导如下,求第4的矩阵实际就是解方程
其中所求矩阵为
由以上方程可得
所以可取矩阵为
以上操作的结果为
4) 用小波工具箱 wavedec2()函数对该图像进行1 层小波分解,画出结果,并与以上操作结果比较。
对比如下:
可以看到,两种方式得到的结果是一样的,即方法一就是二维小波变换的实际计算。另外注意到两幅图中,2、3位置的图像是反的,而wavedec2变换得到的三个细节系数分别为水平方向细节系数、垂直方向细节系数和对角线方向细节系数,所以矩阵
分别对应的垂直、水平、对角线变换矩阵。
源代码如下:
- function program3
- %%
- clc
- close all
- %%
- I=imread('cameraman.tif');
- figure
- imshow(I)
- I=double(I);
- A1=[1 1;1 1]*0.5;
- I1=process(I,A1);
- A2=[1 -1;1 -1]*0.5;
- I2=process(I,A2);
- A3=[1 1;-1 -1]*0.5;
- I3=process(I,A3);
- A4=[1 -1;-1 1]*0.5;
- I4=process(I,A4);
- I_pro=[I1,I2;I3,I4];
- figure
- imshow(mat2gray(I_pro));
- % 小波变换
- [c,s] = wavedec2(I,1,'db1');
- app = appcoef2(c,s,'db1',1);
- [chd1,cvd1,cdd1] = detcoef2('all',c,s,1);
- I_wave=[app,chd1;cvd1,cdd1];
- figure
- imshow(mat2gray(I_wave));
- end
- function I1=process(I,A)
- [h,w]=size(I);
- I1=zeros(size(I)/2);
- for i=1:2:h
- for j=1:2:w
- I1((i+1)/2,(j+1)/2)=sum(dot(I(i:i+1,j:j+1),A)); % 同理sum(sum(I(i:i+1,j:j+1).*A));
- end
- end
- end
复制代码
转自:http://blog.sina.com.cn/s/blog_6163bdeb0100ncw7.html
|