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

    function varargout = sw2dtool(option,varargin)
%SW2DTOOL Stationary Wavelet Transform 2-D tool.
%   VARARGOUT = SW2DTOOL(OPTION,VARARGIN)

%   M. Misiti, Y. Misiti, G. Oppenheim, J.M. Poggi 02-Mar-1998.
%   Last Revision: 10-Jun-2013.
%   Copyright 1995-2013 The MathWorks, Inc.
%   $Revision: 1.9.4.25 $  $Date: 2013/07/05 04:30:25 $

% Test inputs.
%-------------
if nargin==0 , option = 'create'; end
[option,winAttrb] = utguidiv('ini',option,varargin{:});

% Default values.
%----------------
max_lev_anal = 5;
def_lev_anal = 5;
def_nbcolors = 255;
str_dir_det  = ['h';'d';'v'];

% Memory Blocks of stored values.
%================================
% MB1.
%-----
n_membloc1    = 'MB_1';
ind_status    = 1;
ind_sav_menu  = 2;
ind_filename  = 3;
ind_pathname  = 4;
ind_img_name  = 5;
ind_img_t_nam = 6;
ind_NB_lev    = 7;
ind_wave      = 8;
nb1_stored    = 8;

% MB2.
%-----
n_membloc2   = 'MB_2';
ind_pus_dec  = 1;
ind_axe_hdl  = 2;
ind_txt_hdl  = 3;
ind_gra_area = 4;
nb2_stored   = 4;

% MB3.
%-----
n_membloc3 = 'MB_3';
ind_coefs  = 1;
% nb3_stored = 1;

