Mercurial > octave
changeset 20736:842765b159ed
New function im2double ported from the image package.
* scripts/image/im2double.m: new function that has been ported by
merging bits from im2double and imcast from the Octave Forge
image package.
* scripts/image/module.mk: add im2double.m to the build.
* NEWS: add im2double.m to new functions for 4.2.
* doc/interpreter/image.txi: mention im2double in the manual.
author | Carnë Draug <carandraug@octave.org> |
---|---|
date | Mon, 23 Nov 2015 15:25:54 +0000 |
parents | 418ae0cb752f |
children | 1a329319975b |
files | NEWS doc/interpreter/image.txi scripts/image/im2double.m scripts/image/module.mk |
diffstat | 4 files changed, 127 insertions(+), 1 deletions(-) [+] |
line wrap: on
line diff
--- a/NEWS Sun Nov 22 20:25:17 2015 -0800 +++ b/NEWS Mon Nov 23 15:25:54 2015 +0000 @@ -60,11 +60,13 @@ ** Other new functions added in 4.2: - psi rad2deg deg2rad + im2double + psi odeset odeget ode45 + rad2deg ** Deprecated functions.
--- a/doc/interpreter/image.txi Sun Nov 22 20:25:17 2015 -0800 +++ b/doc/interpreter/image.txi Mon Nov 23 15:25:54 2015 +0000 @@ -140,6 +140,8 @@ an RGB color. The color map must be of class @code{double} with values between 0 and 1. +@DOCSTRING(im2double) + @DOCSTRING(iscolormap) @DOCSTRING(gray2ind)
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/scripts/image/im2double.m Mon Nov 23 15:25:54 2015 +0000 @@ -0,0 +1,121 @@ +## Copyright (C) 2007-2015 Søren Hauberg +## Copyright (C) 2012-2015 Carnë Draug +## +## This file is part of Octave. +## +## Octave is free software; you can redistribute it and/or modify it +## under the terms of the GNU General Public License as published by +## the Free Software Foundation; either version 3 of the License, or (at +## your option) any later version. +## +## Octave is distributed in the hope that it will be useful, but +## WITHOUT ANY WARRANTY; without even the implied warranty of +## MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +## General Public License for more details. +## +## You should have received a copy of the GNU General Public License +## along with Octave; see the file COPYING. If not, see +## <http://www.gnu.org/licenses/>. + +## -*- texinfo -*- +## @deftypefn {Function File} {} im2double (@var{img}) +## @deftypefnx {Function File} {} im2double (@var{img}, "indexed") +## Convert image to double precision. +## +## The conversion of @var{img} to double precision, is dependent +## on the type of input image. The following input classes are +## supported: +## +## @table @samp +## @item uint8, uint16, and int16 +## The range of values from the class is scaled to the interval [0 1]. +## +## @item logical +## True and false values are assigned a value of 0 and 1 respectively. +## +## @item single +## Values are cast to double. +## +## @item double +## Returns the same image. +## +## @end table +## +## If the second argument is the string @qcode{"indexed"}, then values are +## cast to double precision, and a +1 offset is applied if input is +## an integer class. +## +## @seealso{double} +## @end deftypefn + +## Author: Søren Hauberg <soren@hauberg.org> +## Author: Carnë Draug <carandraug@octave.org> + +function img = im2double (img, im_type) + ## "normal" (non-indexed) images + if (nargin () == 1) + switch (class (img)) + case "uint8", img = double (img) / 255; + case "uint16", img = double (img) / 65535; + case "int16", img = (double (img) + 32768) / 65535; + case "single", img = double (img); + case "logical", img = double (img); + case "double", # do nothing + otherwise, error ("im2double: IMG is of unsupported class \"%s\"", class (img)); + endswitch + + ## indexed images + elseif (nargin () == 2) + if (! strcmpi (im_type, "indexed")) + error ("im2double: second input argument must be the string \"indexed\""); + elseif (any (isa (img, {"uint8", "uint16"}))) + img = double (img) + 1; + elseif (isfloat (img) && isindex (img)) + img = double (img); + else + error (["im2double: if IMG is indexed, then it must be positive " ... + "integer floating points or unsigned integer class"]); + endif + + else + print_usage (); + endif +endfunction + +%!assert (im2double ([1 2 3]), [1 2 3]) +%!assert (im2double (single ([1 2 3])), [1 2 3]) +%!assert (im2double (uint8 ([0 127 128 255])), [0 127/255 128/255 1]) +%!assert (im2double (uint16 ([0 127 128 65535])), [0 127/65535 128/65535 1]) +%!assert (im2double (int16 ([-32768 -32767 -32766 32767])), +%! [0 1/65535 2/65535 1]) + +%!assert (im2double (uint8 ([0 1 255]), "indexed"), [1 2 256]) +%!assert (im2double (uint16 ([0 1 2557]), "indexed"), [1 2 2558]) +%!assert (im2double ([3 25], "indexed"), [3 25]) +%!assert (im2double (single ([3 25]), "indexed"), [3 25]) + +## Test for ND input +%!function test_im2double_nd (cls, low, high) +%! in = rand (2, 4, 2, 3, 2); +%! in *= high - low; +%! in += low; +%! in = cast (in, cls); +%! out = zeros (size (in)); +%! for n = 1:12 +%! out(:,:,n) = im2double (in(:,:,n)); +%! endfor +%! assert (im2double (in), out) +%!endfunction + +%!test +%! test_im2double_nd ("double", 0, 1); +%! test_im2double_nd ("single", 0, 1); +%! test_im2double_nd ("uint8", 0, 255); +%! test_im2double_nd ("uint16", 0, 6535); +%! test_im2double_nd ("int16", -32768, 32767); + +%!error <positive integer floating> im2double (single ([0 1 2]), "indexed"); +%!error <unsigned integer class> im2double (int16 ([17 8]), "indexed"); +%!error <unsigned integer class> im2double (int16 ([-7 8]), "indexed"); +%!error <unsigned integer class> im2double ([false true], "indexed"); +%!error <must be the string "indexed"> im2double ([1 2 3], "non-indexed");
--- a/scripts/image/module.mk Sun Nov 22 20:25:17 2015 -0800 +++ b/scripts/image/module.mk Mon Nov 23 15:25:54 2015 +0000 @@ -31,6 +31,7 @@ scripts/image/hsv.m \ scripts/image/hsv2rgb.m \ scripts/image/iscolormap.m \ + scripts/image/im2double.m \ scripts/image/image.m \ scripts/image/imagesc.m \ scripts/image/imfinfo.m \