# HG changeset patch # User Rik # Date 1398972666 25200 # Node ID 0585787aa8ae0bd8a5b1eaa22af96affe7b92f90 # Parent d57a83f2d73e0c79c82080d9ab050ea004501189 imshow.m: Overhaul function and support integer images (bug #41240). * imshow.m: Check that input colormaps are valid. Rename variable "true_color" to "truecolor". Add checking for "parent" property, although it is unimplemented. Fix off-by-1 error when reporting a bad argument during input validation. Don't accept invalid image formats uint32, int32. Don't check for NaNs on integer data (which doesn't have any). Don't change image data in order to clamp it to the display_range variable; Just use 'scaled' image and have the display routines do this. Use image(), imagesc() to simplify things. Rename variable "tmp" to "htmp" since that is what other routines use. Add %!error tests for input validation. diff -r d57a83f2d73e -r 0585787aa8ae scripts/image/imshow.m --- a/scripts/image/imshow.m Thu May 01 11:16:03 2014 -0700 +++ b/scripts/image/imshow.m Thu May 01 12:31:06 2014 -0700 @@ -75,7 +75,7 @@ endif display_range = NA; - true_color = false; + truecolor = false; indexed = false; xdata = ydata = []; @@ -98,9 +98,9 @@ endif elseif (size (im, 3) == 3) if (ismember (class (im), {"uint8", "uint16", "double", "single"})) - true_color = true; + truecolor = true; else - error ("imshow: color image must be uint8, uint16, double, or single"); + error ("imshow: TrueColor image must be uint8, uint16, double, or single"); endif else error ("imshow: expecting MxN or MxNx3 matrix for image"); @@ -114,34 +114,47 @@ display_range = arg; elseif (columns (arg) == 3) indexed = true; - colormap (arg); + if (iscolormap (arg)) + colormap (arg); + else + error ("imshow: invalid colormap MAP"); + endif elseif (! isempty (arg)) - error ("imshow: argument number %d is invalid", narg+1); + error ("imshow: argument number %d is invalid", narg); endif elseif (ischar (arg)) switch (tolower (arg)) - case "displayrange"; + case "colormap" + map = varargin{narg++}; + if (iscolormap (map)) + colormap (map); + else + error ("imshow: invalid colormap"); + endif + case "displayrange" display_range = varargin{narg++}; - case "xdata"; + case "parent" + warning ("imshow: parent argument is not implemented"); + case {"truesize", "initialmagnification"} + warning ("image: zoom argument ignored -- use GUI features"); + case "xdata" xdata = varargin{narg++}; if (! isvector (xdata)) error ("imshow: xdata must be a vector") endif xdata = [xdata(1) xdata(end)]; - case "ydata"; + case "ydata" ydata = varargin{narg++}; if (! isvector (ydata)) - error ("imshow: expect a vector for ydata") + error ("imshow: ydata must be a vector") endif ydata = [ydata(1) ydata(end)]; - case {"truesize", "initialmagnification"} - warning ("image: zoom argument ignored -- use GUI features"); otherwise warning ("imshow: unrecognized property %s", arg); narg++; endswitch else - error ("imshow: argument number %d is invalid", narg+1); + error ("imshow: argument number %d is invalid", narg); endif endwhile @@ -159,41 +172,43 @@ switch (t) case {"double", "single", "logical"} display_range = [0, 1]; - case {"int8", "int16", "int32", "uint8", "uint16", "uint32"} + case {"uint8", "uint16", "int16"} display_range = [intmin(t), intmax(t)]; otherwise error ("imshow: invalid data type for image"); endswitch endif - nans = isnan (im(:)); - if (any (nans)) - warning ("Octave:imshow-NaN", - "imshow: pixels with NaN or NA values are set to minimum pixel value"); - im(nans) = display_range(1); + if (isfloat (im)) + nans = isnan (im(:)); + if (any (nans)) + warning ("Octave:imshow-NaN", + "imshow: pixels with NaN or NA values are set to minimum pixel value"); + im(nans) = display_range(1); + endif endif + ## FIXME: Commented out 2014/05/01. imagesc and 'clim' will automatically + ## take care of displaying out-of-range data clamped to the limits. + ## Eventually, this can be deleted if no problems arise. ## Clamp the image to the range boundaries - if (! (true_color || indexed || islogical (im))) - low = display_range(1); - high = display_range(2); - im(im < low) = low; - im(im > high) = high; - endif + ##if (! (truecolor || indexed || islogical (im))) + ## low = display_range(1); + ## high = display_range(2); + ## im(im < low) = low; + ## im(im > high) = high; + ##endif - if (true_color || indexed) - tmp = image (xdata, ydata, im); + if (truecolor || indexed) + htmp = image (xdata, ydata, im); else - tmp = image (xdata, ydata, im); - set (tmp, "cdatamapping", "scaled"); - ## The backend is responsible for scaling to clim if necessary. - set (gca (), "clim", display_range); + htmp = imagesc (xdata, ydata, im, display_range); endif - set (gca (), "visible", "off", "ydir", "reverse"); + set (gca (), "visible", "off"); axis ("image"); if (nargout > 0) - h = tmp; + h = htmp; endif endfunction @@ -239,5 +254,15 @@ %% Test input validation %!error imshow () %!error imshow ({"cell"}) +%!error imshow (ones (3,3,3, "uint32")) +%!error imshow (ones (3,3,3, "int16")) %!error imshow (ones (4,4,4)) +%!error imshow ([1,1], [2 0 0]) +%!error imshow ([1,1], [1 0 0 0]) +%!error imshow ([1,1], "colormap", [2 0 0]) +%!error imshow ([1,1], "xdata", ones (2,2)) +%!error imshow ([1,1], "ydata", ones (2,2)) +%!warning imshow ([1,1], "foobar") +%!error imshow ([1,1], {1}) +%!warning imshow ([1+i,1-i])