⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 subimage.m

📁 有关matlab的电子书籍有一定的帮助希望有用
💻 M
字号:
function hout = subimage(varargin)
%SUBIMAGE Display multiple images in single figure.
%   You can use SUBIMAGE in conjunction with SUBPLOT to create
%   figures with multiple images, even if the images have
%   different colormaps. SUBIMAGE works by converting images to
%   truecolor for display purposes, thus avoiding colormap
%   conflicts.
%
%   SUBIMAGE(X,MAP) displays the indexed image X with colormap
%   MAP in the current axes.
%
%   SUBIMAGE(I) displays the intensity image I in the current
%   axes.
%
%   SUBIMAGE(BW) displays the binary image BW in the current
%   axes.
%
%   SUBIMAGE(RGB) displays the truecolor image RGB in the current
%   axes.
%
%   SUBIMAGE(x,y,...) displays an image with nondefault spatial
%   coordinates.
%
%   H = SUBIMAGE(...) returns a handle to the image object.
%
%   Class Support
%   -------------
%   The input image can be of class uint8 or double.
%
%   Example
%   -------
%       load trees
%       [X2,map2] = imread('forest.tif');
%       subplot(1,2,1), subimage(X,map)
%       subplot(1,2,2), subimage(X2,map2)
%
%   See also IMSHOW, SUBPLOT.

%   Clay M. Thompson 2-22-93
%   Revised 5-13-93 by CMT
%   Revised for IPT v2 by Steven L. Eddins, September 1996
%   Copyright 1993-1998 The MathWorks, Inc.  All Rights Reserved.
%   $Revision: 5.13 $  $Date: 1997/11/24 15:36:26 $

[x,y,cdata,msg] = parse_inputs(varargin{:});
if (~isempty(msg))
    error(msg);
end

ax = newplot;
fig = get(ax,'Parent');
cm = get(fig,'Colormap');

% Go change all the existing image and texture-mapped surface 
% objects to truecolor.
h = [findobj(fig,'Type','image') ; 
    findobj(fig,'Type','surface','FaceColor','texturemap')];
for k = 1:length(h)
    if (ndims(get(h(k), 'CData')) < 3)
        if (isequal(get(h(k), 'CDataMapping'), 'direct'))
            if (strcmp(get(h(k),'Type'),'image'))
                set(h(k), 'CData', uint8(255*ind2rgb(get(h(k),'CData'), cm)));
            else
                set(h(k), 'CData', ind2rgb(get(h(k),'CData'), cm));
            end
        else
            clim = get(get(h(k),'Parent'), 'CLim');
            data = get(h(k), 'CData');
            if (isa(data,'uint8'))
                data = double(data) / 255;
                clim = clim / 255;
            end
            data = (data - clim(1)) / (clim(2) - clim(1));
            data = min(max(data,0),1);
            if (strcmp(get(h(k),'Type'),'image'))
                data = uint8(round(255*data));
                set(h(k), 'CData', cat(3, data, data, data));
            else
                set(h(k), 'CData', cat(3, data, data, data));
            end
        end
    end
end

h = image(x, y, cdata);
axis image;

if nargout==1,
    hout = h;
end

%--------------------------------------------------------
% Subfunction PARSE_INPUTS
%--------------------------------------------------------
function [x,y,cdata,msg] = parse_inputs(varargin)

x = [];
y = [];
cdata = [];
msg = '';   % empty string if no error encountered

scaled = 0;
binary = 0;

switch nargin
case 0
    msg = 'Not enough input arguments';
    
case 1
    % subimage(I)
    % subimage(RGB)
    
    if ((ndims(varargin{1}) == 3) & (size(varargin{1},3) == 3))
        % subimage(RGB)
        cdata = varargin{1};
        
    else
        % subimage(I)
        binary = islogical(varargin{1});
        cdata = cat(3, varargin{1}, varargin{1}, varargin{1});

    end
    
