Mercurial > octave
diff scripts/image/ind2gray.m @ 15683:806ea52af230
Overhaul m-files in image directory to provide better support for images stored as integers.
* NEWS: Add note about overhaul of image scripts to support integer
classes.
* brighten.m: Add demo.
* colormap.m: Better input validation.
* contrast.m: Re-position window in demo.
* gray2ind.m: Redo docstring. Match variables in docstring to function
prototype. Better input validation. Return integer class outputs as
Matlab does. Add %!tests.
* hsv2rgb.m: Add to docstring. Better input validation. Redo algorithm
to get rido of obsolete matrix-fill methods like kron(). Add %!tests.
* image.m: Redo docstring. Match variables in docstring to function
prototype. Better input validation without using for loops.
* imagesc.m: Redo docstring. Match variables in docstring to function
prototype. Remove DEPRECATEDZOOM functionality. Add demos.
* imfinfo.m: Redo docstring.
* ind2gray.m: Redo docstring. Match variables in docstring to function
prototype. Redo algorithm to directly calculate luminance value rather
than getting it from rgb2ntsc. Add %!tests.
* ind2rgb.m: Redo docstring. Better input validation. Add some %!tests.
* ntsc2rgb.m: Redo docstring. Better input validation. Add %!tests.
* rgb2hsv.m: Better input validation. Add %!tests.
* rgb2ind.m: Better input validation. Code algorithm in cleaner method
for ease of understanding.
* rgb2ntsc.m: Redo docstring: Better input validation. Add some %!tests.
author | Rik <rik@octave.org> |
---|---|
date | Tue, 27 Nov 2012 16:38:13 -0800 |
parents | 1f911333ed3d |
children | a1b634240352 |
line wrap: on
line diff
--- a/scripts/image/ind2gray.m Mon Nov 26 12:09:09 2012 -0500 +++ b/scripts/image/ind2gray.m Tue Nov 27 16:38:13 2012 -0800 @@ -17,11 +17,20 @@ ## <http://www.gnu.org/licenses/>. ## -*- texinfo -*- -## @deftypefn {Function File} {} ind2gray (@var{x}) -## @deftypefnx {Function File} {} ind2gray (@var{x}, @var{map}) -## Convert a color indexed image to a gray scale intensity image. +## @deftypefn {Function File} {@var{I} =} ind2gray (@var{x}) +## @deftypefnx {Function File} {@var{I} =} ind2gray (@var{x}, @var{map}) +## Convert a color indexed image to a grayscale intensity image. ## If @var{map} is omitted, the current colormap is used to determine the ## intensities. +## +## The output @var{I} is of the same class as the input @var{x} and may be +## one of @code{uint8}, @code{uint16}, @code{single}, or @code{double}. +## +## Implementation Note: There are several ways of converting colors to +## grayscale intensities. This functions uses the luminance value obtained +## from @code{rgb2ntsc} which is @code{I = 0.299*R + 0.587*G + 0.114*B}. +## Other possibilities include the value component from @code{rgb2hsv} or +## using a single color channel from @code{ind2rgb}. ## @seealso{gray2ind, ind2rgb} ## @end deftypefn @@ -29,22 +38,62 @@ ## Created: July 1994 ## Adapted-By: jwe -function y = ind2gray (x, map) +function I = ind2gray (x, map) if (nargin < 1 || nargin > 2) print_usage (); - elseif (nargin == 1) + endif + + if (! isreal (x) || issparse (x) + || (isfloat (x) && (any (x(:) < 1 || any (x(:) != fix (x(:))))))) + error ("ind2gray: X must be an indexed image"); + endif + cls = class (x); + if (! any (isa (x, {"logical", "uint8", "uint16", "single", "double"}))) + error ("ind2gray: invalid data type '%s'", cls); + endif + + if (nargin == 1) map = colormap (); + elseif (! iscolormap (map)) + error ("ind2gray: MAP must be a valid colormap"); + endif + + ## Convert colormap to luminance intensity values + map *= [0.299; 0.587; 0.114]; + + ## Convert colormap to same class as that of input so that + ## indexing in colormap will produce output of the same type as the input. + if (isinteger (x)) + map *= intmax (cls); + elseif (strcmp (cls, "single")) + map = single (map); endif - [rows, cols] = size (x); - - ## Convert colormap to intensity values (the first column of the - ## result of the call to rgb2ntsc) and then replace indices in - ## the input matrix with indexed values in the output matrix (indexed - ## values are the result of indexing the intensity values by the - ## elements of x(:)). - - y = reshape (((rgb2ntsc (map))(:,1))(x(:)), rows, cols); + ## Replace indices in the input matrix with the indexed luminance value. + I = reshape (map(x(:)), size (x)); endfunction + + +%!test +%! i2g = ind2gray (1:100, gray (100)); +%! assert (i2g, 0:1/99:1, eps); +%! g2i = gray2ind (i2g, 100); +%! assert (g2i, uint8 (1:100)); + +%%test input validation +%!error ind2gray () +%!error ind2gray (1,2,3) +%!error <X must be an indexed image> ind2gray ({1}) +%!error <X must be an indexed image> ind2gray (1+i) +%!error <X must be an indexed image> ind2gray (sparse (1)) +%!error <X must be an indexed image> ind2gray (0) +%!error <X must be an indexed image> ind2gray (1.1) +%!error <MAP must be a valid colormap> ind2gray (1, {1}) +%!error <MAP must be a valid colormap> ind2gray (1, 1+i) +%!error <MAP must be a valid colormap> ind2gray (1, ones (2,2,2)) +%!error <MAP must be a valid colormap> ind2gray (1, ones (2,4)) +%!error <MAP must be a valid colormap> ind2gray (1, [-1]) +%!error <MAP must be a valid colormap> ind2gray (1, [2]) +