if ~isequal(option,'create') , win_tool = varargin{1}; end
switch option
    case 'create'
        % Get Globals.
        %-------------
        [Def_Btn_Height,Y_Spacing] = ...
            mextglob('get','Def_Btn_Height','Y_Spacing');

        % Window initialization.
        %-----------------------
        win_title = getWavMSG('Wavelet:divGUIRF:SW2D_Name');
        [win_tool,pos_win,win_units,str_numwin,...
           pos_frame0,Pos_Graphic_Area] = ...
             wfigmngr('create',win_title,winAttrb,...
                'ExtFig_WTMOTION',mfilename,1,1,0);
        set(win_tool,'Tag','WIN_sw2dtool')    
        if nargout>0 , varargout{1} = win_tool; end
		
		% Add Help for Tool.
		%------------------
		wfighelp('addHelpTool',win_tool, ...
			getWavMSG('Wavelet:divGUIRF:II_D_Anal_Deno'),'SW2D_GUI');

		% Add Help Item.
		%----------------
		wfighelp('addHelpItem',win_tool, ...
            getWavMSG('Wavelet:divGUIRF:SWT'),'SWT');
		wfighelp('addHelpItem',win_tool, ...
            getWavMSG('Wavelet:commongui:HLP_AvailMeth'),'COMP_DENO_METHODS');
		wfighelp('addHelpItem',win_tool, ...
            getWavMSG('Wavelet:commongui:HLP_LoadSave'),'SW2D_LOADSAVE');

        % Menu construction for current figure.
        %--------------------------------------
        m_files = wfigmngr('getmenus',win_tool,'file');
        uimenu(m_files, ...
            'Label',getWavMSG('Wavelet:commongui:Load_Image'), ...
            'Position',1,'Tag','Load_Img', ...
            'Callback',[mfilename '(''load'',' str_numwin ');']  ...
            );
        m_save = uimenu(m_files,...
            'Label',getWavMSG('Wavelet:commongui:SavDenImg'),...
            'Position',2,'Enable','Off',  ...
            'Tag','Save_Img', ...
            'Callback',[mfilename '(''save'','  str_numwin ');'] ...
            );
        
        m_file = get(m_save,'Parent');
        pos = get(m_save,'Position');
        m_gen = uimenu(m_file,...
            'Label',getWavMSG('Wavelet:commongui:GenerateMATLABDenoise'), ...
            'Position',pos+1,              ...
            'Enable','Off',                ...
            'Separator','On',              ...
            'Tag','Generate',               ...
            'Callback',                    ...
            ['wsaveprocess(''sw2dtool'','  ...
            str_numwin ');']  ...
            );
        wtbxappdata('set',win_tool,'M_GenCode',m_gen);
        
        m_demo = uimenu(m_files, ...
            'Label',getWavMSG('Wavelet:commongui:Lab_Example'), ...
            'Tag','Examples','Position',3);
        m_demoIDX = uimenu(m_demo, ...
            'Label',getWavMSG('Wavelet:commongui:Lab_IndImg'),...
            'Tag','Ind_Img','Position',1);
        m_demoCOL = uimenu(m_demo, ...
            'Label',getWavMSG('Wavelet:commongui:Lab_ColImg'),...
            'Tag','Col_Img','Position',2);
        uimenu(m_files, ...
            'Label',getWavMSG('Wavelet:commongui:Str_ImpImg'),'Position',4, ...
            'Enable','On','Separator','On',...
            'Tag','Import', ...
            'Callback',[mfilename '(''load'',' str_numwin ',''wrks'');']  ...
            );
        m_exp_sig = uimenu(m_files, ...
            'Label',getWavMSG('Wavelet:commongui:Str_ExpImg'),'Position',5, ...
            'Enable','Off','Separator','Off',...
            'Tag','Export', ...
            'Callback',[mfilename '(''exp_wrks'',' str_numwin ');']  ...
            );
                   
        demoSET = {...
          getWavMSG('Wavelet:moreMSGRF:EX2D_Name_Nwoman')   , ...
                'noiswom'  , 'haar', 3 , '{''penallo'',46.12}' , 'BW' ; ...
          getWavMSG('Wavelet:moreMSGRF:EX2D_Name_Nwoman')   , ...
                'noiswom'  , 'haar', 5 , '{''penallo'',48.62}' , 'BW' ; ...
          getWavMSG('Wavelet:moreMSGRF:EX2D_Name_Nwoman')   , ...
                'noiswom'  , 'db3' , 4 , '{''penallo'',NaN}'   , 'BW'; ...
          getWavMSG('Wavelet:moreMSGRF:EX2D_Name_NBarb')    , ...
                'nbarb1'   , 'db1' , 4 , '{}' , 'BW'; ...
          getWavMSG('Wavelet:moreMSGRF:EX2D_Name_NSinsin')  , ...
                'noissi2d' , 'db1' , 2 , '{}' , 'BW'; ...
          getWavMSG('Wavelet:moreMSGRF:EX2D_Name_jellyfish'), ...
                'jellyfish256' , 'db1' , 3 ,  '{''penalhi'',38}' , 'COL'; ... 
          getWavMSG('Wavelet:moreMSGRF:EX2D_Name_woodsculp')    , ...
                'woodsculp256.jpg' , 'haar' , 4 , '{''penalhi'',38}' , 'COL'; ...
          getWavMSG('Wavelet:moreMSGRF:EX2D_Name_NoisArmsCOL'), ...
                'noisarms.jpg' , 'db1' , 3 ,  '{''penallo'',88}' , 'COL'; ...                 
          getWavMSG('Wavelet:moreMSGRF:EX2D_Name_NoisFlower'), ...
                'noisflower.jpg' , 'db1' , 3 ,  '{''penallo'',130}' , 'COL'; ... 
          getWavMSG('Wavelet:moreMSGRF:EX2D_Name_NoisPeppers')    , ...
                'noiswpepper.jpg' , 'haar' , 4 , '{''penalhi'',160}' , 'COL'; ...                
          };

        beg_call_str = [mfilename '(''demo'',' str_numwin ','''];
        nbDEM = size(demoSET,1);
        for k=1:nbDEM
            nam = demoSET{k,1};
            fil = demoSET{k,2};
            wav = demoSET{k,3};
            lev = int2str(demoSET{k,4});
            par = demoSET{k,5};
            optIMG = demoSET{k,6};
            libel = getWavMSG('Wavelet:divGUIRF:WT_Example',wav,lev,nam);
            action = [beg_call_str fil ''',''' wav ''',' lev ',' par ''',''' optIMG ''');'];
            if k==8 , Sep = 'On'; else Sep = 'Off';end
            if k<6 , par = m_demoIDX; else par = m_demoCOL; end 
            uimenu(par,'Label',libel,'Separator',Sep,'Callback',action);
        end

        % Begin waiting.
        %---------------
        wwaiting('msg',win_tool,getWavMSG('Wavelet:commongui:WaitInit'));

        % General parameters initialization.
        %-----------------------------------
        dy = Y_Spacing-3; %-3
        str_pus_dec = getWavMSG('Wavelet:commongui:Str_DecImg');

        % Command part of the window.
        %============================
        % Data, Wavelet and Level parameters.
        %------------------------------------
        xlocINI = pos_frame0([1 3]);
        ytopINI = pos_win(4)-dy;
        toolPos = utanapar('create',win_tool, ...
            'xloc',xlocINI,'top',ytopINI,...
            'Enable','off',        ...
            'wtype','dwt',         ...
            'deflev',def_lev_anal, ...
            'maxlev',max_lev_anal  ...
            );

        % Decompose pushbutton.
        %----------------------
        h_uic = 3*Def_Btn_Height/2;
        y_uic = toolPos(2)-h_uic-2*dy;
        w_uic = (3*pos_frame0(3))/4;
        x_uic = pos_frame0(1)+(pos_frame0(3)-w_uic)/2;
        pos_pus_dec = [x_uic, y_uic, w_uic, h_uic];
        pus_dec = uicontrol(...
            'Parent',win_tool,      ...
            'Style','pushbutton',   ...
            'Units',win_units,       ...
            'Position',pos_pus_dec, ...
            'String',str_pus_dec,   ...
            'Enable','off',         ...
            'Tag','Pus_Dec',        ...
            'Interruptible','On'    ...
            );

        % Denoising tool.
        %-----------------
        ytopTHR = pos_pus_dec(2)-4*dy;
        utthrw2d('create',win_tool, ...
            'xloc',xlocINI,'top',ytopTHR,...
            'ydir',-1, ...
            'levmax',def_lev_anal,    ...
            'levmaxMAX',max_lev_anal, ...
            'status','Off',  ...
            'toolOPT','deno' ...
            );

        % Adding colormap GUI.
        %---------------------
        briflag = (max_lev_anal<6); 
        utcolmap('create',win_tool, ...
                 'xloc',xlocINI, ...
                 'briflag',briflag, ...
                 'Enable','off');

        % Callbacks update.
        %------------------
        hdl_den = utthrw2d('handles',win_tool);
        utanapar('set_cba_num',win_tool,[m_files;hdl_den(:)]);
        pop_lev = utanapar('handles',win_tool,'lev');
        end_cba = [str_numwin ',' num2mstr(pop_lev) ');'];
        cba_pop_lev = [mfilename '(''update_level'',' end_cba];
        cba_pus_dec = [mfilename '(''decompose'','  end_cba];
        set(pop_lev,'Callback',cba_pop_lev);
        set(pus_dec,'Callback',cba_pus_dec);

        % General graphical parameters initialization.
        %--------------------------------------------
        txtfontsize = 14;

        % Axes construction parameters.
        %------------------------------
        NB_lev    = max_lev_anal;
        bdx       = 0.08*pos_win(3);
        ecy_up    = 0.06*pos_win(4);
        ecy_mid_1 = 0.08*pos_win(4);
        ecy_mid_2 = ecy_up;
        ecy_down  = ecy_up;
        ecy_det   = (0.04*pos_win(4))/1.4;
        w_gra_rem = Pos_Graphic_Area(3);
        h_gra_rem = Pos_Graphic_Area(4);
        w_left    = (w_gra_rem-3*bdx)/2;
        w_right   = w_left;
        w_medium  = w_left;
        w_detail  = (w_gra_rem-4*bdx)/3+bdx/2;
        x_left    = bdx;
        x_right   = x_left+w_left+5*bdx/4;
        x_medium  = (w_gra_rem-w_medium)/2;
        h_min     = h_gra_rem/4;
        h_max     = h_gra_rem/3;
        h_image   = (h_min*(NB_lev-1)+h_max*(max_lev_anal-NB_lev))/(max_lev_anal-1);
        h_histo   = h_gra_rem/8;
        h_gra_rem = h_gra_rem-h_histo-h_image-ecy_up-ecy_mid_1-ecy_mid_2;
        h_detail  = (h_gra_rem-ecy_down-(NB_lev-1)*ecy_det)/NB_lev;
        y_low_ini = pos_win(4);

        % Building data axes.
        %--------------------
        commonProp   = {...
           'Parent',win_tool,...
           'Visible','off',  ...
           'Units',win_units,...
           'Box','On'...
           };
        y_low_ini   = y_low_ini-h_image-ecy_up;
        pos_left    = [x_left y_low_ini w_left h_image];
        axe_left_1  = axes(commonProp{:},'Position',pos_left);
        pos_right   = [x_right y_low_ini w_right h_image];
        axe_right_1 = axes(commonProp{:},'Position',pos_right);

        y_low_ini   = y_low_ini-h_histo-ecy_mid_1;
        pos_medium  = [x_medium y_low_ini w_medium h_histo];
        axe_medium  = axes(commonProp{:},'Position',pos_medium);
        y_low_ini   = y_low_ini-ecy_mid_2+ecy_det;

        % Building histograms axes.
        %==========================
        axe_hist = zeros(3,NB_lev);
        commonProp = {commonProp{:},...
            'XTickLabelMode','manual','XTickLabel',[]}; %#ok<CCAT>

        % Building axes on the left part.
        %-------------------------------    
        txt_left = zeros(NB_lev,1);
        x_left   = bdx;
        y_left   = y_low_ini;
        pos_left = [x_left y_left w_detail h_detail];
        for j = 1:NB_lev
            k = NB_lev-j+1;
            pos_left(2) = pos_left(2)-pos_left(4)-ecy_det;
            axe_hist(1,k) = axes(commonProp{:}, ...
                                'Position',pos_left,'NextPlot','add'); %#ok<*LAXES>
            str_txt     = ['L' wnsubstr(k)];
            txt_left(k) = txtinaxe('create',str_txt, ...
                             axe_hist(1,k),'l','off','bold',txtfontsize);
        end

        % Building details axes on the middle part.
        %----------------------------------------
        x_mid   = x_left+w_detail+bdx/2;
        y_mid   = y_low_ini;
        pos_mid = [x_mid y_mid w_detail h_detail];
        for k = 1:NB_lev
            j = NB_lev-j+1;
            pos_mid(2)    = pos_mid(2)-pos_mid(4)-ecy_det;
            axe_hist(2,k) = axes(commonProp{:},'Position',pos_mid);
        end
        
        % Building details axes on the right part.
        %-----------------------------------------
        x_right   = x_mid+w_detail+bdx/2;
        y_right   = y_low_ini;
        pos_right = [x_right y_right w_detail h_detail];
        for j = 1:NB_lev
            k = NB_lev-j+1;
            pos_right(2)  = pos_right(2)-pos_right(4)-ecy_det;
            axe_hist(3,k) = axes(commonProp{:},'Position',pos_right);
        end

        %  Normalization.
        %----------------
        Pos_Graphic_Area = wfigmngr('normalize',win_tool, ...
            Pos_Graphic_Area,'On');
        drawnow

        % Memory blocks update.
        %----------------------
        axes_hdl = {axe_left_1,axe_right_1,axe_medium,axe_hist};
        utthrw2d('set',win_tool,'axes',axe_hist);
        wmemtool('ini',win_tool,n_membloc1,nb1_stored);
        wmemtool('ini',win_tool,n_membloc2,nb2_stored);
        wmemtool('wmb',win_tool,n_membloc1, ...
            ind_status,0,        ...
            ind_sav_menu,m_save  ...
            );
        wtbxappdata('set',win_tool,'m_exp_sig',m_exp_sig);
        wmemtool('wmb',win_tool,n_membloc2, ...
            ind_pus_dec,pus_dec, ...
            ind_axe_hdl,axes_hdl,...
            ind_gra_area,Pos_Graphic_Area, ...
            ind_txt_hdl,txt_left ...
            );

        % End waiting.
        %---------------
        wwaiting('off',win_tool);

    case {'load','demo'}
        % Loading file.
        %--------------
        switch option
            case 'load'
                if length(varargin)<2       % LOAD IMAGE
                    imgFileType = getimgfiletype;
                    [imgInfos,img_ori,map,ok] = ...
                        utguidiv('load_img',win_tool,imgFileType, ...
                        getWavMSG('Wavelet:commongui:Load_Image'), ...
                        def_nbcolors);
                else
                    [imgInfos,img_ori,ok] = wtbximport('2d');
                    map = pink(def_nbcolors);
                end
                
            case 'demo'
                img_Name = deblank(varargin{2});
                wav_Name = deblank(varargin{3});
                lev_Anal = varargin{4};
                par_Demo = varargin{5};
                if length(varargin)<6
                    optIMG ='';
                else
                    optIMG = varargin{6};
                end
                [~,~,ext] = fileparts(img_Name);
                if isempty(ext)
                    filename = [img_Name '.mat'];
                else
                    filename = img_Name;
                end                
                pathname = utguidiv('WTB_DemoPath',filename);
                [imgInfos,img_ori,map,ok] = utguidiv('load_dem2D',win_tool, ...
                    pathname,filename,def_nbcolors,optIMG);
        end
        if ~ok, return; end
        flagIDX = length(size(img_ori))<3;
        setfigNAME(win_tool,flagIDX)
        

        % Begin waiting.
        %---------------
        wwaiting('msg',win_tool,getWavMSG('Wavelet:commongui:WaitClean'));

        % Storing values. 
        %-----------------
        wmemtool('wmb',win_tool,n_membloc1, ...
            ind_status,0,        ...
            ind_filename,imgInfos.filename,  ...
            ind_pathname,imgInfos.pathname,  ...
            ind_img_name,imgInfos.name,      ...
            ind_img_t_nam,imgInfos.true_name ...
            );

        % Cleaning and setting GUI. 
        %--------------------------
        cbanapar('Enable',win_tool,'Off');
        dynvtool('stop',win_tool);
        ax_hdl  = wmemtool('rmb',win_tool,n_membloc2,ind_axe_hdl);
        ax_hdl  = [ax_hdl{1:3},ax_hdl{4}(:)'];
        obj2del = [findobj(ax_hdl,'Type','line');  ...
                   findobj(ax_hdl,'Type','patch'); ...
                   findobj(ax_hdl,'Type','image')];
        delete(obj2del)
        utthrw2d('clean_thr',win_tool);

        % Setting analysis  & GUI values.
        %--------------------------------
        levm   = wmaxlev(imgInfos.size(1:2),'haar');
        levmax = min(levm,max_lev_anal);
        if isequal(imgInfos.true_name,'X')
            img_Name = imgInfos.name;
        else
            img_Name = imgInfos.true_name;
        end
        if isequal(option,'demo')
            anaPar = {'wav',wav_Name};
        else
            lev_Anal = def_lev_anal;
            anaPar = {};
        end
        strlev = int2str((1:levmax)');
        anaPar = {anaPar{:},'n_s',{img_Name,imgInfos.size}, ...
                  'lev',{'String',strlev,'Value',lev_Anal}}; %#ok<CCAT>
        cbanapar('set',win_tool,anaPar{:});
        NB_ColorsInPal = size(map,1);
        if imgInfos.self_map , arg = map; else arg = []; end
        cbcolmap('set',win_tool,'pal',{'pink',NB_ColorsInPal,'self',arg});
        if length(imgInfos.size)>2
            vis_UTCOLMAP = 'Off';
        else
            vis_UTCOLMAP = 'On';
        end
        cbcolmap('Visible',win_tool,vis_UTCOLMAP);
        utthrw2d('set',win_tool,'position_bis',{1,lev_Anal})

        % Enabling HDLG.
        %---------------
        sw2dtool('Enable',win_tool,'ini','on');

        % Setting axes. 
        %--------------
        sw2dtool('set_axes',win_tool);

        % Initial drawing
        %----------------
        axe_hdl = wmemtool('rmb',win_tool,n_membloc2,ind_axe_hdl);
        axe_ori = axe_hdl{1};
        hdl_ori = image([1 imgInfos.size(1)],[1 imgInfos.size(2)], ...
            wd2uiorui2d('d2uint',img_ori),'Parent',axe_ori, ...
            'Tag','Img_ORI');
        wtitle(getWavMSG('Wavelet:divGUIRF:OriImg_I'),'Parent',axe_ori)
        utthrw2d('set',win_tool,'handleORI',hdl_ori);

        % Analyze and De-noise.
        %----------------------
        if isequal(option,'demo')
            sw2dtool('decompose',win_tool);
            if ~isempty(par_Demo)
                den_Meth = par_Demo{1};
                if length(par_Demo)>1
                    thr_Val  = par_Demo{2};
                else
                    thr_Val  = NaN;
                end
                if isequal(den_Meth,'penallo') || ...
                        isequal(den_Meth,'penalhi')
                    utthrw2d('demo',win_tool,'swt2',den_Meth,thr_Val);
                end
            end
            sw2dtool('denoise',win_tool);
        end
        cbanapar('Enable',win_tool,'On');

        % End waiting.
        %-------------
        wwaiting('off',win_tool);

    case 'save'
        % Get de-noised signal.
        %----------------------
        hdl_den = utthrw2d('get',win_tool,'handleTHR');
        X = get(hdl_den,'CData');
        
        [wname,Lev_Anal] = wmemtool('rmb',win_tool,n_membloc1, ...
                ind_wave,ind_NB_lev); 
        valTHR = utthrw2d('get',win_tool,'allvalthr');
        valTHR = valTHR(:,1:Lev_Anal); 
        utguidiv('save_img',getWavMSG('Wavelet:commongui:Sav_Deno_Img'),...
            win_tool,X,'wname',wname,'valTHR',valTHR);

    case 'exp_wrks'
        wwaiting('msg',win_tool,getWavMSG('Wavelet:commongui:Str_Image'));
        hdl_den = utthrw2d('get',win_tool,'handleTHR');
        X = get(hdl_den,'CData');
        wtbxexport(X,'name','sig_2D','title', ...
            getWavMSG('Wavelet:commongui:WaitExport'));
        wwaiting('off',win_tool);        
        
    case 'decompose'
        % Compute decomposition and plot.
        %--------------------------------
        wwaiting('msg',win_tool,getWavMSG('Wavelet:commongui:WaitCompute'));

        % Get handles analysis parameters.
        %---------------------------------
        [wname,Lev_Anal] = cbanapar('get',win_tool,'wav','lev');
        hdl_ori = utthrw2d('get',win_tool,'handleORI');
        img_ori = get(hdl_ori,'CData');
        siz_ori = size(img_ori);
        siz_ori = siz_ori(1:2);
        pow = 2^Lev_Anal;
        if any(rem(siz_ori,pow))
            siz_sug = ceil(siz_ori/pow)*pow;
            wwaiting('off',win_tool);
            oriStr = ['(' int2str(siz_ori(1)) ',' int2str(siz_ori(2)) ')'];
            sugStr = ['(' int2str(siz_sug(1)) ',' int2str(siz_sug(2)) ')'];
            msg = getWavMSG('Wavelet:moreMSGRF:SWT_size_MSG',...
                        Lev_Anal,oriStr,sugStr);
            errargt(mfilename,msg,'msg');
            return
        end        


        % Clean HDLG.
        %---------------
        utthrw2d('clean_thr',win_tool);

        % Get Handles.
        %--------------------------------------------------------
        % ax_hdl = {axe_left_1 axe_right_1 axe_medium  axe_hist}
        %--------------------------------------------------------
        ax_hdl = wmemtool('rmb',win_tool,n_membloc2,ind_axe_hdl);

        % Clean axes.
        %------------
        axe_hist = ax_hdl{4};
        axes2clean = [ax_hdl{2};ax_hdl{3};axe_hist(:)];
        obj2del = [findobj(axes2clean,'Type','line');   ...
                   findobj(axes2clean,'Type','image');  ...
                   findobj(axes2clean,'Type','patch')   ...
                   ];
        delete(obj2del)
        set(axe_hist(:),'NextPlot','add')

        % Setting prog status.
        %----------------------
        wmemtool('wmb',win_tool,n_membloc1, ...
                       ind_status,1,ind_NB_lev,Lev_Anal,ind_wave,wname);

        % Clean reset axes limits.
        %-------------------------
        set([ax_hdl{1:2}],'XLim',[1 siz_ori(2)],'YLim',[1 siz_ori(1)])

        % Compute Decomposition.
        %------------------------
        wDEC = swt2(img_ori,Lev_Anal,wname);
        nDIM = ndims(wDEC);
        wmemtool('wmb',win_tool,n_membloc3,ind_coefs,wDEC);

        % Initializing by level threshold.
        %---------------------------------
        maxTHR = zeros(3,Lev_Anal);
        valTHR = sw2dtool('compute_LVL_THR',win_tool);
        permDir = [1 3 2];
        index   = zeros(3,Lev_Anal);
        for k = 1:Lev_Anal
          for d=1:3 , index(d,k) = (permDir(d)-1)*Lev_Anal+k; end
        end
        for k=1:Lev_Anal
            for d=1:3
                ind = index(d,k);
                if nDIM>3 , 
                    curr_img = wDEC(:,:,:,ind); 
                else
                    curr_img = wDEC(:,:,ind);
                end
                curr_img = curr_img(:);
                tmp = max(abs(curr_img));
                if tmp<eps , maxTHR(d,k) = 1; else maxTHR(d,k) = 1.1*tmp; end
            end
        end
        valTHR = min(maxTHR,valTHR);

        % Displaying details coefficients histograms.
        %--------------------------------------------
        dirDef   = 1;
        col_det  = wtbutils('colors','det',Lev_Anal);
        nb_bins  = 50;
        axeXColor = get(win_tool,'DefaultAxesXColor');
        for level = 1:Lev_Anal
            for direct=1:3
                ind = index(direct,level);
                if nDIM>3 , 
                    curr_img = wDEC(:,:,:,ind); 
                else
                    curr_img = wDEC(:,:,ind);
                end
                curr_img = curr_img(:);
                axeAct   = axe_hist(direct,level);
                curr_color = col_det(level,:);
                his        = wgethist(curr_img,nb_bins);
                his(2,:)   = his(2,:)/length(curr_img);
                wplothis(axeAct,his,curr_color);
                if level>1
                    wxlabel('','Parent',axeAct);
                else
                    xlab = getWavMSG(['Wavelet:dw2dRF:Dir_Det_'  str_dir_det(direct)]);
                    wxlabel(xlab,'Color',axeXColor,'Parent',axeAct);
                end
                thr_val = valTHR(direct,level);
                thr_max = maxTHR(direct,level);
                ylim    = get(axeAct,'YLim');
                utthrw2d('plot_dec',win_tool,dirDef, ...
                          {thr_max,thr_val,ylim,direct,level,axeAct})
                xmax = 1.1*max([thr_max, max(abs(his(1,:)))]);
                set(axeAct,'XLim',[-xmax xmax]);
                set(findall(axeAct),'Visible','on');
            end
        end
        drawnow

        % Initialization of denoising structure.
        %----------------------------------------
        utthrw2d('set',win_tool,'valthr',valTHR,'maxthr',maxTHR);

        % Dynvtool Attachment.
        %---------------------
        axe_cmd = [ax_hdl{1:2}];
        dynvtool('init',win_tool,[],axe_cmd,[],[1 1],'','','','int')

        % Enabling HDLG.
        %---------------
        sw2dtool('Enable',win_tool,'dec','on');

        % End waiting.
        %-------------
        wwaiting('off',win_tool);

    case 'denoise'
        % Compute decomposition and plot.
        %--------------------------------
        wwaiting('msg',win_tool,getWavMSG('Wavelet:commongui:WaitCompute'));

        % Disable Denoising Tool.
        %-------------------------
        utthrw2d('Enable',win_tool,'off');

        % Get decomposition.
        %-------------------
        [wname,Lev_Anal] = wmemtool('rmb',win_tool,n_membloc1, ...
                                          ind_wave,ind_NB_lev);        
        wDEC = wmemtool('rmb',win_tool,n_membloc3,ind_coefs);
        nDIM = ndims(wDEC);
        valTHR = utthrw2d('get',win_tool,'allvalthr');
        valTHR = valTHR(:,1:Lev_Anal);
        rad_sof = wfindobj(win_tool,'tag','soft_Rad');
        v = get(rad_sof,'Value');
        if isequal(v,1) , typTHR = 's'; else typTHR = 'h'; end
        permDir = [1 3 2];
        for level = 1:Lev_Anal
            for kk=1:3
               ind = (permDir(kk)-1)*Lev_Anal+level;
               thr = valTHR(kk,level);
               if nDIM>3 ,
                   wDEC(:,:,:,ind) = wthresh(wDEC(:,:,:,ind),typTHR,thr);
               else
                   wDEC(:,:,ind) = wthresh(wDEC(:,:,ind),typTHR,thr);
               end
            end
        end

        % Plotting de-noised Image.
        %---------------------------
        img_den = iswt2(wDEC,wname);
        img_den = wd2uiorui2d('d2uint',img_den);
        axe_hdl = wmemtool('rmb',win_tool,n_membloc2,ind_axe_hdl);
        axe_ori = axe_hdl{1};
        axe_den = axe_hdl{2};
        axe_dif = axe_hdl{3};
        hdl_den = image(img_den,'Parent',axe_den,'Tag','Img_DEN');
        xylim   = get(axe_ori,{'XLim','YLim'});
        set(axe_den,'XLim',xylim{1},'YLim',xylim{2},'Visible','on');
        wtitle(getWavMSG('Wavelet:divGUIRF:Deno_I'),'Parent',axe_den);
        hdl_ori  = utthrw2d('get',win_tool,'handleORI');
        img_dif  = get(hdl_ori,'CData')-img_den;
        img_dif  = img_dif(:);
        nb_bins  = 80;
        color    = wtbutils('colors','sw2d','histRES');
        his      = wgethist(img_dif,nb_bins);
        his(2,:) = his(2,:)/length(img_dif);
        wplothis(axe_dif,his,color);
        wtitle(getWavMSG('Wavelet:divGUIRF:Hist_I_DI'),'Parent',axe_dif);

        % Memory blocks update.
        %----------------------
        utthrw2d('set',win_tool,'handleTHR',hdl_den);
        wmemtool('wmb',win_tool,n_membloc1,ind_status,1);

        % Dynvtool Attachment.
        %---------------------
        dynvtool('ini_his',win_tool,0);
        dynvtool('put',win_tool)

        % Enabling HDLG.
        %---------------
        utthrw2d('Enable',win_tool,'on');
        sw2dtool('Enable',win_tool,'den','on');

        % End waiting.
        %---------------
        wwaiting('off',win_tool);

    case 'update_level'
        pop_lev = varargin{2}(1);
        if ~ishandle(pop_lev)
            handles = guihandles(gcbf);
            pop_lev = handles.Pop_Lev;
        end
        lev_New  = get(pop_lev,'Value');
        [status,lev_Anal] = wmemtool('rmb',win_tool,n_membloc1,...
            ind_status,ind_NB_lev);
        utthrw2d('set',win_tool,'position_bis',{1,lev_New});
        sw2dtool('set_axes',win_tool);
        
        % Set axes Visibility
        %--------------------
        vis_InAxes = 'off';
        if isequal(lev_New,lev_Anal)
            switch status
                case -1 , 
                    sw2dtool('Enable',win_tool,'ini');
                case  0 ,
                    sw2dtool('Enable',win_tool,'dec');
                case  1 ,
                    vis_InAxes = 'on';
                    sw2dtool('Enable',win_tool,'dec','on');
                    sw2dtool('Enable',win_tool,'den','on');
            end
        else
            sw2dtool('Enable',win_tool,'ini');
        end
        
        % Get Handles.
        %--------------------------------------------------------
        % ax_hdl = {axe_left_1 axe_right_1 axe_medium  axe_hist}
        %--------------------------------------------------------
        ax_hdl  = wmemtool('rmb',win_tool,n_membloc2,ind_axe_hdl);
        axe_Off = [ax_hdl{2};ax_hdl{3}];
        obj_Off = [findobj(axe_Off,'Type','line');  ...
                   findobj(axe_Off,'Type','patch'); ...
                   findobj(axe_Off,'Type','image')];
        set(obj_Off,'Visible',vis_InAxes);
                
    case 'compute_LVL_THR'
        [numMeth,meth,alfa] = utthrw2d('get_LVL_par',win_tool); %#ok<ASGLU>
        wDEC = wmemtool('rmb',win_tool,n_membloc3,ind_coefs);
        varargout{1} = wthrmngr('sw2ddenoLVL',meth,wDEC,alfa);

    case 'update_LVL_meth'
        sw2dtool('clear_GRAPHICS',win_tool);
        valTHR = sw2dtool('compute_LVL_THR',win_tool);
        utthrw2d('update_LVL_meth',win_tool,valTHR);

    case 'clear_GRAPHICS'
        status = wmemtool('rmb',win_tool,n_membloc1,ind_status);
        if status<1 , return; end

        % Disable Toggle and Menus.
        %---------------------------
        sw2dtool('Enable',win_tool,'den','off');

        % Get Handles.
        %-------------
        axe_hdl = wmemtool('rmb',win_tool,n_membloc2,ind_axe_hdl);
        axe_Off = [axe_hdl{2};axe_hdl{3}];
        obj_Off = [findobj(axe_Off,'Type','line');  ...
                   findobj(axe_Off,'Type','patch'); ...
                   findobj(axe_Off,'Type','image')];
        set(obj_Off,'Visible','off');

    case {'enable','Enable'}
        type  = varargin{2};
        m_save = wmemtool('rmb',win_tool,n_membloc1,ind_sav_menu);
        m_exp_sig = wtbxappdata('get',win_tool,'m_exp_sig');
        m_gen     = wtbxappdata('get',win_tool,'M_GenCode');
        m_SAV_EXP = [m_save,m_exp_sig,m_gen];        
        switch type 
          case 'ini'
            set(m_SAV_EXP,'Enable','off');
            pus_dec = wmemtool('rmb',win_tool,n_membloc2,ind_pus_dec);
            col_hdl = utcolmap('handles',win_tool,'cell');
            utthrw2d('status',win_tool,'off');
            set([pus_dec;double(col_hdl)],'Enable','on');

          case 'dec'
            nb_lev = wmemtool('rmb',win_tool,n_membloc1,ind_NB_lev);
            set(m_SAV_EXP,'Enable','off');
            utthrw2d('status',win_tool,'on');
            utthrw2d('Enable',win_tool,'on',1:nb_lev);
            wmemtool('wmb',win_tool,n_membloc1,ind_status,0);

          case 'den'
            enaVal = varargin{3};
            set(m_SAV_EXP,'Enable',enaVal);
            utthrw2d('enable_tog_res',win_tool,enaVal);
            if strncmpi(enaVal,'on',2) , status = 1; else status = 0; end
            wmemtool('wmb',win_tool,n_membloc1,ind_status,status);
        end

    case 'set_axes'
        %*************************************************************%
        %** OPTION = 'set_axes' - Set axes positions and visibility **%
        %*************************************************************%
        pos_win = get(win_tool,'Position');
        [ax_hdl,Pos_Graphic_Area] = wmemtool('rmb',win_tool,n_membloc2,...
                                                   ind_axe_hdl,ind_gra_area);
        NB_lev = cbanapar('get',win_tool,'lev');

        % Hide axes
        %-----------
        ax_2_clean  = [ax_hdl{1:3},ax_hdl{4}(:)'];
        obj_in_axes = findobj(ax_2_clean);
        set(obj_in_axes,'Visible','off');

        % Plots.
        %--------------------------------------------------------
        % ax_hdl = {axe_left_1 axe_right_1 axe_medium  axe_hist} 
        %--------------------------------------------------------
        ax_l_1  = ax_hdl{1};
        ax_r_1  = ax_hdl{2};
        ax_med  = ax_hdl{3};
        ax_hist = ax_hdl{4};

        % General graphical parameters initialization.
        %---------------------------------------------
        ecy_up    = 0.06*pos_win(4);
        ecy_mid_1 = 0.08*pos_win(4);
        ecy_mid_2 = ecy_up;
        ecy_down  = ecy_up;
        ecy_det   = (0.04*pos_win(4))/1.4;
        h_gra_rem = Pos_Graphic_Area(4);
        h_min     = h_gra_rem/4;
        h_max     = h_gra_rem/3;
        h_image   = (h_min*(NB_lev-1)+h_max*(max_lev_anal-NB_lev))/(max_lev_anal-1);
        h_histo   = h_gra_rem/8;
        h_gra_rem = h_gra_rem-h_histo-h_image-ecy_up-ecy_mid_1-ecy_mid_2;
        h_detail  = (h_gra_rem-ecy_down-(NB_lev-1)*ecy_det)/NB_lev;
        y_low_ini = 1;

        % Building data axes.
        %--------------------
        y_low_ini = y_low_ini-h_image-ecy_up;
        pos_axes  = get(ax_l_1,'Position');
        pos_axes([2 4]) = [y_low_ini h_image];
        set(ax_l_1,'Position',pos_axes);

        pos_axes = get(ax_r_1,'Position');
        pos_axes([2 4]) = [y_low_ini h_image];
        set(ax_r_1,'Position',pos_axes)

        y_low_ini = y_low_ini-h_histo-ecy_mid_1;
        pos_axes  = get(ax_med,'Position');
        pos_axes([2 4]) = [y_low_ini h_histo];
        set(ax_med,'Position',pos_axes)
        y_low_ini = y_low_ini-ecy_mid_2+ecy_det;

        % Position for histograms axes.
        %------------------------------   
        axeXColor = get(win_tool,'DefaultAxesXColor');        
        pos_y    = [y_low_ini , h_detail];
        axe_vis = zeros(1,3*NB_lev);
        idx_ax_act = 0;
        for level = NB_lev:-1:1
            pos_y(1) = pos_y(1)-h_detail-ecy_det;
            for direct=1:3
                idx_ax_act = idx_ax_act + 1;
                ax_act   = ax_hist(direct,level);
                pos_axes = get(ax_act,'Position');           
                pos_axes([2 4]) = pos_y;
                set(ax_act,'Position',pos_axes);
                axe_vis(idx_ax_act) = ax_act;
                if level>1
                    wxlabel('','Parent',ax_act);
                else
                    xlab = getWavMSG(['Wavelet:dw2dRF:Dir_Det_'  str_dir_det(direct)]);
                    wxlabel(xlab,'Color',axeXColor,'Parent',ax_act);
                end
            end           
        end
        axe_vis = [ax_l_1 , ax_r_1 , ax_med , axe_vis];

        % Setting axes visibility & title.
        %---------------------------------
        obj_in_axes_vis = findobj(axe_vis);
        set(obj_in_axes_vis,'Visible','on');
        wtitle(getWavMSG('Wavelet:divGUIRF:Img_I'),'Parent',ax_l_1);
        wtitle(getWavMSG('Wavelet:divGUIRF:Hist_I_DI'),'Parent',ax_med);
        wtitle(getWavMSG('Wavelet:divGUIRF:Deno_I'),'Parent',ax_r_1);
                    
    case 'close'

    otherwise
        errargt(mfilename,getWavMSG('Wavelet:moreMSGRF:Unknown_Opt'),'msg');
        error(message('Wavelet:FunctionArgVal:Invalid_ArgVal'));
end

%--------------------------------------------------------------------------
function setfigNAME(fig,flagIDX)

if flagIDX
    figNAME = getWavMSG('Wavelet:divGUIRF:SW2D_Nam_Ind');
else
    figNAME = getWavMSG('Wavelet:divGUIRF:SW2D_Nam_TC');
end
set(fig,'Name',figNAME);
%---------------------------------------------------------------------------