Mercurial > forge
view main/image/inst/im2bw.m @ 11220:f071ba771468 octave-forge
im2bw: fix tests
author | carandraug |
---|---|
date | Thu, 08 Nov 2012 16:29:38 +0000 |
parents | 07fcc3ae8ac3 |
children |
line wrap: on
line source
## Copyright (C) 2000 Kai Habel <kai.habel@gmx.de> ## Copyright (C) 2012 Carnë Draug <carandraug+dev@gmail.com> ## ## 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} {@var{BW} =} im2bw (@var{img}, threshold) ## @deftypefnx {Function File} {@var{BW} =} im2bw (@var{X}, @var{cmap}, threshold) ## Convert image to binary, black and white, by threshold. ## ## The input image @var{img} can either be a grayscale or RGB image. In the later ## case, @var{img} is first converted to grayscale with @code{rgb2gray}. Input ## can also be an indexed image @var{X} in which case the colormap @var{cmap} ## needs to be specified. ## ## The value of @var{threshold} should be in the range [0,1] independently of the ## class of @var{img}. Values from other classes can be converted to the correct ## value with @code{im2double} for example. For an automatic threshold, consider ## using @code{graythresh}. ## ## @example ## @group ## bw = im2bw (img, graythresh (img)); ## @end group ## @end example ## ## @seealso{graythresh, ind2gray, rgb2gray} ## @end deftypefn function BW = im2bw (img, cmap, thres) if (nargin < 1 || nargin > 3) print_usage; elseif (nargin == 3 && !isind (img)) error ("im2bw: there must be only two arguments for non indexed images") elseif (nargin == 3 && !iscolormap (cmap)) error ("im2bw: `cmap' must be the a colormap for indexed images") elseif (nargin == 2) thres = cmap; endif if (!isnumeric (thres) || !isscalar (thres) || !isreal (thres) || !isa (thres, "double") || thres < 0 || thres > 1) error ("im2bw: `threshold' must be a scalar of class double in the interval [0, 1]") endif ## Convert img to gray scale if (nargin == 3) ## indexed image (we already checked that is indeed indexed earlier) img = ind2gray (img, cmap); elseif (isrgb (img)) img = rgb2gray (img); elseif (isgray (img)) ## do nothing. All is good else error ("im2bw: first input argument must be an image"); endif ## Convert the threshold value to same image class to do the thresholding which ## is faster than converting the image to double and keep the threshold value switch (class (img)) case {"double", "single"} ## do nothing case {"uint8"} thres = im2uint8 (thres); case {"uint16"} thres = im2uint16 (thres); case {"int16"} thres = im2int16 (thres); otherwise ## we should have never got here in the first place anyway error("im2bw: unsupported image class"); endswitch BW = (img > thres); # matlab compatible (not "greater than or equal") endfunction %!assert(im2bw ([0 0.4 0.5 0.6 1], 0.5), logical([0 0 0 1 1])); # basic usage %!assert(im2bw (uint8 ([0 100 255]), 0.5), logical([0 0 1])); # with a uint8 input