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

波变换

开发平台:

Matlab

  1. function varargout = iswt2(varargin)
  2. %ISWT2 Inverse discrete stationary wavelet transform 2-D.
  3. %   ISWT2 performs a multilevel 2-D stationary wavelet 
  4. %   reconstruction using either a specific orthogonal wavelet  
  5. %   ('wname', see WFILTERS for more information) or specific
  6. %   reconstruction filters (Lo_R and Hi_R).
  7. %
  8. %   X = ISWT2(SWC,'wname') or X = ISWT2(A,H,V,D,'wname') 
  9. %   or X = ISWT2(A(:,:,end),H,V,D,'wname') reconstructs the 
  10. %   matrix X, based on the multilevel stationary wavelet   
  11. %   decomposition structure SWC or [A,H,V,D] (see SWT2).
  12. %
  13. %   For X = ISWT2(SWC,Lo_R,Hi_R) or X = ISWT2(A,H,V,D,Lo_R,Hi_R) 
  14. %   or X = ISWT2(A(:,:,end),H,V,D,Lo_R,Hi_R): 
  15. %   Lo_R is the reconstruction low-pass filter.
  16. %   Hi_R is the reconstruction high-pass filter.
  17. %
  18. %   See also IDWT2, SWT2, WAVEREC2.
  19. %   M. Misiti, Y. Misiti, G. Oppenheim, J.M. Poggi 08-Dec-97.
  20. %   Last Revision: 14-May-2003.
  21. %   Copyright 1995-2004 The MathWorks, Inc.
  22. %   $Revision: 1.5.4.2 $  $Date: 2004/03/15 22:40:55 $
  23. % Check arguments.
  24. nbIn = nargin;
  25. switch nbIn
  26.   case {0,1} , error('Not enough input arguments.');
  27.   case 4     , error('Invalid number of input arguments.');
  28.   case {2,3,5,6} , 
  29.   otherwise , error('Too many input arguments.');
  30. end
  31. switch nbIn
  32.     case 2 , argstr = 1; argnum = 2;
  33.     case 3 , argstr = 0; argnum = 2;
  34.     case 5 , argstr = 1; argnum = 5;
  35.     case 6 , argstr = 0; argnum = 5;
  36. end
  37. % Compute decomposition filters.
  38. if argstr
  39.     [lo_R,hi_R] = wfilters(varargin{argnum},'r');
  40. else
  41.     lo_R = varargin{argnum}; hi_R = varargin{argnum+1};
  42. end
  43. % Set DWT_Mode to 'per'.
  44. old_modeDWT = dwtmode('status','nodisp');
  45. modeDWT = 'per';
  46. dwtmode(modeDWT,'nodisp');
  47. % Get inputs.
  48. if argnum==2
  49.     p = size(varargin{1},3);
  50.     if rem(p,3)==1 , n = (p-1)/3;
  51.     else
  52.         errargt(mfilename,'Invalid size for the first argument!','msg');
  53.         error('*');
  54.     end
  55.     h = varargin{1}(:,:,1:n);
  56.     v = varargin{1}(:,:,n+1:2*n);
  57.     d = varargin{1}(:,:,2*n+1:3*n);
  58.     a = varargin{1}(:,:,3*n+1:p);
  59. else
  60.     a = varargin{1};
  61.     h = varargin{2};
  62.     v = varargin{3};
  63.     d = varargin{4};
  64. end
  65. a = a(:,:,size(a,3));
  66. [rx,cx,n] = size(h);
  67. for k = n:-1:1
  68.     step = 2^(k-1);
  69.     last = step;
  70.     for first = 1:last
  71.         iRow = first:step:rx;
  72.         lR   = length(iRow);
  73.         iCol = first:step:cx;
  74.         lC   = length(iCol);
  75.  
  76.         sR   = iRow(1:2:lR);
  77.         sC   = iCol(1:2:lC);
  78.         x1   = idwt2LOC(a(sR,sC),h(sR,sC,k),v(sR,sC,k),d(sR,sC,k), ...
  79.                      lo_R,hi_R,[lR lC],[0,0]);
  80.         sR   = iRow(2:2:lR);
  81.         sC   = iCol(2:2:lC);
  82.         x2   = idwt2LOC(a(sR,sC),h(sR,sC,k),v(sR,sC,k),d(sR,sC,k), ...
  83.                      lo_R,hi_R,[lR lC],[-1,-1]);
  84.         a(iRow,iCol) = 0.5*(x1+x2);
  85.     end
  86. end
  87. varargout{1} = a;
  88. % Restore DWT_Mode.
  89. dwtmode(old_modeDWT,'nodisp');
  90. %===============================================================%
  91. % INTERNAL FUNCTIONS
  92. %===============================================================%
  93. function y = idwt2LOC(a,h,v,d,lo_R,hi_R,sy,shift)
  94. y = upconvLOC(a,lo_R,lo_R,sy)+ ... % Approximation.
  95.     upconvLOC(h,hi_R,lo_R,sy)+ ... % Horizontal Detail.
  96.     upconvLOC(v,lo_R,hi_R,sy)+ ... % Vertical Detail.
  97.     upconvLOC(d,hi_R,hi_R,sy);     % Diagonal Detail.
  98. if shift(1)==-1 , y = y([end,1:end-1],:); end
  99. if shift(2)==-1 , y = y(:,[end,1:end-1]); end
  100. %---------------------------------------------------------------%
  101. function y = upconvLOC(x,f1,f2,s)
  102. lf = length(f1);
  103. y  = dyadup(x,'mat',0,1);
  104. y  = wextend('2D','per',y,[lf/2,lf/2]);
  105. y  = wconv2('col',y,f1);
  106. y  = wconv2('row',y,f2);
  107. y  = wkeep2(y,s,[lf lf]);
  108. %===============================================================%