showpdfb.m

来自「NONSUBSAMPLED CONTOURLET TRANSFORM FILTE」· M 代码 · 共 333 行

M
333
字号
function displayIm = showpdfb(y, scaleMode, displayMode, ...                              lowratio, highratio, coefMode, subbandgap)% SHOWPDFB   Show PDFB coefficients. 显示pdfb系数%%       showpdfb(y, [scaleMode, displayMode, ...%                    lowratio, highratio, coefMode, subbandgap])%% Input:%	y:	a cell vector of length n+1, one for each layer of %		subband images from DFB, y{1} is the lowpass image%%   scaleMode: %       scale mode (a string or number):%           If it is a number, it denotes the number of most significant %           coefficients to be displayed.  Its default value is 'auto2'.%           'auto1' ---   All the layers use one scale. It reflects the real %                         values of the coefficients.%                         However, the visibility will be very poor.%           'auto2' ---   Lowpass uses the first scale. All the highpass use %                         the second scale.%           'auto3' ---   Lowpass uses the first scale. %                         All the wavelet highpass use the second scale.%                         All the contourlet highpass use the third scale.%   displayMode: %       display mode (a string): %           'matlab' --- display in Matlab environment. %                        It uses the background color for the marginal%                        image.%           'others' --- display in other environment or for print.%                        It used the white color the marginal image. %                        It is the default value.%   lowratio:%       display ratio for the lowpass filter (default value is 2).%       It ranges from 1.2 to 4.0.%   highratio:%       display ratio for the highpass filter (default value is 6).%       It ranges from 1.5 to 10.%  coefMode: %       coefficients mode (a string): %           'real' ----  Highpass filters use the real coefficients. %           'abs' ------ Highpass filters use the absolute coefficients. %                        It is the default value%   subbandgap:	%       gap (in pixels) between subbands. It ranges from 1 to 4.%% Output:%	displayIm: matrix for the display image.%   % See also:     PDFBDEC, DFBIMAGE, COMPUTESCALE% History:%   09/17/2003  Creation.%   09/18/2003  Add two display mode, denoted by 'displayMode'.%               Add two coefficients mode, denoted by 'coeffMode'.%   10/03/2003  Add the option for the lowpass wavelet decomposition.%   10/04/2003  Add a function computescale in computescales.m. %               This function will call it.%               Add two scal modes, denoted by 'scaleMode'. %               It can also display the most significant coefficients.%   10/05/2003  Add 'axis image' to control resizing.%               Use the two-fold searching method to find the %               background color index.% Scale modeif ~exist('scaleMode', 'var')    scaleMode = 'auto2' ;elseif isnumeric( scaleMode ) % Denote the number of significant coefficients to be displayed    if scaleMode < 2        display( 'Warning! The numbe of significant coefficients must be positive!' ) ;        scaleMode = 50 ;    endelseif ~strcmp(scaleMode,'auto1') & ~strcmp(scaleMode, 'auto2') & ~strcmp(scaleMode, 'auto3')    display ('Warning! There are only two scaleMode mode: auto1, auto2, auto3! Its defualt value is "auto2"!');    scaleMode = 'auto2' ;end% Display ratio for the lowpass bandif ~exist('lowratio', 'var')    lowratio = 2 ;elseif highratio < 1    display ('Warning! lowratio must be larger than 1!Its defualt value is 2!');end% Display ratio for the hiphpass bandif ~exist('highratio', 'var')    highratio = 6 ;elseif highratio < 1    display ('Warning! highratio must be larger than 1! Its defualt value is 6!');end% Gap between subbandsif ~exist('subbandgap', 'var')    subbandgap = 1;  elseif subbandgap < 1    display ('Warning! subbandgap must be no less than 1! Its defualt value is 1!');    subbandgap = 1;end% Display modeif ~exist('displayMode', 'var')    displayMode = 'others' ;elseif ~strcmp(displayMode,'others') & ~strcmp(displayMode, 'matlab')    display ('Warning! There are only two display mode: matlab, others! Its defualt value is "others"!');    displayMode = 'others' ;end% Coefficient modeif ~exist('coefMode', 'var')    coefMode = 'abs' ;elseif ~strcmp(coefMode,'real') & ~strcmp(coefMode, 'abs')    display ('Warning! There are only two coefficients mode: real, abs! Its defualt value is "abs"!');    coefMode = 'abs' ;end% Parameters for displaylayergap = 1 ; % Gap between layers% Input structure analysis. nLayers = length(y); %number of PDFB layers% Compute the number of wavelets layers.% We assume that the wavelets layers are first several consecutive layers.% The number of the subbands of each layer is 3.fWaveletsLayer = 1;nWaveletsLayers = 0 ; %Number of wavelets layers.nInxContourletLayer = 0 ; %The index of the first contourlet layer.i = 2 ;while fWaveletsLayer > 0 & i <= nLayers    if length( y{i} ) == 3        nWaveletsLayers = nWaveletsLayers + 1 ;    else        fWaveletsLayer = 0 ;    end;    i = i + 1 ;end;nInxContourletLayer = 2 + nWaveletsLayers ;    % Initialization % Since we will merge the wavelets layers together, % we shall decrease the number of display layers.nDisplayLayers = nLayers - nWaveletsLayers ;cellLayers = cell (1, nDisplayLayers); % Cell for multiple display layersvScalesTemp = zeros (1, 2) ;  % Temporary scale vector.vScales = zeros (nLayers, 2); % Scale vectors for each layer nAdjustHighpass = 2 ; % Adjustment ratio for the highpass layers.if ~isnumeric( scaleMode )    switch( scaleMode )% Compute the scales for each layer    case 'auto1'        vScalesTemp = computescale( y, lowratio, 1, nLayers, coefMode ) ;        for i = 1 : nLayers            vScales( i, :) = vScalesTemp ;        end    case 'auto2'        vScales( 1, :) = computescale( y, lowratio, 1, 1, coefMode ) ;        vScalesTemp = computescale( y, highratio, 2, nLayers, coefMode ) ;        % Make a slight adjustment. Compared to the lowpass, the highpass shall be insignificant.        % To make the display more realistic, use a little trick to make the upper bound a little bigger.         vScalesTemp (2) = nAdjustHighpass * ( vScalesTemp (2) - vScalesTemp (1) ) + vScalesTemp (1) ;        for i = 2 : nLayers            vScales( i, :) = vScalesTemp ;        end    case 'auto3'        vScales( 1, :) = computescale( y, lowratio, 1, 1, coefMode ) ;        vScalesTemp = computescale( y, highratio, 2, 1+nWaveletsLayers, coefMode ) ;        % Make a slight adjustment. Compared to the lowpass, the highpass shall be insignificant.        % To make the display more realistic, use a little trick to make the upper bound a little bigger.         vScalesTemp (2) = nAdjustHighpass * ( vScalesTemp (2) - vScalesTemp (1) ) + vScalesTemp (1) ;        for i = 2 : nWaveletsLayers + 1            vScales( i, :) = vScalesTemp ;        end        vScalesTemp = computescale( y, highratio, nInxContourletLayer, nLayers, coefMode ) ;        % Make a slight adjustment. Compared to the lowpass, the highpass shall be insignificant.        % To make the display more realistic, use a little trick to make the upper bound a little bigger.         vScalesTemp (2) = nAdjustHighpass * ( vScalesTemp (2) - vScalesTemp (1) ) + vScalesTemp (1) ;        for i = nInxContourletLayer : nLayers            vScales( i, :) = vScalesTemp ;        end    otherwise % Default value: 'auto2'.        vScales( 1, :) = computescale( y, lowratio, 1, 1, coefMode ) ;        vScalesTemp = computescale( y, highratio, 2, nLayers, coefMode ) ;        for i = 2 : nLayers            vScales( i, :) = vScalesTemp ;        end    end    % Verify that they are reasonable    for i = 1: nLayers        if vScales (i, 2) < vScales (i, 1) + 1.0e-9            display ('Error! The scale vectors are wrong! Exit!' ) ;            exit ;        end;    end;    %display ( vScales ) ;else % Compute the threshold for the display of coefficients    % Convert the output into the vector format    [vCoeff, s] = pdfb2vec(y);        % Sort the coefficient in the order of energy.    vSort = sort( abs( vCoeff ));    clear vCoeff;    vSort = fliplr(vSort);        % Find the threshold value based on number of keeping coeffs    dThresh = vSort( scaleMode );    clear vSort;end% Prepare for the displaycolormap(gray);cmap = get(gcf,'Colormap');cColorInx = size(cmap,1);%  Find background color index:if strcmp( displayMode, 'matlab' )    % Get the background color (gray value)    dBgColor = get( gcf, 'Color' ) ;        % Search the color index by 2-fold searching method.    % This method is only useful for the gray color!    nSmall = 1 ;    nBig = cColorInx ;    while nBig > nSmall + 1        nBgColor = floor ((nSmall + nBig) / 2) ;        if dBgColor(1) < cmap (nBgColor, 1)            nBig = nBgColor ;        else            nSmall = nBgColor ;        end    end;    if abs( dBgColor(1) - cmap (nBig, 1) ) > abs ( dBgColor(1) - cmap( nSmall, 1) )        nBgColor = nSmall ;    else        nBgColor = nBig ;    endend% Merge all layers to corresponding display layers.% Prepare the cellLayers, including the boundary.% Need to polish with real boudary later!% Now we add the boundary, but erase the images!!% First handle the lowpass filter% White line around subbands% 1. One wavelets layers. gridI = cColorInx - 1 ;cell4Wavelets = cell(1, 4) ; %Store 4 wavelets subbands.if isnumeric ( scaleMode ) %Keep the significant efficients    waveletsIm = cColorInx * double(abs(y{1}) >= dThresh) ;else    dRatio = (cColorInx-1) / (vScales(1,2)-vScales(1,1));    if strcmp( coefMode, 'real' )        waveletsIm = double( 1 + (y{1}-vScales(1,1))*dRatio ) ;    else        waveletsIm = double( 1 + (abs(y{1})-vScales(1,1))*dRatio ) ;    endend% Merge other wavelets layersif nWaveletsLayers > 0    for i=2 : nWaveletsLayers + 1        cell4Wavelets{1} = waveletsIm ;         % Compute with the scale ratio.        if ~isnumeric( scaleMode )            dRatio = (cColorInx-1) / (vScales(i,2)-vScales(i,1));        end        m = length(y{i});        if m ~= 3            display('Error! Incorect number of wavelets subbands! Exit!');            exit;          end        for k = 1:m            if isnumeric ( scaleMode ) %Keep the significant efficients                cell4Wavelets{k+1} = cColorInx * double(abs(y{i}{k}) >= dThresh) ;            else                if strcmp( coefMode, 'real' )                    cell4Wavelets{k+1} = double( 1 + (y{i}{k}-vScales(i,1))*dRatio );                else                    cell4Wavelets{k+1} = double( 1 + (abs(y{i}{k})-vScales(i,1) )* dRatio );                end            end        end        waveletsIm = dfbimage(cell4Wavelets, subbandgap, gridI);    endendcellLayers{1} = waveletsIm ;nHeight = size( cellLayers{1}, 1 );% 2. All the contourlet layersfor i = nInxContourletLayer : nLayers    % Compute with the scale ratio.    if ~isnumeric( scaleMode )        dRatio = (cColorInx-1) / (vScales( i, 2)-vScales( i, 1));    end    m = length(y{i});    z = cell(1, m);    for k = 1:m        if isnumeric ( scaleMode ) %Keep the significant efficients            z{k} = cColorInx * double(abs(y{i}{k}) >= dThresh) ;        else            if strcmp( coefMode, 'real' )                z{k} = double( 1 + (y{i}{k}-vScales(i,1)) * dRatio );            else                z{k} = double( 1 + (abs(y{i}{k})-vScales(i,1) )* dRatio );            end        end    end    cellLayers{i-nWaveletsLayers} = dfbimage(z, subbandgap, gridI);    nHeight = nHeight + size(cellLayers{i-nWaveletsLayers}, 1);end% Compute the width of the dispaly image.nWidth = size(cellLayers{nDisplayLayers}, 2);% Merge all layers and add gaps between layersnHeight = nHeight + layergap * (nDisplayLayers - 1) ;% Set the background for the output imageif strcmp( displayMode, 'matlab' )    displayIm = nBgColor * ones( nHeight, nWidth);else    displayIm = (cColorInx-1) * ones( nHeight, nWidth);endnPos = 0; %output image pointerfor i = 1 : nDisplayLayers    [h, w] = size( cellLayers{i} );    displayIm( nPos+1: nPos+h, 1:w) = cellLayers{i};    if i < nDisplayLayers        % Move the position pointer and add gaps between layers        nPos = nPos + h + layergap ;    end        endhh = image( displayIm );% title('decompostion image');axis image off;

⌨️ 快捷键说明

复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?