case 2
    % subimage(I,[a b])
    % subimage(I,N)
    % subimage(X,map)
    
    if (prod(size(varargin{2})) == 1)
        % subimage(I,N)
        binary = islogical(varargin{1});
        cdata = cat(3, varargin{1}, varargin{1}, varargin{1});
        
    elseif (isequal(size(varargin{2}), [1 2]))
        % subimage(I,[a b])
        clim = varargin{2};
        if (clim(1) == clim(2))
            msg = 'a cannot equal b in subimage(I,[a b])';
        else
            cdata = cat(3, varargin{1}, varargin{1}, varargin{1});
        end
        scaled = 1;
        
    elseif (size(varargin{2},2) == 3)
        % subimage(X,map);
        cdata = uint8(round(255*ind2rgb(varargin{1},varargin{2})));
        
    else
        msg = 'Invalid input arguments';
        
    end
    
case 3
    % subimage(R,G,B)  GRANDFATHERED
    % subimage(x,y,I)
    % subimage(x,y,RGB)
    
    if ((ndims(varargin{3}) == 3) & (size(varargin{3},3) == 3))
        % subimage(x,y,RGB)
        x = varargin{1};
        y = varargin{2};
        cdata = varargin{3};
        
    elseif (isequal(size(varargin{1}), size(varargin{2})) & ...
                isequal(size(varargin{2}), size(varargin{3})))
        % subimage(R,G,B)
        cdata = cat(3, varargin{:});
        
    else
        % subimage(x,y,I)
        x = varargin{1};
        y = varargin{2};
        binary = islogical(varargin{3});
        cdata = cat(3, varargin{3}, varargin{3}, varargin{3});
        
    end
    
case 4
    % subimage(x,y,I,[a b])
    % subimage(x,y,I,N)
    % subimage(x,y,X,map)
    
    if (prod(size(varargin{4})) == 1)
        % subimage(x,y,I,N)
        x = varargin{1};
        y = varargin{2};
        binary = islogical(varargin{3});
        cdata = cat(3, varargin{3}, varargin{3}, varargin{3});
        
    elseif (isequal(size(varargin{4}), [1 2]))
        % subimage(x,y,I,[a b])
        scaled = 1;
        clim = varargin{4};
        if (clim(1) == clim(2))
            msg = 'a cannot equal b in subimage(I,[a b])';
        else            
            x = varargin{1};
            y = varargin{2};
            cdata = cat(3, varargin{3}, varargin{3}, varargin{3});
        end
        
    elseif (size(varargin{4},2) == 3)
        % subimage(x,y,X,map);
        x = varargin{1};
        y = varargin{2};
        cdata = uint8(round(255*ind2rgb(varargin{3},varargin{4})));
        
    else
        msg = 'Invalid input arguments';
        
    end
    
case 5
    % subimage(x,y,R,G,B)
    
    if (~isequal(size(varargin{3}), size(varargin{4})) | ...
                ~isequal(size(varargin{4}), size(varargin{5})))
        msg = 'R, G, and B must be the same size in subimage(x,y,R,G,B)';
    else
        % subimage(x,y,R,G,B)
        x = varargin{1};
        y = varargin{2};
        cdata = cat(3, varargin{3:5});
    end
    
otherwise
    msg = 'Too many input arguments';
    
end

if (isempty(msg))
    if (scaled)
        if (isa(cdata,'double'))
            cdata = (cdata - clim(1)) / (clim(2) - clim(1));
            cdata = min(max(cdata,0),1);
            
        elseif (isa(cdata,'uint8'))
            cdata = double(cdata);
            cdata = 255 * (cdata - clim(1)) / (clim(2) - clim(1));
            cdata = min(max(cdata,0),255);
            cdata = uint8(round(cdata));
            
        else
            msg = 'Class of input image must be double or uint8';
            
        end
        
    elseif (binary)
        cdata(cdata ~= 0) = 255;
        
    end
    
    if (isempty(x))
        x = [1 size(cdata,2)];
        y = [1 size(cdata,1)];
    end
end

⌨️ 快捷键说明

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