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_DILATION_HH
00027 # define MLN_MORPHO_ELEMENTARY_DILATION_HH
00028 
00030 
00031 # include <mln/morpho/elementary/like_ero_fun.hh>
00032 # include <mln/morpho/elementary/like_ero_set.hh>
00033 
00034 
00035 namespace mln
00036 {
00037 
00038   namespace morpho
00039   {
00040 
00041     namespace elementary
00042     {
00043 
00044 
00045       template <typename I, typename N>
00046       mln_concrete(I)
00047       dilation(const Image<I>& input, const Neighborhood<N>& nbh);
00048 
00049 
00050 # ifndef MLN_INCLUDE_ONLY
00051 
00052       namespace internal
00053       {
00054 
00055         
00056 
00057         template <typename I, typename N>
00058         mln_concrete(I)
00059         dilation_dispatch(trait::image::kind::any,
00060                           const Image<I>& input, const Neighborhood<N>& nbh)
00061         {
00062           return like_ero_fun(accu::meta::stat::max(), f_accu(), input, nbh);
00063         }
00064 
00065         template <typename I, typename N>
00066         mln_concrete(I)
00067         dilation_dispatch(trait::image::kind::logic,
00068                          const Image<I>& input, const Neighborhood<N>& nbh)
00069         {
00070           bool val[] =
00071             {
00072               0, 
00073               1, 
00074               0, 
00075               1, 
00076               1, 
00077             };
00078           return like_ero_set(val, input, nbh);
00079         }
00080 
00081         template <typename I, typename N>
00082         mln_concrete(I)
00083         dilation_dispatch(const Image<I>& input, const Neighborhood<N>& nbh)
00084         {
00085           return dilation_dispatch(mln_trait_image_kind(I)(),
00086                                   input, nbh);
00087         }
00088 
00089       } 
00090 
00091 
00092       
00093 
00094       template <typename I, typename N>
00095       mln_concrete(I)
00096       dilation(const Image<I>& input, const Neighborhood<N>& nbh)
00097       {
00098         trace::entering("morpho::elementary::dilation");
00099 
00100         mln_precondition(exact(input).is_valid());
00101         mln_precondition(exact(nbh).is_valid());
00102 
00103         mln_concrete(I) output = internal::dilation_dispatch(input, nbh);
00104 
00105         mln_postcondition(output >= input);
00106         trace::exiting("morpho::elementary::dilation");
00107         return output;
00108       }
00109 
00110 # endif // ! MLN_INCLUDE_ONLY
00111 
00112     } 
00113 
00114   } 
00115 
00116 } 
00117 
00118 
00119 #endif // ! MLN_MORPHO_ELEMENTARY_DILATION_HH