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

波变换

开发平台:

Matlab

  1. function varargout = wfusimg(varargin)
  2. %WFUSIMG Fusion of two images.
  3. %   XFUS = WFUSIMG(X1,X2,WNAME,LEVEL,AFUSMETH,DFUSMETH) returns the fusioned
  4. %   image XFUS obtained by fusion of the two original images X1 and X2.
  5. %   Each fusion method, defined by AFUSMETH and DFUSMETH, merges in a specific
  6. %   way datailed below, the decompositions of X1 and X2, at level LEVEL 
  7. %   and using wavelet WNAME.
  8. %
  9. %   Matrices X1 and X2 must be of same size and are supposed to be associated
  10. %   to indexed images on a common colormap (see WEXTEND to resize images).
  11. %
  12. %   AFUSMETH and DFUSMETH define the fusion method for approximations and
  13. %   details respectively.
  14. %
  15. %   [XFUS,TXFUS,TX1,TX2] = WFUSIMG(X1,X2,WNAME,LEVEL,AFUSMETH,DFUSMETH) 
  16. %   returns in addition to matrix XFUS, three objects of the class WDECTREE
  17. %   associated with XFUS, X1 and X2 respectively (see @WDECTREE).
  18. %
  19. %   WFUSIMG(X1,X2,WNAME,LEVEL,AFUSMETH,DFUSMETH,FLAGPLOT) plots in addition  
  20. %   the objects TXFUS,TX1,TX2.
  21. %
  22. %   In the sequel Fusmeth denotes AFUSMETH or DFUSMETH. Available fusion
  23. %   methods are:
  24. %
  25. %    - simple ones, Fusmeth can be 'max', 'min', 'mean', 'img1', 'img2' or 
  26. %      'rand' which merges the two approximations or details structures
  27. %      obtained from X1 and X2 elementwise by taking the maximum, the minimum,
  28. %      the mean, the first element, the second element or a randomly chosen 
  29. %      element;
  30. %
  31. %    - parameter-dependent ones, Fusmeth is of the following form 
  32. %      Fusmeth = struct('name',nameMETH,'param',paramMETH) where nameMETH
  33. %      can be:
  34. %         - 'linear'
  35. %         - 'UD_fusion' : Up-Down fusion  
  36. %         - 'DU_fusion' : Down-Up fusion
  37. %         - 'LR_fusion' : Left-Right fusion 
  38. %         - 'RL_fusion' : Right-Left fusion
  39. %         - 'UserDEF'   : User defined fusion
  40. %   For the description of these options and the corresponding parameter
  41. %   paramMETH, see WFUSMAT.
  42. %
  43. %   Example:
  44. %    load mask; X1 = X;
  45. %    load bust; X2 = X;
  46. %    [XFUS,TXFUS,TX1,TX2] = wfusimg(X1,X2,'db2',5,'max','max','plot'); 
  47. %     
  48. %   M. Misiti, Y. Misiti, G. Oppenheim, J.M. Poggi 13-Jan-2003.
  49. %   Last Revision: 18-Jul-2003.
  50. %   Copyright 1995-2004 The MathWorks, Inc.
  51. %   $Revision: 1.1.6.2 $  $Date: 2004/03/15 22:42:52 $ 
  52. % Syntax 2:
  53. % ---------
  54. %  VARARGOUT = WFUSIMG('PropName1',PropValue1,'PropName2',PropValue2,...)
  55. %
  56. %  The valid PropNames are: 
  57. %     'X1' , 'X2' , 'wname' , 'level' , 'flagPlot' and
  58. %     'AfusMeth' : method of fusion for approximation
  59. %     'DfusMeth' : method of fusion for details
  60. %
  61. %    'X1' and 'X2' are required fields.
  62. %
  63. % The default values are:
  64. %    wname_DEF     = 'db1';
  65. %    level_DEF     = 2;
  66. %    AfusMeth_DEF  = struct('name','linear','param',0.5);
  67. %    DfusMeth_DEF  = struct('name','linear','param',0.5);
  68. %    flagPlot_DEF  = 'plot';
  69. %
  70. % To avoid plots you can set 'flagPlot' to 'noplot'
  71. %
  72. % -----------------------------------------------------------------------
  73. % Examples:
  74. % ---------
  75. %    load mask; X1 = X;
  76. %    load bust; X2 = X;
  77. %    wfusimg('X1',X1,'X2',X2,'wname','db3','level',2);
  78. %    [X,t,t1,t2] = wfusimg('X1',X1,'X2',X2,'AfusMeth','max');
  79. % Check arguments.
  80. %-----------------
  81. nbIN     = nargin;
  82. stdINPUT = true;
  83. if nbIN>0 , stdINPUT = ~ischar(varargin{1}); end
  84. if stdINPUT
  85.     if nbIN < 6
  86.         error('Not enough input arguments.');
  87.     elseif nbIN > 7
  88.         error('Too many input arguments.');
  89.     end
  90.     X1 = varargin{1}; 
  91.     X2 = varargin{2};
  92.     wname = varargin{3};
  93.     level = varargin{4};
  94.     AfusMeth = varargin{5};
  95.     DfusMeth = varargin{6};
  96.     if nargin>6
  97.         if strcmp(lower(varargin{7}),'plot')
  98.             flagPlot = true; 
  99.         else
  100.             flagPlot = false;
  101.         end
  102.     else
  103.             flagPlot = false;
  104.     end
  105. else
  106.     % Defaults.
  107.     %----------
  108.     wname_DEF    = 'db1';
  109.     level_DEF    = 2;
  110.     fusMeth_DEF  = struct('name','linear','param',0.5);
  111.     flagPlot_DEF = true;
  112.     %--------------------------------------------------
  113.     wname = wname_DEF;
  114.     level = level_DEF;
  115.     AfusMeth = fusMeth_DEF;
  116.     DfusMeth = fusMeth_DEF;
  117.     flagPlot = flagPlot_DEF;
  118.     %--------------------------------------------------
  119.     k    = 1;
  120.     while k<=nbIN
  121.         switch varargin{k}
  122.             case 'X1'       , X1       = varargin{k+1};
  123.             case 'X2'       , X2       = varargin{k+1};
  124.             case 'wname'    , wname    = varargin{k+1};
  125.             case 'level'    , level    = varargin{k+1};
  126.             case 'AfusMeth' , AfusMeth = varargin{k+1};
  127.             case 'DfusMeth' , DfusMeth = varargin{k+1};    
  128.             case 'flagPlot' , flagPlot = varargin{k+1};
  129.             otherwise
  130.                 error('Invalid input arguments.');
  131.         end
  132.         k = k+2;
  133.     end
  134.     if isempty(X1) || isempty(X2)
  135.         error('Both images X1 and X2 must be given.');
  136.     end
  137.     if isempty(wname)    , wname = wname_DEF;  end
  138.     if isempty(level)    , level = level_DEF;  end
  139.     if isempty(AfusMeth)  , AfusMeth = fusMeth_DEF;  end
  140.     if isempty(DfusMeth)  , DfusMeth = fusMeth_DEF;  end
  141.     if strcmp(flagPlot,'noplot') || isempty(flagPlot)
  142.         flagPlot = false;
  143.     end
  144.     if ischar(X1) , dummy = load(X1); X1 = dummy.X; end
  145.     if ischar(X2) , dummy = load(X2); X2 = dummy.X; end
  146. end
  147. %--------------------------------------------------
  148. if sum(size(X1)==size(X2))~=2
  149.     error('Input images must be of the same size.');
  150. end
  151. % Decomposition.
  152. %---------------
  153. tIMG1 = wfustree(X1,level,wname);
  154. clear X1
  155. tIMG2 = wfustree(X2,level,wname);
  156. clear X2
  157. % Fusion.
  158. %--------
  159. [XFus,tFus] = wfusdec(tIMG1,tIMG2,AfusMeth,DfusMeth);
  160. % Plot trees.
  161. %------------
  162. if flagPlot
  163.     plot(tIMG1); plot(tIMG2); plot(tFus);
  164. end
  165. % Outputs
  166. %--------
  167. switch nargout
  168.     case 0 ,
  169.     case {1,2} , varargout = {XFus , tFus};
  170.     otherwise  , varargout = {XFus , tFus, tIMG1,tIMG2};
  171. end