swt2.m
上传用户:haiyisale
上传日期:2013-01-09
资源大小:3246k
文件大小:3k
源码类别:

波变换

开发平台:

Matlab

  1. function varargout = swt2(x,n,varargin)
  2. %SWT2 Discrete stationary wavelet transform 2-D.
  3. %   SWT2 performs a multilevel 2-D stationary wavelet analysis
  4. %   using either a specific orthogonal wavelet ('wname' see 
  5. %   WFILTERS for more information) or specific orthogonal wavelet 
  6. %   decomposition filters.
  7. %
  8. %   SWC = SWT2(X,N,'wname') or [A,H,V,D] = SWT2(X,N,'wname') 
  9. %   compute the stationary wavelet decomposition of the 
  10. %   matrix X at level N, using 'wname'.
  11. %   N must be a strictly positive integer (see WMAXLEV for more
  12. %   information). 2^N must divide size(X,1) and size(X,2).
  13. %
  14. %   Outputs [A,H,V,D] are 3-D Arrays which contain the 
  15. %   coefficients: for 1 <= i <= N,
  16. %   A(:,:,i) contains the coefficients of approximation 
  17. %   of level i. 
  18. %   H(:,:,i), V(:,:,i) and D(:,:,i) contain the coefficients 
  19. %   of details of level i, (Horiz., Vert., Diag.). 
  20. %   SWC = [H(:,:,1:N) ; V(:,:,1:N); D(:,:,1:N); A(:,:,N)].
  21. %
  22. %   SWC = SWT2(X,N,Lo_D,Hi_D) or  [A,H,V,D] = SWT2(X,N,Lo_D,Hi_D)
  23. %   compute the stationary wavelet decomposition as above,
  24. %   given these filters as input: 
  25. %     Lo_D is the decomposition low-pass filter and
  26. %     Hi_D is the decomposition high-pass filter.
  27. %     Lo_D and Hi_D must be the same length.
  28. %
  29. %   See also DWT2, WAVEDEC2.
  30. %   M. Misiti, Y. Misiti, G. Oppenheim, J.M. Poggi 02-Oct-95.
  31. %   Last Revision: 14-May-2003.
  32. %   Copyright 1995-2004 The MathWorks, Inc.
  33. %   $Revision: 1.6.4.2 $  $Date: 2004/03/15 22:41:48 $
  34. % Check arguments.
  35. nbIn = nargin;
  36. if nbIn < 3
  37.   error('Not enough input arguments.');
  38. elseif nbIn > 4
  39.   error('Too many input arguments.');
  40. end
  41. if errargt(mfilename,n,'int'), error('*'), end
  42. % Preserve initial size.
  43. s = size(x);
  44. pow = 2^n;
  45. if any(rem(s,pow))
  46.     sOK = ceil(s/pow)*pow;
  47.     oriStr = ['(' int2str(s(1))   ',' int2str(s(2)) ')'];
  48.     sugStr = ['(' int2str(sOK(1)) ',' int2str(sOK(2)) ')'];
  49.     msg = strvcat(...
  50.         ['The level of decomposition ' int2str(n)],...
  51.         ['and the size of the image ' oriStr],...
  52.         'are not compatible.',...
  53.         ['Suggested size: ' sugStr],...
  54.         '(see Image Extension Tool)', ...
  55.         ' ', ...
  56.         ['2^Level has to divide the size of the image.'] ...
  57.             );
  58.     errargt(mfilename,msg,'msg');
  59.     varargout = {[] };
  60.     return
  61. end        
  62. % Compute decomposition filters.
  63. if ischar(varargin{1})
  64.     [lo,hi] = wfilters(varargin{1},'d');
  65. else
  66.     lo = varargin{1};   hi = varargin{2};
  67. end
  68. % Set DWT_Mode to 'per'.
  69. old_modeDWT = dwtmode('status','nodisp');
  70. modeDWT = 'per';
  71. dwtmode(modeDWT,'nodisp');
  72. % Compute stationary wavelet coefficients.
  73. evenoddVal = 0;
  74. evenLEN    = 1;
  75. a = zeros(s(1),s(2),n);
  76. h = zeros(s(1),s(2),n);
  77. v = zeros(s(1),s(2),n);
  78. d = zeros(s(1),s(2),n);
  79. for k = 1:n
  80.     % Extension.
  81.     lf = length(lo);
  82.     x  = wextend('2D',modeDWT,x,[lf/2,lf/2]);
  83.     % Decomposition.
  84.     y = wconv2('row',x,lo);    
  85.     a(:,:,k) = wkeep2(wconv2('col',y,lo),s,[lf+1,lf+1]);
  86.     h(:,:,k) = wkeep2(wconv2('col',y,hi),s,[lf+1,lf+1]);
  87.     y = wconv2('row',x,hi);
  88.     v(:,:,k) = wkeep2(wconv2('col',y,lo),s,[lf+1,lf+1]);
  89.     d(:,:,k) = wkeep2(wconv2('col',y,hi),s,[lf+1,lf+1]);
  90.     % upsample filters.
  91.     lo = dyadup(lo,evenoddVal,evenLEN);
  92.     hi = dyadup(hi,evenoddVal,evenLEN);
  93.     % New value of x.
  94.     x = a(:,:,k);
  95. end
  96. if nargout==4
  97.     varargout = {a,h,v,d};
  98. elseif nargout==1
  99.     varargout{1} = cat(3,h,v,d,a(:,:,n));   
  100. end
  101. % Restore DWT_Mode.
  102. dwtmode(old_modeDWT,'nodisp');