Mercurial > hg > octave-image
diff src/conndef.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 | f34897bc944f |
children |
line wrap: on
line diff
--- a/src/conndef.cc +++ b/src/conndef.cc @@ -15,230 +15,10 @@ // <http://www.gnu.org/licenses/>. #include <octave/oct.h> -#include "conndef.h" +#include "connectivity.h" using namespace octave::image; -connectivity::connectivity () -{ -} - -connectivity::connectivity (const octave_value& val) -{ - try - { - const double conn = double_value (val); - if (error_state) - throw invalid_connectivity ("must be in [4 6 8 18 26]"); - ctor (conn); - } - catch (invalid_connectivity& e) - { - const boolNDArray mask = bool_array_value (val); - if (error_state) - throw invalid_connectivity ("must be logical or in [4 6 8 18 26]"); - ctor (mask); - } - return; -} - - -connectivity::connectivity (const boolNDArray& mask) -{ - ctor (mask); - return; -} - -void -connectivity::ctor (const boolNDArray& mask) -{ - // Must be 1x1, 3x1, or 3x3x3x...x3 - const octave_idx_type numel = mask.numel (); - const octave_idx_type ndims = mask.ndims (); - const dim_vector dims = mask.dims (); - - if (ndims == 2) - { - // Don't forget 1x1, and 3x1 which are valid but arrays always - // have at least 2d - if ( (dims(1) != 3 && dims(2) != 3) - && (dims(1) != 3 && dims(2) != 1) - && (dims(1) != 1 && dims(2) != 1)) - throw invalid_connectivity ("is not 1x1, 3x1, 3x3, or 3x3x...x3"); - } - else - { - for (octave_idx_type i = 0; i < ndims; i++) - if (dims(i) != 3) - throw invalid_connectivity ("is not 3x3x...x3"); - } - - // Center must be true - const octave_idx_type center = floor (numel /2); - if (! mask(center)) - throw invalid_connectivity ("center is not true"); - - // Must be symmetric relative to its center - const bool* start = mask.fortran_vec (); - const bool* end = mask.fortran_vec () + (numel -1); - for (octave_idx_type i = 0; i < center; i++) - if (start[i] != end[-i]) - throw invalid_connectivity ("is not symmetric relative to its center"); - - this->mask = mask; - return; -} - -connectivity::connectivity (const octave_idx_type& conn) -{ - ctor (conn); - return; -} - -void -connectivity::ctor (const octave_idx_type& conn) -{ - if (conn == 4) - { - mask = boolNDArray (dim_vector (3, 3), true); - bool* md = mask.fortran_vec (); - md[ 0] = false; - md[ 2] = false; - md[ 6] = false; - md[ 8] = false; - } - else if (conn == 6) - { - mask = boolNDArray (dim_vector (3, 3, 3), false); - bool* md = mask.fortran_vec (); - md[ 4] = true; - md[10] = true; - md[12] = true; - md[13] = true; - md[14] = true; - md[16] = true; - md[22] = true; - } - else if (conn == 8) - mask = boolNDArray (dim_vector (3, 3), true); - else if (conn == 18) - { - mask = boolNDArray (dim_vector (3, 3, 3), true); - bool* md = mask.fortran_vec (); - md[ 0] = false; - md[ 2] = false; - md[ 6] = false; - md[ 8] = false; - md[18] = false; - md[20] = false; - md[24] = false; - md[26] = false; - } - else if (conn == 26) - mask = boolNDArray (dim_vector (3, 3, 3), true); - else - throw invalid_connectivity ("must be in the set [4 6 8 18 26]"); - - return; -} - - -connectivity::connectivity (const octave_idx_type& ndims, - const std::string& type) -{ - dim_vector size; - if (ndims == 1) - size = dim_vector (3, 1); - else - { - size = dim_vector (3, 3); - size.resize (ndims, 3); - } - - if (type == "maximal") - { - mask = boolNDArray (size, true); - } - else if (type == "minimal") - { - mask = boolNDArray (size, false); - bool* md = mask.fortran_vec (); - - md += int (floor (pow (3, ndims) /2)); // move to center - md[0] = true; - for (octave_idx_type dim = 0; dim < ndims; dim++) - { - const octave_idx_type stride = pow (3, dim); - md[ stride] = true; - md[-stride] = true; - } - } - else - throw invalid_connectivity ("must be \"maximal\" or \"minimal\""); - - return; -} - - -Array<octave_idx_type> -connectivity::offsets (const dim_vector& size) const -{ - const octave_idx_type nnz = mask.nnz (); - const octave_idx_type ndims = mask.ndims (); - const dim_vector dims = mask.dims (); - - Array<octave_idx_type> offsets (dim_vector (nnz, 1)); // retval - const dim_vector cum_size = size.cumulative (); - - Array<octave_idx_type> diff (dim_vector (ndims, 1)); - - Array<octave_idx_type> sub (dim_vector (ndims, 1), 0); - for (octave_idx_type ind = 0, found = 0; found < nnz; - ind++, boolNDArray::increment_index (sub, dims)) - { - if (mask(ind)) - { - for (octave_idx_type i = 0; i < ndims; i++) - diff(i) = 1 - sub(i); // 1 is center since conn is 3x3x...x3 - - octave_idx_type off = diff(0); - for (octave_idx_type dim = 1; dim < ndims; dim++) - off += (diff(dim) * cum_size(dim-1)); - - offsets(found) = off; - found++; - } - } - - return offsets; -} - - -double -connectivity::double_value (const octave_value& val) -{ - error_state = 0; - const double conn = val.double_value (); - // Check is_scalar_type because the warning Octave:array-to-scalar - // is off by default and we will get the first element only. - if (error_state || ! val.is_scalar_type ()) - error_state = 1; - return conn; -} - -boolNDArray -connectivity::bool_array_value (const octave_value& val) -{ - error_state = 0; - const boolNDArray mask = val.bool_array_value (); - // bool_array_value converts anything other than 0 to true, which will - // then validate as conn array, hence any_element_not_one_or_zero() - if (val.array_value ().any_element_not_one_or_zero ()) - error_state = 1; - 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 @@ -339,7 +119,6 @@ return octave_value (NDArray (conn.mask)); } - /* %!assert (conndef (1, "minimal"), [1; 1; 1]); @@ -428,7 +207,6 @@ @end deftypefn") { const octave_idx_type nargin = args.length (); -// const octave_value rv = octave_value (); if (nargin < 3 || nargin > 4) {