27 #ifndef MLN_MORPHO_TOP_HAT_HH
28 # define MLN_MORPHO_TOP_HAT_HH
36 # include <mln/morpho/opening/structural.hh>
37 # include <mln/morpho/closing/structural.hh>
54 template <
typename I,
typename W>
65 template <typename I, typename W>
79 template <typename I, typename W>
85 # ifndef MLN_INCLUDE_ONLY
88 template <
typename I,
typename W>
93 mln_trace(
"morpho::top_hat_white");
95 mln_precondition(
exact(input).is_valid());
96 mln_precondition(!
exact(win).is_empty());
98 mln_concrete(I) output = morpho::
minus(input,
101 mln_postcondition(
test::positive(output));
107 template <typename I, typename W>
109 mln_concrete(I)
top_hat_black(const Image<I>& input, const Window<W>& win)
111 mln_trace(
"morpho::top_hat_black");
113 mln_precondition(
exact(input).is_valid());
114 mln_precondition(!
exact(win).is_empty());
116 mln_concrete(I) output = morpho::
minus(closing::
structural(input, win),
119 mln_postcondition(
test::positive(output));
125 template <typename I, typename W>
129 mln_trace(
"morpho::top_hat_self_complementary");
131 mln_precondition(
exact(input).is_valid());
132 mln_precondition(!
exact(win).is_empty());
134 mln_concrete(I) output = morpho::
minus(closing::
structural(input, win),
137 mln_postcondition(
test::positive(output));
143 # endif // ! MLN_INCLUDE_ONLY
150 #endif // ! MLN_MORPHO_TOP_HAT_HH