extrema.hxx

00001 // Copyright (C) 2001, 2002, 2003, 2004  EPITA Research and Development Laboratory
00002 //
00003 // This file is part of the Olena Library.  This library is free
00004 // software; you can redistribute it and/or modify it under the terms
00005 // of the GNU General Public License version 2 as published by the
00006 // Free Software Foundation.
00007 //
00008 // This library is distributed in the hope that it will be useful,
00009 // but WITHOUT ANY WARRANTY; without even the implied warranty of
00010 // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
00011 // General Public License for more details.
00012 //
00013 // You should have received a copy of the GNU General Public License
00014 // along with this library; see the file COPYING.  If not, write to
00015 // the Free Software Foundation, 59 Temple Place - Suite 330, Boston,
00016 // MA 02111-1307, USA.
00017 //
00018 // As a special exception, you may use this file as part of a free
00019 // software library without restriction.  Specifically, if other files
00020 // instantiate templates or use macros or inline functions from this
00021 // file, or you compile this file and link it with other files to
00022 // produce an executable, this file does not by itself cause the
00023 // resulting executable to be covered by the GNU General Public
00024 // License.  This exception does not however invalidate any other
00025 // reasons why the executable file might be covered by the GNU General
00026 // Public License.
00027 
00028 
00029 namespace internal {
00030 
00039   template <class DestType, class I>
00040   typename mute<I, DestType>::ret
00041   create_minima_image_from_bin_(const abstract::non_vectorial_image<I>& input)
00042   {
00043     oln_iter_type(I) p(input);
00044     typename mute<I, DestType>::ret output(input.size());
00045     for_all (p)
00046       // FIXME: min() and max() should be inf() and sup()
00047       // once these functions exist.  Otherwise it doesn't
00048       // work on float.
00049       output[p] = (input[p] ?
00050                    ntg_min_val(DestType) :
00051                    ntg_max_val(DestType));
00052     return output;
00053   }
00054 
00062   template <class I>
00063   typename mute<I, ntg::bin>::ret
00064   ima_to_bin_(const abstract::non_vectorial_image<I>& input)
00065   {
00066     oln_iter_type(I) p(input);
00067     typename mute<I, ntg::bin>::ret output(input.size());
00068     for_all (p)
00069       output[p] = (input[p] ? true : false);
00070     return output;
00071   }
00072 
00073 } // internal
00074 
00075 
00076 
00077 // Minima Imposition
00078 
00123 template<class I, class I2, class N>
00124 oln_concrete_type(I)
00125   minima_imposition(const abstract::non_vectorial_image<I>& input,
00126                     const abstract::non_vectorial_image<I2>& minima_map,
00127                     const abstract::neighborhood<N>& Ng)
00128 {
00129   mlc::eq<I::dim, I2::dim>::ensure();
00130   mlc::eq<I::dim, N::dim>::ensure();
00131   precondition(input.size() == minima_map.size());
00132   oln_concrete_type(I) mm =
00133     internal::create_minima_image_from_bin_<oln_value_type(I)>(minima_map);
00134   return geodesic_reconstruction_erosion(mm,
00135                                          arith::min(arith::plus_cst(input,oln_value_type(I)(1)),
00136                                                     (arith::plus_cst(mm,oln_value_type(I)(0)))), Ng);
00137 }
00138 
00139 
00140 
00141 
00142 // Regional minima
00143 
00175 template<class I, class N>
00176 typename mute<I, ntg::bin>::ret
00177 regional_minima(const abstract::non_vectorial_image<I>& input,
00178                 const abstract::neighborhood<N>& Ng)
00179 {
00180   mlc::eq<I::dim, N::dim>::ensure();
00181   return
00182     internal::ima_to_bin_(arith::minus(convert::force<oln_value_type(I)>(),
00183                                        geodesic_reconstruction_erosion
00184                                        (arith::plus_cst(input,oln_value_type(I) (1)), input, Ng),
00185                                        input));
00186 }

Generated on Thu Apr 15 20:13:08 2004 for Olena by doxygen 1.3.6-20040222