changeset 6247:7b04118f04df

[project @ 2007-01-19 03:21:16 by jwe]
author jwe
date Fri, 19 Jan 2007 03:21:16 +0000
parents b317fc1b21cc
children 7fad1fad19e1
files scripts/ChangeLog scripts/image/ind2rgb.m
diffstat 2 files changed, 33 insertions(+), 4 deletions(-) [+]
line wrap: on
line diff
--- a/scripts/ChangeLog	Fri Jan 19 03:14:42 2007 +0000
+++ b/scripts/ChangeLog	Fri Jan 19 03:21:16 2007 +0000
@@ -1,5 +1,8 @@
 2007-01-18  Søren Hauberg  <hauberg@gmail.com>
 
+	* 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 "/".
 
--- a/scripts/image/ind2rgb.m	Fri Jan 19 03:14:42 2007 +0000
+++ b/scripts/image/ind2rgb.m	Fri Jan 19 03:21:16 2007 +0000
@@ -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