This file is indexed.

/usr/share/octave/packages/image-2.2.2/bwconncomp.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
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
## Copyright (C) 2010 Søren Hauberg <soren@hauberg.org>
## Copyright (C) 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} {@var{cc} =} bwconncomp (@var{bw})
## @deftypefnx {Function File} {@var{cc} =} bwconncomp (@var{bw}, @var{conn})
## Find connected objects.
##
## Elements from the matrix @var{bw}, belong to an object if they have a
## non-zero value.  The output @var{cc} is a structure with information about
## each object;
##
## @table @asis
## @item @qcode{"Connectivity"}
## The connectivity used in the boundary tracing. This may be different from
## the input argument, e.g., if @var{conn} is defined as a matrix of 1s and
## size 3x3, the @qcode{"Connectivity"} value will still be 8.
##
## @item @qcode{"ImageSize"}
## The size of the matrix @var{bw}.
##
## @item @qcode{"NumObjects"}
## The number of objects in the image @var{bw}.
##
## @item @qcode{"PixelIdxList"}
## A cell array with linear indices for each element of each object in @var{bw}
## A cell array containing where each element corresponds to an object in @var{BW}.
## Each element is represented as a vector of linear indices of the boundary of
## the given object.
##
## @end table
##
## Element connectivity @var{conn}, to define the size of objects, can be
## specified with a numeric scalar (number of elements in the neighborhood):
##
## @table @samp
## @item 4 or 8
## for 2 dimensional matrices;
## @item 6, 18 or 26
## for 3 dimensional matrices;
## @end table
##
## or with a binary matrix representing a connectivity array.  Defaults to
## @code{conndef (ndims (@var{bw}), "maximal")} which is equivalent to
## @var{conn} of 8 and 26 for 2 and 3 dimensional matrices respectively.
##
## @seealso{bwlabel, bwlabeln, bwboundaries, ind2sub, regionprops}
## @end deftypefn

function CC = bwconncomp (bw, N)

  if (nargin < 1 || nargin > 2)
    print_usage ();
  elseif (! ismatrix (bw) || ! (isnumeric (bw) || islogical (bw)))
    error ("bwconncomp: BW must be an a numeric matrix");
  endif
  if (nargin < 2)
    ## Defining default connectivity here because it's dependent
    ## on the first argument
    N = conndef (ndims (bw), "maximal");
  endif
  [conn, N] = make_conn ("bwconncomp", 2, ndims (bw), N);

  [bw, n_obj] = bwlabeln (logical (bw), conn);
  ## We should probably implement this as the first part of bwlabeln
  ## as getting the indices is the first part of its code. Here we are
  ## just reverting the work already done.
  P = arrayfun (@(x) find (bw == x), 1:n_obj, "UniformOutput", false);

  ## Return result
  CC = struct ("Connectivity",  N,
               "ImageSize",     size (bw),
               "NumObjects",    n_obj,
               "PixelIdxList",  {P});
endfunction

%!test
%! a = rand (10) > 0.5;
%! cc = bwconncomp (a, 4);
%! assert (cc.Connectivity, 4)
%! assert (cc.ImageSize, [10 10])
%!
%! b = false (10);
%! for i = 1:numel (cc.PixelIdxList)
%!   b(cc.PixelIdxList{i}) = true;
%! endfor
%! assert (a, b)

%!test
%! a = rand (10, 13) > 0.5;
%! cc = bwconncomp (a, 4);
%! assert (cc.ImageSize, [10 13])
%!
%! b = false (10, 13);
%! for i = 1:numel (cc.PixelIdxList)
%!   b(cc.PixelIdxList{i}) = true;
%! endfor
%! assert (a, b)

%!test
%! a = rand (15) > 0.5;
%! conn_8 = bwconncomp (a, 8);
%! assert (conn_8, bwconncomp (a))
%! assert (conn_8, bwconncomp (a, ones (3)))
%! assert (conn_8.Connectivity, 8)
%! assert (bwconncomp (a, ones (3)).Connectivity, 8)
%! assert (bwconncomp (a, [0 1 0; 1 1 1; 0 1 0]).Connectivity, 4)

## test that PixelIdxList is a row vector
%!test
%! a = rand (40, 40) > 0.2;
%! cc = bwconncomp (a, 4);
%! assert (rows (cc.PixelIdxList), 1)
%! assert (columns (cc.PixelIdxList) > 1)