/usr/share/octave/packages/image-2.2.2/im2bw.m is in octave-image 2.2.2-1.
This file is owned by root:root, with mode 0o644.
The actual contents of the file can be viewed below.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 | ## Copyright (C) 2000 Kai Habel <kai.habel@gmx.de>
## Copyright (C) 2012, 2013 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} {} im2bw (@var{img}, threshold)
## @deftypefnx {Function File} {} 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 = 0.5)
if (nargin < 1 || nargin > 3)
print_usage ();
elseif (nargin == 3 && ! isind (img))
error ("im2bw: IMG must be an indexed image when are 3 input arguments");
elseif (nargin == 3 && ! iscolormap (cmap))
error ("im2bw: CMAP must be a colormap");
elseif (nargin == 2)
thres = cmap;
endif
if (! isimage (img))
error ("im2bw: IMG must be an image");
elseif (! isnumeric (thres) || ! isscalar (thres) || ! isreal (thres) ||
thres < 0 || thres > 1)
error ("im2bw: THRESHOLD must be a scalar in the interval [0, 1]");
endif
if (islogical (img))
warning ("im2bw: IMG is already binary so nothing is done");
BW = img;
return
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);
else
## Everything else, we do nothing, no matter how many dimensions
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
## This will issue a warning
%!assert (im2bw (logical ([0 1 0])), logical ([0 1 0]))
%!assert (im2bw (logical ([0 1 0]), 0), logical ([0 1 0]))
%!assert (im2bw (logical ([0 1 0]), 1), logical ([0 1 0]))
|