www.gusucode.com > wavelet工具箱matlab源码程序 > wavelet/wavelet/wfusmat.m

    function [C,D] = wfusmat(A,B,method)
%WFUSMAT Fusion of two matrices or arrays.
%   C = WFUSMAT(A,B,METHOD) returns the fusioned matrix C obtained
%   from the matrices A and B using the fusion method defined by METHOD.
%
%   A, B and C must be of same size.
%   If A and B represent indexed images, then they are m-by-n matrices.
%   If A and B represent truecolor images, then they are m-by-n-by-3
%   arrays.
%
%   Available fusion methods are:
%
%   - simple ones, METHOD is
%         - 'max'  : D = abs(A) >= abs(B) ; C = A(D) + B(~D)
%         - 'min'  : D = abs(A) <= abs(B) ; C = A(D) + B(~D)
%         - 'mean' : C = (A+B)/2 ; D = ones(size(A))
%         - 'rand' : C = A(D) + B(~D); D is a boolean random matrix
%         - 'img1' : C = A
%         - 'img2' : C = B
%
%   - parameter-dependent ones, METHOD is of the following form 
%     METHOD = struct('name',nameMETH,'param',paramMETH) where nameMETH
%     can be:
%         - 'linear'    : C = A*paramMETH + B*(1-paramMETH) 
%                             where 0 <= paramMETH <= 1   
%         - 'UD_fusion' : Up-Down fusion, with paramMETH >= 0  
%                         x = linspace(0,1,size(A,1));
%                         P = x.^paramMETH;
%                         Then each row of C is computed with:
%                         C(i,:) = A(i,:)*(1-P(i)) + B(i,:)*P(i);
%                         So C(1,:)= A(1,:) and C(end,:)= A(end,:) 
%         - 'DU_fusion' : Down-Up fusion
%         - 'LR_fusion' : Left-Right fusion (columnwise fusion)
%         - 'RL_fusion' : Right-Left fusion (columnwise fusion)
%         - 'userDEF'   : paramMETH is a string 'userFUNCTION' containing
%                         a function name such that:
%                         C = userFUNCTION(A,B).
%
%   In addition, [C,D] = WFUSMAT(A,B,METHOD) returns the boolean
%   matrix D when defined or an empty matrix otherwise.

%   M. Misiti, Y. Misiti, G. Oppenheim, J.M. Poggi 13-Jan-2003.
%   Last Revision: 02-Apr-2008.
%   Copyright 1995-2008 The MathWorks, Inc.

if ischar(method)
    method = struct('name',method);
end
methName = method.name;
D = [];
switch lower(methName)
    case 'mean'
        C = 0.5*(A+B);
        D = ones(size(A));
        
    case 'max' 
        D = abs(A)>=abs(B);
        C = A.*D + B.*(~D);
        
    case 'min' 
        D = abs(A)<=abs(B); 
        C = A.*D + B.*(~D);
        
    case 'linear' 
        t = method.param;
        C = t*A + (1-t)*B;
        D = ones(size(A));
        
    case 'rand' , 
        R = rand(size(A)); 
        C = zeros(size(A));
        D = (R<0.5);
        C(D)  = A(D);
        C(~D) = B(~D);
 
    case 'ud_fusion' , 
        try
            t = method.param;
        catch ME  %#ok<NASGU>
            t = 1;
        end
        S = size(A);
        x  = linspace(0,1,S(1));
        P = zeros(S);
        for i = 1:S(1) , P(i,:) = x(i); end
        if t~=1 , P = P.^t; end
        C = A.*(1-P) + B.*P;
        D = [];

    case 'du_fusion' , 
        try
            t = method.param;
        catch ME  %#ok<NASGU>
            t = 1;
        end
        S = size(A);
        x  = linspace(0,1,S(1));
        P = zeros(S);
        for i = 1:S(1) , P(i,:) = x(i); end
        if t~=1 , P = P.^t; end
        C = A.*P + B.*(1-P);
        D = [];

    case 'lr_fusion' , 
        try
            t = method.param;
        catch ME  %#ok<NASGU>
            t = 1;
        end    
        S = size(A);
        x  = linspace(0,1,S(2));
        P = zeros(S);
        for i = 1:S(1) , P(:,i,:) = x(i); end
        if t~=1 , P = P.^t; end
        C = A.*(1-P) + B.*P;
        D = [];

    case 'rl_fusion' , 
        try
            t = method.param;
        catch ME  %#ok<NASGU>
            t = 1;
        end
        S = size(A);
        x  = linspace(0,1,S(2));
        P = zeros(S);
        for i = 1:S(1) , P(:,i,:) = x(i); end
        if t~=1 , P = P.^t; end
        C = A.*P + B.*(1-P);
        D = [];
    %--------------------------------------------------------------%       
    case {'img1','mat1'} , C = A;
    case {'img2','mat2'} , C = B;
    %--------------------------------------------------------------%
    case {'userdef'}
        C = feval(method.param,A,B);
        D = [];
    %--------------------------------------------------------------%
    case 'manual'
        D = t;  %#ok<NODEF>
        C(D) = A(D); C(~D) = B(~D);
    %--------------------------------------------------------------%
    case 'tril' ,
        try
            t = method.param;
        catch ME  %#ok<NASGU>
            t = 1;
        end            
        D = logical(tril(ones(size(A)))); 
        C(D)  = t*A(D)+(1-t)*B(D);
        C(~D) = t*B(~D)+(1-t)*A(~D);
    case 'triu' ,
        try
            t = method.param;
        catch ME  %#ok<NASGU>
            t = 1;
        end
        D = logical(triu(ones(size(A)))) ; 
        C(D)  = t*A(D)+(1-t)*B(D);
        C(~D) = t*B(~D)+(1-t)*A(~D);
    %--------------------------------------------------------------%     
    case 'funny_1',
        try
            t = method.param;
        catch ME  %#ok<NASGU>
            t = 0.1;
        end
        sA = size(A); 
        mA = floor(sA/2);
        D = true(size(A));
        jmax = 0;
        for i = mA(1):sA(1)
            jmax = min([jmax + 1,mA(2)-1]);
            for j = 1:jmax
                D(i,mA(2)-j:mA(2)+j) = 0;
            end
        end
        C = A; C(D) = A(D); 
        C(~D) = t*A(~D) + (1-t)*B(~D);
        
    case 'funny_2' ,
        try
            t = method.param;
        catch ME  %#ok<NASGU>
            t = 0.1;
        end
        D = ones(size(A));
        sA = size(A);
        x  = linspace(0,1,sA(1));
        P = zeros(size(A));
        for i = 1:sA(1)
            P(i,:) = x(i);
        end
        if t~=1 , P = P.^t; end
        C = A.*(1-P) + B.*P;
        
    case 'funny_3' ,
        try
            t = method.param;
        catch ME  %#ok<NASGU>
            t = 0.1;
        end
        D = ones(size(A));
        sA = size(A);
        sA2 = sA(2)/2;
        y  = linspace(0,1,sA2);
        P = zeros(size(A));
        for i = 1:sA2
            P(:,sA2+i)   = y(i);
            P(:,sA2-i+1) = y(i);
        end
        if t>0 , P = 1-P; end
        C = A.*(1-P) + B.*P;  
    %--------------------------------------------------------------%
end