📄 subimage.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 + -