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

波变换

开发平台:

Matlab

  1. function [C,D] = wfusmat(A,B,method)
  2. %WFUSMAT Fusion of two matrices or arrays.
  3. %   C = WFUSMAT(A,B,METHOD) returns the fusioned matrix C obtained
  4. %   from the matrices A and B using the fusion method defined by METHOD.
  5. %
  6. %   The matrices A and B must be of same size. The output matrix C
  7. %   is of the same size as A and B.
  8. %
  9. %   Available fusion methods are:
  10. %
  11. %   - simple ones, METHOD is
  12. %         - 'max'  : D = abs(A) >= abs(B) ; C = A(D) + B(~D)
  13. %         - 'min'  : D = abs(A) <= abs(B) ; C = A(D) + B(~D)
  14. %         - 'mean' : C = (A+B)/2 ; D = ones(size(A))
  15. %         - 'rand' : C = A(D) + B(~D); D is a boolean random matrix
  16. %         - 'img1' : C = A
  17. %         - 'img2' : C = B
  18. %
  19. %   - parameter-dependent ones, METHOD is of the following form 
  20. %     METHOD = struct('name',nameMETH,'param',paramMETH) where nameMETH
  21. %     can be:
  22. %         - 'linear'    : C = A*paramMETH + B*(1-paramMETH) 
  23. %                             where 0 <= paramMETH <= 1   
  24. %         - 'UD_fusion' : Up-Down fusion, with paramMETH >= 0  
  25. %                         x = linspace(0,1,size(A,1));
  26. %                         P = x.^paramMETH;
  27. %                         Then each row of C is computed with:
  28. %                         C(i,:) = A(i,:)*(1-P(i)) + B(i,:)*P(i);
  29. %                         So C(1,:)= A(1,:) and C(end,:)= A(end,:) 
  30. %         - 'DU_fusion' : Down-Up fusion
  31. %         - 'LR_fusion' : Left-Right fusion (columnwise fusion)
  32. %         - 'RL_fusion' : Right-Left fusion (columnwise fusion)
  33. %         - 'userDEF'   : paramMETH is a string 'userFUNCTION' containing
  34. %                         a function name such that:
  35. %                         C = userFUNCTION(A,B).
  36. %
  37. %   In addition, [C,D] = WFUSMAT(A,B,METHOD) returns the boolean
  38. %   matrix D when defined or an empty matrix otherwise.
  39. %   M. Misiti, Y. Misiti, G. Oppenheim, J.M. Poggi 13-Jan-2003.
  40. %   Last Revision: 15-Jul-2003.
  41. %   Copyright 1995-2004 The MathWorks, Inc.
  42. %   $Revision: 1.1.6.2 $  $Date: 2004/03/15 22:42:53 $ 
  43. if ischar(method)
  44.     method.name = method;
  45. end
  46. methName = method.name;
  47. D = [];
  48. switch lower(methName)
  49.     case 'mean'
  50.         C = 0.5*(A+B);
  51.         D = ones(size(A));
  52.         
  53.     case 'max' 
  54.         D = abs(A)>=abs(B);
  55.         C = A.*D + B.*(~D);
  56.         
  57.     case 'min' 
  58.         D = abs(A)<=abs(B); 
  59.         C = A.*D + B.*(~D);
  60.         
  61.     case 'linear' 
  62.         t = method.param;
  63.         C = t*A + (1-t)*B;
  64.         D = ones(size(A));
  65.         
  66.     case 'rand' , 
  67.         R = rand(size(A)); 
  68.         C = zeros(size(A));
  69.         D = (R<0.5);
  70.         C(D)  = A(D);
  71.         C(~D) = B(~D);
  72.  
  73.     case 'ud_fusion' , 
  74.         try , t = method.param; catch , t = 1; end
  75.         S = size(A);
  76.         x  = linspace(0,1,S(1));
  77.         P = zeros(S);
  78.         for i = 1:S(1) , P(i,:) = x(i); end
  79.         if t~=1 , P = P.^t; end
  80.         C = A.*(1-P) + B.*P;
  81.         D = [];
  82.     case 'du_fusion' , 
  83.         try , t = method.param; catch , t = 1; end    
  84.         S = size(A);
  85.         x  = linspace(0,1,S(1));
  86.         P = zeros(S);
  87.         for i = 1:S(1) , P(i,:) = x(i); end
  88.         if t~=1 , P = P.^t; end
  89.         C = A.*P + B.*(1-P);
  90.         D = [];
  91.     case 'lr_fusion' , 
  92.         try , t = method.param; catch , t = 1; end    
  93.         S = size(A);
  94.         x  = linspace(0,1,S(2));
  95.         P = zeros(S);
  96.         for i = 1:S(1) , P(:,i) = x(i); end
  97.         if t~=1 , P = P.^t; end
  98.         C = A.*(1-P) + B.*P;
  99.         D = [];
  100.     case 'rl_fusion' , 
  101.         try , t = method.param; catch , t = 1; end    
  102.         S = size(A);
  103.         x  = linspace(0,1,S(2));
  104.         P = zeros(S);
  105.         for i = 1:S(1) , P(:,i) = x(i); end
  106.         if t~=1 , P = P.^t; end
  107.         C = A.*P + B.*(1-P);
  108.         D = [];
  109.     %--------------------------------------------------------------%       
  110.     case {'img1','mat1'} , C = A;
  111.     case {'img2','mat2'} , C = B;
  112.     %--------------------------------------------------------------%
  113.     case {'userdef'}
  114.         C = feval(method.param,A,B);
  115.         D = [];
  116.     %--------------------------------------------------------------%
  117.     case 'manual'
  118.         D = t; 
  119.         C(D) = A(D); C(~D) = B(~D);
  120.     %--------------------------------------------------------------%
  121.     case 'tril' ,
  122.         try , t = method.param; catch , t = 1; end            
  123.         D = logical(tril(ones(size(A)))); 
  124.         C(D)  = t*A(D)+(1-t)*B(D);
  125.         C(~D) = t*B(~D)+(1-t)*A(~D);
  126.     case 'triu' ,
  127.         try , t = method.param; catch , t = 1; end            
  128.         D = logical(triu(ones(size(A)))) ; 
  129.         C(D)  = t*A(D)+(1-t)*B(D);
  130.         C(~D) = t*B(~D)+(1-t)*A(~D);
  131.     %--------------------------------------------------------------%     
  132.     case 'funny_1',
  133.         try , t = method.param; catch , t = 0.1; end
  134.         sA = size(A); 
  135.         mA = floor(sA/2);
  136.         D = logical(ones(size(A)));
  137.         jmax = 0;
  138.         for i = mA(1):sA(1)
  139.             jmax = min([jmax + 1,mA(2)-1]);
  140.             for j = 1:jmax
  141.                 D(i,mA(2)-j:mA(2)+j) = 0;
  142.             end
  143.         end
  144.         C = A; C(D) = A(D); 
  145.         C(~D) = t*A(~D) + (1-t)*B(~D);
  146.         
  147.     case 'funny_2' ,
  148.         try , t = method.param; catch , t = 0.1; end
  149.         D = ones(size(A));
  150.         sA = size(A);
  151.         x  = linspace(0,1,sA(1));
  152.         P = zeros(size(A));
  153.         jmax = 0;
  154.         for i = 1:sA(1)
  155.             P(i,:) = x(i);
  156.         end
  157.         if t~=1 , P = P.^t; end
  158.         C = A.*(1-P) + B.*P;
  159.         
  160.     case 'funny_3' ,
  161.         try , t = method.param; catch , t = 0.1; end
  162.         D = ones(size(A));
  163.         sA = size(A);
  164.         sA2 = sA(2)/2;
  165.         y  = linspace(0,1,sA2);
  166.         P = zeros(size(A));
  167.         jmax = 0;
  168.         for i = 1:sA2
  169.             P(:,sA2+i)   = y(i);
  170.             P(:,sA2-i+1) = y(i);
  171.         end
  172.         if t>0 , P = 1-P; end
  173.         C = A.*(1-P) + B.*P;  
  174.     %--------------------------------------------------------------%
  175. end