kppww 发表于 2016-6-1 15:29

图像小波变换及其内部实现

  在 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]
查看完整版本: 图像小波变换及其内部实现