This file is indexed.

/usr/share/octave/packages/image-2.2.2/imtophat.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
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
## Copyright (C) 2005 Carvalho-Mariel
## Copyright (C) 2010-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} {} imtophat (@var{img}, @var{SE})
## Perform morphological top hat filtering.
##
## The matrix @var{img} must be numeric while @var{SE} can be a:
## @itemize @bullet
## @item
## strel object;
## @item
## array of strel objects as returned by `@@strel/getsequence';
## @item
## matrix of 0's and 1's.
## @end itemize
##
## A top hat transform corresponds to the difference between @var{img},
## and the opening of @var{img}, i.e., it is equivalent to:
## @example
## img - imopen (img, se);
## @end example
##
## Use @code{imbothat} to perform a 'black' or 'closing', top-hat transform
## (is is also known as bottom-hat transform).
##
## @seealso{imerode, imdilate, imopen, imclose, imbothat, mmgradm}
## @end deftypefn

function white = imtophat (img, se)

  if (nargin != 2)
    print_usage ();
  elseif (! isimage (img))
    error("imtophat: IMG must be a numeric matrix");
  endif
  se = prepare_strel ("imtophat", se);

  ## Perform filtering
  ## Note that in case that the transform is to applied to a logical image,
  ## subtraction must be handled in a different way (x & !y) instead of (x - y)
  ## or it will return a double precision matrix
  if (islogical (img))
    white = img & ! imopen (img, se);
  else
    white = img - imopen (img, se);
  endif

endfunction

%!assert (imtophat (ones (3), [1 1; 0 1]), zeros (3));
%!assert (imtophat (true (3), [1 1; 0 1]), false (3));

%!shared in, out, se
%! in =  [ 0   0   0   1   1   1   0   0   1   1
%!     0   1   0   1   1   1   0   0   0   1
%!     1   1   1   1   1   0   0   0   0   0
%!     0   1   1   1   1   0   0   0   0   0
%!     0   0   0   1   0   0   0   0   1   0
%!     0   0   0   0   0   0   0   1   1   1
%!     0   0   0   0   1   0   1   0   1   0
%!     0   0   0   1   1   1   1   1   0   0
%!     0   0   0   0   1   1   1   0   0   0
%!     0   0   0   1   1   1   0   0   0   0];
%!
%! out = [ 0   0   0   0   0   0   0   0   1   1
%!         0   1   0   0   0   0   0   0   0   1
%!         1   1   1   1   1   0   0   0   0   0
%!         0   1   1   1   1   0   0   0   0   0
%!         0   0   0   1   0   0   0   0   1   0
%!         0   0   0   0   0   0   0   1   1   1
%!         0   0   0   0   1   0   1   0   1   0
%!         0   0   0   1   1   1   1   1   0   0
%!         0   0   0   0   1   1   1   0   0   0
%!         0   0   0   1   1   1   0   0   0   0];
%!assert (imtophat (logical (in), ones (3)), logical (out));
%!
%! out = [12  19   0   0   0  16  23   0   7   0
%!        18   0   0   6   1  19   0   2   9   1
%!         0  74  81  12   7   0   1   8  15   7
%!        68  70   2  14   0   6   7  14  16   0
%!        69  76   8   0   0   7  14  21   0   1
%!         0   7  59  54  61  13  20   0   0  32
%!        18   0  69  60  62  19   0   0   0  27
%!        73   0   0  66  68   0   1   6   6  33
%!         0   0  17  19   1   0   2   9   7  14
%!         1   6  23   0   7   1   8  15   0  32];
%!assert (imtophat (magic (10), ones (3)), out);
%!assert (imtophat (uint8 (magic (10)), strel ("square", 3)), uint8 (out));
%!
%! ## using a se that will be decomposed in 2 pieces
%! out =[91  98   0   0   0  27  34  11  18   0
%!       94  76   3   6   1  33  15  17  24   1
%!        0  77  84  12   7  14  16  23  30   7
%!       80  82  14  18   0  32  34  41  43   0
%!       81  88  20   0   0  33  40  47  24   6
%!       12  19  63  57  64  16  23   0   7  39
%!       18   0  69  60  62  19   1   3  12  39
%!       73   0   0  66  68   0   2   9  18  45
%!        4   6  81  67  49   6   8  15  19  26
%!        5  12  87  48  55   7  14  21   0  32];
%!assert (imtophat (magic (10), ones(5)), out);
%!
%! ## using a weird non-symmetric and even-size se
%! out =[85  92   0   0   0  12  23   0  17   0
%!       91  73   0   6   0  18   0   2  13   0
%!        0  72  81  13   6   0   1   9  15   0
%!       60  62  10  12   0   8   8  17  17   0
%!       61  69   0   0   0  28  16  41   0   0
%!        0   0  47  52  61  12  16   0   0  31
%!        6   0  53  58  60  17   0   0   0  33
%!       69   0   0  60  62   0   0   6   0  33
%!        0   0  17  60  42   0   2  13   1   8
%!        0   6  23   0   7   0   7  15   0  14];
%!assert (imtophat (magic (10), [1 0 0 0; 1 1 1 0; 0 1 0 1]), out);
%!
%! ## N dimensional and weird se
%! in = reshape (magic(16), [4 8 4 2]);
%! se = ones (3, 3, 3);
%! se(:,:,1) = [1 0 1; 0 1 1; 0 0 0];
%! se(:,:,3) = [1 0 1; 0 1 1; 0 0 1];
%! out = zeros (size (in));
%! out(:,:,1,1) = [
%!   239  146   82   18    0   19   83  133
%!     0   35   99  163  219  128   64    0
%!     0   46  128  195  187  123   59    0
%!   157   93   47    0   14   78  142  211];
%! out(:,:,2,1) = [
%!     0   21   85  149  233  146   64    0
%!   205  128   64    0    0   41   87  151
%!   171  107   57    0    0   64  121  185
%!     0   64  142  213  169  105   41    0];
%! out(:,:,3,1) = [
%!   231  146   78   14    0   27   77  137
%!     0   43  107  167  211  128   64    0
%!     0   46  128  199  179  119   51    0
%!   149   85   39    0   18   78  142  219];
%! out(:,:,4,1) = [
%!     0   29   93  157  225  128   64    0
%!   197  128   64    0    0   31   95  159
%!   163   99   53    0    0   61  125  189
%!     0   64  146  221  161   97   33    0];
%! out(:,:,1,2) = [
%!   223  146   82   18    0   35   99  149
%!     0   48  115  179  203  128   64    0
%!     0   46  128  211  171  107   43    0
%!   141   77   31    0   14   78  142  227];
%! out(:,:,2,2) = [
%!     0   37  101  165  217  146   64    0
%!   189  125   64    0    0   57  103  167
%!   155   91   41    0    0   64  128  201
%!     0   64  142  229  153   89   25    0];
%! out(:,:,3,2) = [
%!   215  146   78   14    0   43   93  153
%!     0   48  123  183  195  128   64    0
%!     0   46  128  215  163  103   35    0
%!   133   69   23    0   18   78  142  235];
%! out(:,:,4,2) = [
%!     0   45  109  173  209  128   64    0
%!   181  117   64    0    0   47  111  175
%!   147   83   37    0    0   64  128  205
%!     0   64  146  237  145   81   17    0];
%!assert (imtophat (in, se), out);