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 #ifndef MLN_MORPHO_ELEMENTARY_TOP_HAT_HH
00027 # define MLN_MORPHO_ELEMENTARY_TOP_HAT_HH
00028
00034
00035 # include <mln/morpho/elementary/opening.hh>
00036 # include <mln/morpho/elementary/closing.hh>
00037 # include <mln/morpho/minus.hh>
00038
00039
00040 namespace mln
00041 {
00042
00043 namespace morpho
00044 {
00045
00046 namespace elementary
00047 {
00048
00052
00053 template <typename I, typename N>
00054 mln_concrete(I)
00055 top_hat_white(const Image<I>& input, const Neighborhood<N>& nbh);
00056
00057
00061
00062 template <typename I, typename N>
00063 mln_concrete(I)
00064 top_hat_black(const Image<I>& input, const Neighborhood<N>& nbh);
00065
00066
00073
00074 template <typename I, typename N>
00075 mln_concrete(I)
00076 top_hat_self_complementary(const Image<I>& input, const Neighborhood<N>& nbh);
00077
00078
00079 # ifndef MLN_INCLUDE_ONLY
00080
00081
00082 template <typename I, typename N>
00083 inline
00084 mln_concrete(I)
00085 top_hat_white(const Image<I>& input, const Neighborhood<N>& nbh)
00086 {
00087 trace::entering("morpho::elementary::top_hat_white");
00088
00089 mln_precondition(exact(input).is_valid());
00090 mln_precondition(exact(nbh).is_valid());
00091
00092 mln_concrete(I) output = morpho::minus(input,
00093 elementary::opening(input, nbh));
00094
00095 mln_postcondition(test::positive(output));
00096
00097 trace::exiting("morpho::elementary::top_hat_white");
00098 return output;
00099 }
00100
00101
00102 template <typename I, typename N>
00103 inline
00104 mln_concrete(I)
00105 top_hat_black(const Image<I>& input, const Neighborhood<N>& nbh)
00106 {
00107 trace::entering("morpho::elementary::top_hat_black");
00108
00109 mln_precondition(exact(input).is_valid());
00110 mln_precondition(exact(nbh).is_valid());
00111
00112 mln_concrete(I) output = morpho::minus(elementary::closing(input, nbh),
00113 input);
00114
00115 mln_postcondition(test::positive(output));
00116
00117 trace::exiting("morpho::elementary::top_hat_black");
00118 return output;
00119 }
00120
00121
00122 template <typename I, typename N>
00123 inline
00124 mln_concrete(I)
00125 top_hat_self_complementary(const Image<I>& input, const Neighborhood<N>& nbh)
00126 {
00127 trace::entering("morpho::elementary::top_hat_self_complementary");
00128 mln_precondition(exact(input).is_valid());
00129 mln_precondition(exact(nbh).is_valid());
00130
00131 mln_concrete(I) output = morpho::minus(elementary::closing(input, nbh),
00132 elementary::opening(input, nbh));
00133
00134 mln_postcondition(test::positive(output));
00135
00136
00137 trace::exiting("morpho::elementary::top_hat_self_complementary");
00138 return output;
00139 }
00140
00141
00142 # endif // ! MLN_INCLUDE_ONLY
00143
00144 }
00145
00146 }
00147
00148 }
00149
00150
00151 #endif // ! MLN_MORPHO_ELEMENTARY_TOP_HAT_HH