Mercurial > hg > octave-image
diff src/connectivity.cc @ 906:475a5a2a08cb
Fix make rules and handling of "shared" libraries.
* Makefile: we wanted to have shared libraries for strel.so and
connectivity.so but that's not really possible (Octave's pkg does not
have a system to handle this). So we create object files and statically
link them. This the closest we can do at the moment. Also change setting
CXXFLAGS to only add '-std=c++0x' rather than defining all the other options
again.
* conndef.h, connectivity.h: renamed the first as the later.
* conndef.cc: moved the definition of the connectivity class into its own
connectivity.cc file and include that. The idea is to then create a shared
library without Fconndef and Fiptcheckconn but that did not reallt happen yet.
* connectivity.cc: definition of the connectivity class, from conndef.cc.
* bwlabeln.cc: change the include for the name connectivity header file.
* COPYING: update license for the new files.
author | Carnë Draug <carandraug@octave.org> |
---|---|
date | Thu, 30 Oct 2014 21:34:55 +0000 (2014-10-30) |
parents | src/conndef.cc@f34897bc944f |
children | 5e256614c376 |
line wrap: on
line diff
copy from src/conndef.cc copy to src/connectivity.cc --- a/src/conndef.cc +++ b/src/connectivity.cc @@ -15,7 +15,7 @@ // <http://www.gnu.org/licenses/>. #include <octave/oct.h> -#include "conndef.h" +#include "connectivity.h" using namespace octave::image; @@ -238,259 +238,3 @@ return mask; } - -// The conndef() function is really really simple and could have easily -// been a m file (actually it once was, check the hg log if it ever needs -// to be recovered) but then it would be awkward to call it from oct -// functions so we made a C++ class for it. - -DEFUN_DLD(conndef, args, , "\ --*- texinfo -*-\n\ -@deftypefn {Loadable Function} {} conndef (@var{conn})\n\ -@deftypefnx {Loadable Function} {} conndef (@var{ndims}, @var{type})\n\ -Create connectivity array.\n\ -\n\ -Creates a matrix of for morphological operations, where elements with\n\ -a value of 1 are considered connected to the center element (a\n\ -connectivity array).\n\ -\n\ -It can be specified by the number of dimensions, @var{ndims}, and\n\ -@var{type} which must be one of the following strings:\n\ -\n\ -@table @asis\n\ -@item @qcode{\"minimal\"}\n\ -Neighbours touch the central element on a (@var{ndims}-1)-dimensional\n\ -surface.\n\ -\n\ -@item @qcode{\"maximal\"}\n\ -Neighbours touch the central element in any way. Equivalent to\n\ -@code{ones (repmat (3, 1, @var{ndims}))}.\n\ -\n\ -@end table\n\ -\n\ -or the number of connected elements to the center element, @var{conn},\n\ -in which case the following are valid:\n\ -\n\ -@table @asis\n\ -@item 4\n\ -Two-dimensional 4-connected neighborhood.\n\ -\n\ -@item 8\n\ -Two-dimensional 8-connected neighborhood.\n\ -\n\ -@item 6\n\ -Three-dimensional 6-connected neighborhood.\n\ -\n\ -@item 18\n\ -Three-dimensional 18-connected neighborhood.\n\ -\n\ -@item 26\n\ -Three-dimensional 26-connected neighborhood.\n\ -\n\ -@end table\n\ -\n\ -\n\ -@seealso{iptcheckconn, strel}\n\ -@end deftypefn") -{ - const octave_idx_type nargin = args.length (); - - if (nargin < 1 || nargin > 2) - { - print_usage (); - return octave_value (); - } - const octave_idx_type arg0 = args(0).idx_type_value (true); - if (error_state || arg0 < 1) - { - error ("conndef: NDIMS and CONN must be a positive integer"); - return octave_value (); - } - - connectivity conn; - if (nargin == 1) - { - try - {conn = connectivity (arg0);} - catch (invalid_connectivity& e) - { - error ("conndef: CONN %s", e.what ()); - return octave_value (); - } - } - else - { - const std::string type = args(1).string_value (); - if (error_state) - { - error ("conndef: TYPE must be a string"); - return octave_value (); - } - try - {conn = connectivity (arg0, type);} - catch (invalid_connectivity& e) - { - error ("conndef: TYPE %s", e.what ()); - return octave_value (); - } - } - - // we must return an array of class double - return octave_value (NDArray (conn.mask)); -} - - -/* - -%!assert (conndef (1, "minimal"), [1; 1; 1]); -%!assert (conndef (2, "minimal"), [0 1 0; 1 1 1; 0 1 0]); - -%!test -%! C = zeros (3, 3, 3); -%! C(:,2,2) = 1; -%! C(2,:,2) = 1; -%! C(2,2,:) = 1; -%! assert (conndef (3, "minimal"), C); - -%!test -%! C = zeros (3, 3, 3, 3); -%! C(:,:,2,1) = [0 0 0 -%! 0 1 0 -%! 0 0 0]; -%! C(:,:,1,2) = [0 0 0 -%! 0 1 0 -%! 0 0 0]; -%! C(:,:,2,2) = [0 1 0 -%! 1 1 1 -%! 0 1 0]; -%! C(:,:,3,2) = [0 0 0 -%! 0 1 0 -%! 0 0 0]; -%! C(:,:,2,3) = [0 0 0 -%! 0 1 0 -%! 0 0 0]; -%! assert (conndef (4, "minimal"), C); - -%!assert (conndef (1, "maximal"), ones (3, 1)); -%!assert (conndef (2, "maximal"), ones (3, 3)); -%!assert (conndef (3, "maximal"), ones (3, 3, 3)); -%!assert (conndef (4, "maximal"), ones (3, 3, 3, 3)); - -%!assert (nnz (conndef (3, "minimal")), 7) -%!assert (nnz (conndef (4, "minimal")), 9) -%!assert (nnz (conndef (5, "minimal")), 11) -%!assert (nnz (conndef (6, "minimal")), 13) - -%!assert (find (conndef (3, "minimal")), [5 11 13 14 15 17 23](:)) -%!assert (find (conndef (4, "minimal")), [14 32 38 40 41 42 44 50 68](:)) -%!assert (find (conndef (5, "minimal")), -%! [ 41 95 113 119 121 122 123 125 131 149 203](:)) -%!assert (find (conndef (6, "minimal")), -%! [ 122 284 338 356 362 364 365 366 368 374 392 446 608](:)) - -%!error conndef () -%!error <must be a positive integer> conndef (-2, "minimal") -%!error conndef (char (2), "minimal") -%!error conndef ("minimal", 3) -%!error <TYPE must be "maximal" or "minimal"> conndef (3, "invalid") -%!error <CONN must be in the set> conndef (10) - -%!assert (conndef (2, "minimal"), conndef (4)) -%!assert (conndef (2, "maximal"), conndef (8)) -%!assert (conndef (3, "minimal"), conndef (6)) -%!assert (conndef (3, "maximal"), conndef (26)) - -%!assert (conndef (18), reshape ([0 1 0 1 1 1 0 1 0 -%! 1 1 1 1 1 1 1 1 1 -%! 0 1 0 1 1 1 0 1 0], [3 3 3])) -*/ - -// PKG_ADD: autoload ("iptcheckconn", which ("conndef")); -// PKG_DEL: autoload ("iptcheckconn", which ("conndef"), "remove"); -DEFUN_DLD(iptcheckconn, args, , "\ --*- texinfo -*-\n\ -@deftypefn {Loadable Function} {} iptcheckconn (@var{conn}, @var{func}, @var{var})\n\ -@deftypefnx {Loadable Function} {} iptcheckconn (@var{conn}, @var{func}, @var{var}, @var{pos})\n\ -Check if argument is valid connectivity.\n\ -\n\ -If @var{conn} is not a valid connectivity argument, gives a properly\n\ -formatted error message. @var{func} is the name of the function to be\n\ -used on the error message, @var{var} the name of the argument being\n\ -checked (for the error message), and @var{pos} the position of the\n\ -argument in the input.\n\ -\n\ -A valid connectivity argument must be either double or logical. It must\n\ -also be either a scalar from set [4 6 8 18 26], or a symmetric matrix\n\ -with all dimensions of size 3, with only 0 or 1 as values, and 1 at its\n\ -center.\n\ -\n\ -@seealso{conndef}\n\ -@end deftypefn") -{ - const octave_idx_type nargin = args.length (); -// const octave_value rv = octave_value (); - - if (nargin < 3 || nargin > 4) - { - print_usage (); - return octave_value (); - } - - const std::string func = args(1).string_value (); - if (error_state) - { - error ("iptcheckconn: FUNC must be a string"); - return octave_value (); - } - const std::string var = args(2).string_value (); - if (error_state) - { - error ("iptcheckconn: VAR must be a string"); - return octave_value (); - } - octave_idx_type pos (0); - if (nargin > 3) - { - pos = args(3).idx_type_value (true); - if (error_state || pos < 1) - { - error ("iptcheckconn: POS must be a positive integer"); - return octave_value (); - } - } - - try - {const connectivity conn (args(0));} - catch (invalid_connectivity& e) - { - if (pos == 0) - error ("%s: %s %s", func.c_str (), var.c_str (), e.what ()); - else - error ("%s: %s, at pos %i, %s", - func.c_str (), var.c_str (), pos, e.what ()); - } - return octave_value (); -} - -/* -// the complete error message should be "expected error <.> but got none", -// but how to escape <> within the error message? - -%!error <expected error> fail ("iptcheckconn ( 4, 'func', 'var')"); -%!error <expected error> fail ("iptcheckconn ( 6, 'func', 'var')"); -%!error <expected error> fail ("iptcheckconn ( 8, 'func', 'var')"); -%!error <expected error> fail ("iptcheckconn (18, 'func', 'var')"); -%!error <expected error> fail ("iptcheckconn (26, 'func', 'var')"); - -%!error <expected error> fail ("iptcheckconn (1, 'func', 'var')"); -%!error <expected error> fail ("iptcheckconn (ones (3, 1), 'func', 'var')"); -%!error <expected error> fail ("iptcheckconn (ones (3, 3), 'func', 'var')"); -%!error <expected error> fail ("iptcheckconn (ones (3, 3, 3), 'func', 'var')"); -%!error <expected error> fail ("iptcheckconn (ones (3, 3, 3, 3), 'func', 'var')"); - -%!error <VAR must be logical or in> iptcheckconn (3, "func", "VAR"); -%!error <VAR center is not true> iptcheckconn ([1 1 1; 1 0 1; 1 1 1], "func", "VAR"); -%!error <VAR must be logical or in> iptcheckconn ([1 2 1; 1 1 1; 1 1 1], "func", "VAR"); -%!error <VAR is not symmetric relative to its center> iptcheckconn ([0 1 1; 1 1 1; 1 1 1], "func", "VAR"); -%!error <VAR is not 3x3x...x3> iptcheckconn (ones (3, 3, 3, 4), "func", "VAR"); -*/