图像小波变换及其内部实现
在 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=*0.5;
I1=process(I,A1);
A2=*0.5;
I2=process(I,A2);
A3=*0.5;
I3=process(I,A3);
A4=*0.5;
I4=process(I,A4);
I_pro=;
figure
imshow(mat2gray(I_pro));
% 小波变换
= wavedec2(I,1,'db1');
app = appcoef2(c,s,'db1',1);
= detcoef2('all',c,s,1);
I_wave=;
figure
imshow(mat2gray(I_wave));
end
function I1=process(I,A)
=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
页:
[1]