00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026
00027
00028 #ifndef OLENA_MORPHO_GEODESIC_EROSION_HH
00029 # define OLENA_MORPHO_GEODESIC_EROSION_HH
00030
00031 # include <oln/basics.hh>
00032 # include <oln/morpho/stat.hh>
00033 # include <oln/morpho/erosion.hh>
00034 # include <oln/convert/conversion_ng_se.hh>
00035 # include <oln/level/compare.hh>
00036 # include <oln/arith/ops.hh>
00037 # include <mlc/cmp.hh>
00038
00039 namespace oln {
00040 namespace morpho {
00041
00085 template<class I1, class I2, class N>
00086 oln_concrete_type(I1)
00087 geodesic_erosion(const abstract::non_vectorial_image<I1> & marker,
00088 const abstract::non_vectorial_image<I2> & mask,
00089 const abstract::neighborhood<N>& Ng)
00090 {
00091 mlc::eq<I1::dim, I2::dim>::ensure();
00092 mlc::eq<I1::dim, N::dim>::ensure();
00093 precondition(marker.size() == mask.size());
00094 precondition(level::is_greater_or_equal(marker, mask));
00095 return arith::max<oln_concrete_type(I1)>(erosion(marker, convert::ng_to_cse(Ng)), mask);
00096 }
00097
00098 namespace sure {
00146 template<class I1, class I2, class N>
00147 oln_concrete_type(I1)
00148 geodesic_erosion(const abstract::non_vectorial_image<I1> & marker,
00149 const abstract::non_vectorial_image<I2> & mask,
00150 const abstract::neighborhood<N>& Ng)
00151 {
00152 mlc::eq<I1::dim, I2::dim>::ensure();
00153 mlc::eq<I1::dim, N::dim>::ensure();
00154 precondition(marker.size() == mask.size());
00155 precondition(level::is_greater_or_equal(marker, mask));
00156
00157 oln_concrete_type(I1) output(marker.size());
00158 marker.border_adapt_copy(Ng.delta());
00159 oln_iter_type(I1) p(marker);
00160 for_all (p)
00161 output[p] = ntg::max(morpho::min(marker, p, convert::ng_to_cse(Ng)), mask[p]);
00162 return output;
00163 }
00164
00165 }
00166 }
00167 }
00168
00169 #endif // OLENA_MORPHO_GEODESIC_EROSION_HH