# HG changeset patch # User jwe # Date 1169176876 0 # Node ID 7b04118f04df3aa654014a616599aef17e5f942f # Parent b317fc1b21cc3c98afa622325984167294c113a6 [project @ 2007-01-19 03:21:16 by jwe] diff --git a/scripts/ChangeLog b/scripts/ChangeLog --- a/scripts/ChangeLog +++ b/scripts/ChangeLog @@ -1,5 +1,8 @@ 2007-01-18 Søren Hauberg + * image/ind2rgb.m: Better input checking. Return 3-d array if + nargout is 1. Handle colormaps that have too few colors. + * pkg/pkg.m (create_pkgadddel): Call fullfile with nm, not "nm". (configure_make): Use fullfile instead of concatenating with "/". diff --git a/scripts/image/ind2rgb.m b/scripts/image/ind2rgb.m --- a/scripts/image/ind2rgb.m +++ b/scripts/image/ind2rgb.m @@ -18,8 +18,11 @@ ## 02110-1301, USA. ## -*- texinfo -*- -## @deftypefn {Function File} {[@var{r}, @var{g}, @var{b}] =} ind2rgb (@var{x}, @var{map}) +## @deftypefn {Function File} {@var{rgb} =} ind2rgb (@var{x}, @var{map}) +## @deftypefnx {Function File} {[@var{r}, @var{g}, @var{b}] =} ind2rgb (@var{x}, @var{map}) ## Convert an indexed image to red, green, and blue color components. +## If the colormap doesn't contain enough colors, pad it with the +## last color in the map. ## If @var{map} is omitted, the current colormap is used for the conversion. ## @seealso{rgb2ind, image, imshow, ind2gray, gray2ind} ## @end deftypefn @@ -30,18 +33,41 @@ function [R, G, B] = ind2rgb (X, map) + ## Do we have the right number of inputs? if (nargin < 1 || nargin > 2) print_usage (); elseif (nargin == 1) map = colormap (); endif - [hi, wi] = size (X); + ## Check if X is an indexed image. + if (ndims (X) != 2 || any (X(:) != round (X(:))) || min (X(:)) < 1) + error ("ind2rgb: first input argument must be an indexed image"); + endif + + ## Check the color map. + if (ndims (map) != 2 || columns (map) != 3) + error ("ind2rgb: second input argument must be a color map"); + endif - ## FIXME -- we should check size of X and map. - + ## Do we have enough colors in the color map? + maxidx = max (X(:)); + rm = rows (map); + if (rm < maxidx) + ## Pad with the last color in the map. + pad = repmat (map(end,:), maxidx-rm, 1); + map(end+1:maxidx, :) = pad; + endif + + ## Compute result + [hi, wi] = size (X); R = reshape (map (X(:), 1), hi, wi); G = reshape (map (X(:), 2), hi, wi); B = reshape (map (X(:), 3), hi, wi); + ## Use 3D array if only one output is requested. + if (nargout <= 1) + R(:,:,3) = B; + R(:,:,2) = G; + endif endfunction