Mercurial > octave-dspies
changeset 18713:0585787aa8ae
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.
author | Rik <rik@octave.org> |
---|---|
date | Thu, 01 May 2014 12:31:06 -0700 |
parents | d57a83f2d73e |
children | c79696701468 |
files | scripts/image/imshow.m |
diffstat | 1 files changed, 57 insertions(+), 32 deletions(-) [+] |
line wrap: on
line diff
--- 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 <IM must be an image> imshow ({"cell"}) +%!error <TrueColor image must be uint8> imshow (ones (3,3,3, "uint32")) +%!error <TrueColor image must be uint8> imshow (ones (3,3,3, "int16")) %!error <expecting MxN or MxNx3 matrix> imshow (ones (4,4,4)) +%!error <invalid colormap MAP> imshow ([1,1], [2 0 0]) +%!error <argument number 2 is invalid> imshow ([1,1], [1 0 0 0]) +%!error <invalid colormap> imshow ([1,1], "colormap", [2 0 0]) +%!error <xdata must be a vector> imshow ([1,1], "xdata", ones (2,2)) +%!error <ydata must be a vector> imshow ([1,1], "ydata", ones (2,2)) +%!warning <unrecognized property foobar> imshow ([1,1], "foobar") +%!error <argument number 2 is invalid> imshow ([1,1], {1}) +%!warning <only showing real part of complex image> imshow ([1+i,1-i])