slow_convolution.hh

00001 // Copyright (C) 2001, 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, Inc., 51 Franklin Street, Fifth Floor,
00016 // Boston, MA 02110-1301, 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 #ifndef OLENA_CONVOL_SLOW_CONVOLUTION_HH
00030 # define OLENA_CONVOL_SLOW_CONVOLUTION_HH
00031 
00032 # include <oln/basics.hh>
00033 # include <oln/basics2d.hh>
00034 # include <ntg/all.hh>
00035 # include <mlc/cmp.hh>
00036 # include <mlc/array/all.hh>
00037 
00038 namespace oln {
00039 
00042   namespace convol {
00043 
00046     namespace slow {
00047 
00062       template<class DestValue, class I, class Win>
00063       typename mute<I, DestValue>::ret
00064       convolve(const abstract::image < I >& input,
00065                const abstract::w_window< Win >& win)
00066       {
00067         mlc::eq<I::dim, Win::dim>::ensure();
00068 
00069         typename mute<I, DestValue>::ret output(input.size());
00070         input.border_adapt_copy(win.delta());
00071         oln_iter_type(I) p_im(input);
00072         for_all(p_im)
00073           {
00074             ntg::float_d sum = ntg_zero_val(ntg::float_d);
00075             for (unsigned i = 0; i < win.card(); ++i)
00076               sum += ntg::cast::bound<ntg::float_d>(win.w(i)) *
00077                 ntg::cast::bound<ntg::float_d>(input[p_im - win.dp(i)]);
00078             output[p_im] = sum;
00079           }
00080 
00081         return output;
00082       }
00083 
00096       template<class DestValue, class I, class J>
00097       typename mute<I, DestValue>::ret
00098       convolve(const abstract::non_vectorial_image< I >& input,
00099                const abstract::non_vectorial_image< J >& k)
00100       {
00101         mlc::eq<I::dim, J::dim>::ensure();
00102 
00103         typename mute<I, DestValue>::ret output(input.size());
00104 
00105         // Compute Delta.
00106         // \todo FIXME: should be in the image hierarchy.
00107         coord delta = 0;
00108         for (unsigned i = 0; i < J::dim; i++)
00109           if (k.size().nth(i) > delta)
00110             delta = k.size().nth(i);
00111         delta = (delta + 1) / 2;
00112         input.border_adapt_copy(delta);
00113 
00114         // Computer center of the kernel.
00115         // \todo FIXME: should be in the image hierarchy.
00116         oln_point_type(I) center;
00117         for (unsigned i = 0; i < J::dim; i++)
00118           center.nth(i) = (k.size().nth(i) - 1) / 2;
00119 
00120         oln_iter_type(I) p_im(input);
00121         oln_iter_type(J) p_k(k);
00122         for_all(p_im)
00123           {
00124             ntg::float_d sum = ntg_zero_val(ntg::float_d);
00125             for_all(p_k)
00126               sum += ntg::cast::bound<ntg::float_d>(k[p_k]) *
00127               ntg::cast::bound<ntg::float_d>(input[p_im - (center - p_k)]);
00128             output[p_im] = sum;
00129           }
00130         return output;
00131       }
00132 
00146       template<class DestValue, class I, class Info, class Win>
00147       typename mute<I, DestValue>::ret
00148       convolve(const abstract::image < I >& input,
00149                const mlc::array2d<Info, Win >& arr)
00150       {
00151         return convolve<DestValue>(input, static_cast< w_window2d<Win> >(arr));
00152         // FIXME: Should be abstract::w_window<T_arr>.  Adjust #include once done.
00153       }
00154 
00155     } // end namespace slow
00156 
00157   } // end namespace convol
00158 
00159 } // end namespace oln
00160 
00161 #endif // OLENA_CONVOL_SLOW_CONVOLUTION_HH

Generated on Tue Feb 20 20:20:32 2007 for Olena by  doxygen 1.5.1