energies.hxx

00001 // Copyright (C) 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 #ifndef OLENA_SNAKES_ENERGIES_HXX
00029 # define OLENA_SNAKES_ENERGIES_HXX
00030 
00031 namespace oln {
00032 
00033   namespace snakes {
00034 
00035 
00036     template <class I>
00037     inline
00038     ntg::float_s
00039     continuity_energy<I>::compute(const I&,
00040                                   const node<I>& prev,
00041                                   const node<I>& current,
00042                                   const node<I>&)
00043     {
00044       ntg::float_s d = *average_dist - (current - prev).norm2();
00045       return d > 0 ? d : -d;
00046     }
00047 
00048     template <class I>
00049     inline
00050     ntg::float_s
00051     curvature_energy<I>::compute(const I&,
00052                                  const node<I>& prev,
00053                                  const node<I>& current,
00054                                  const node<I>& next)
00055     {
00056       typename I::point_type twice_current;
00057 
00058       twice_current.row() = 2 * current.row();
00059       twice_current.col() = 2 * current.col();
00060       return (next + (prev - twice_current) -
00061               typename I::point_type(0,0)).norm2();
00062     }
00063 
00064     template <class I>
00065     inline
00066     ntg::float_s
00067     image_energy<I>::compute(const I& gradient,
00068                              const node<I>&,
00069                              const node<I>& current,
00070                              const node<I>&)
00071     {
00072       // FIXME: Add magic trick: if there is very little gradient difference,
00073       // don't pay too much attention to it.
00074       // If max_gradient < min_gradient + 5: max_gradient = min_gradient + 5
00075       return ntg_sup_val(oln_value_type(I)) - gradient[current];
00076     }
00077 
00078   } // end snakes
00079 
00080 } // end oln
00081 
00082 #endif // !OLENA_SNAKES_ENERGIES_HXX

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