Mercurial > hg > octave-image
changeset 911:7f3f027bcbf0
New function imattributes to display attributes of figure in console.
* imattributes.m: m file for new function. This function is pretty much
in a program but may be useful in an interactive session to display on the
console properties of the current figure.
* COPYING, INDEX, NEWS: add new function to al lists.
author | Carnë Draug <carandraug@octave.org> |
---|---|
date | Sun, 09 Nov 2014 23:47:18 +0000 |
parents | cda9868e7641 |
children | a67048847848 |
files | COPYING INDEX NEWS inst/imattributes.m |
diffstat | 4 files changed, 157 insertions(+), 0 deletions(-) [+] |
line wrap: on
line diff
--- a/COPYING +++ b/COPYING @@ -70,6 +70,7 @@ inst/imabsdiff.m GPLv3+ inst/imadd.m GPLv3+ inst/imadjust.m GPLv3+ +inst/imattributes GPLv3+ inst/imbothat.m GPLv3+ inst/imcast.m GPLv3+ inst/imclose.m GPLv3+
--- a/INDEX +++ b/INDEX @@ -142,6 +142,7 @@ Utilities checkerboard getrangefromclass + imattributes iptcheckconn iptcheckmap iptnum2ordinal
--- a/NEWS +++ b/NEWS @@ -5,6 +5,7 @@ bwareafilt bwpropfilt + imattributes imcast ** The implementation of normxcorr2 has been changed. The new method is
new file mode 100644 --- /dev/null +++ b/inst/imattributes.m @@ -0,0 +1,154 @@ +## Copyright (C) 2014 Carnë Draug <carandraug@octave.org> +## +## This program 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. +## +## This program 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 this program; if not, see +## <http:##www.gnu.org/licenses/>. + +## -*- texinfo -*- +## @deftypefn {Function File} {} imattributes () +## @deftypefnx {Function File} {} imattributes (@var{himage}) +## Get information about image attributes. +## +## Return attributes for the image in the current figure or in the image +## handle @var{himage}. Returns a struct with the fields: +## +## @table @asis +## @item @qcode{"Width"} +## Number of columns. +## +## @item @qcode{"Height"} +## Number of rows. +## +## @item @qcode{"Class"} +## Note that some classes are converted to double for display. +## +## @item @qcode{"Image type"} +## One of @qcode{"binary"}, @qcode{"truecolor"}, @qcode{"intensity"}, or +## @qcode{"indexed"}. +## +## @item @qcode{"Minimum intensity"} +## @itemx @qcode{"Maximum intensity"} +## These values are not returned for images of type @qcode{"truecolor"} +## and @qcode{"binary"}. +## +## For indexed images, the returned values are the lowest and highest index +## for the colormap, @emph{not} the used index for the lowest or highest +## intensity or their values. This weird behaviour is kept for Matlab +## compatibility. +## @end table +## +## This function is meant to be used in an interactive session, and not +## programatically. The properties of an image should be measured from the +## image variavle itself not from the figure object. In addition this +## function is purposedly Matlab incompatible on their return value which +## returns a cell array of strings which is only useful for display. +## +## @end deftypefn + +function attr = imattributes (imgh = gcf ()) + + if (nargin > 1) + print_usage (); + elseif (isa (imgh, "imagemodel")) + ## FIXME we don't even have a imagemodel class yet but when we do, this + ## is already here + error ("imattributes: support for imagemodel objects not yet implemented"); + endif + + while (! isempty (get (imgh, "children"))) + imgh = get (imgh, "children"); + endwhile + cdata = get (imgh, "cdata"); + cdatamapping = get (imgh, "cdatamapping"); + + if (isbool (cdata)) + img_type = "binary"; + elseif (ndims (cdata) == 3) + img_type = "truecolor"; + elseif (strcmpi (cdatamapping, "direct")) + img_type = "indexed"; + else + img_type = "intensity"; + endif + + ## Implementation note: this function returns a struct while Matlab returns + ## a cell array of strings (even for the numeric values). It is completely + ## useless in programs, so I can only assume it is meant to be used + ## interactively. If so, a cell array is useless for us because Octave does + ## not display cell arrays columns aligned but a struct looks good. + + attr = struct ( + "Width (columns)", columns (cdata), + "Height (rows)", rows (cdata), + "Class", class (cdata), + "Image type", img_type + ); + + ## Matlab compatibility: for indexed images, we still give the lowest + ## and highest index to the colormap. + if (! any (strcmp (img_type, {"binary", "truecolor"}))) + attr = setfield (attr, "Minimum intensity", min (cdata(:))); + attr = setfield (attr, "Maximum intensity", max (cdata(:))); + endif + +endfunction + +%!shared x, map, img, rgb, bw +%! [x, map] = imread ("default.img"); +%! rgb = ind2rgb (x, map); +%! img = ind2gray (x, map); +%! bw = im2bw (img); + +%!test +%! h = imshow (img); +%! a = imattributes (h); +%! assert ([a.Height a.Width], [53 40]); +%! assert (a.Class, "uint8"); +%! assert (a.("Image type"), "intensity"); +%! assert (a.("Minimum intensity"), uint8 (28)); +%! assert (a.("Maximum intensity"), uint8 (250)); + +## FIXME this is a bug upstream, the original class is not always preserved +%!xtest +%! h = imshow (rgb); +%! a = imattributes (h); +%! assert ([a.Height a.Width], [53 40]); +%! assert (a.Class, "uint8"); +%! assert (a.("Image type"), "truecolor"); +%! assert (isfield (a, "Minimum intensity"), false); +%! assert (isfield (a, "Maximum intensity"), false); + +%!test +%! h = imshow (bw); +%! a = imattributes (h); +%! assert ([a.Height a.Width], [53 40]); +%! assert (a.Class, "logical"); +%! assert (a.("Image type"), "binary"); +%! assert (isfield (a, "Minimum intensity"), false); +%! assert (isfield (a, "Maximum intensity"), false); + +%!test +%! h = imshow (x, map); +%! a = imattributes (h); +%! assert ([a.Height a.Width], [53 40]); +%! assert (a.Class, "uint8"); +%! assert (a.("Image type"), "indexed"); +%! assert (a.("Minimum intensity"), uint8 (0)); +%! assert (a.("Maximum intensity"), uint8 (55)); + +%!test +%! h = imshow (img); +%! a1 = imattributes (); +%! a2 = imattributes (h); +%! assert (a1, a2); +