• Main Page
  • Related Pages
  • Modules
  • Namespaces
  • Classes
  • Files
  • File List

subsample.hh

00001 // Copyright (C) 2009 EPITA Research and Development Laboratory (LRDE)
00002 //
00003 // This file is part of Olena.
00004 //
00005 // Olena is free software: you can redistribute it and/or modify it under
00006 // the terms of the GNU General Public License as published by the Free
00007 // Software Foundation, version 2 of the License.
00008 //
00009 // Olena is distributed in the hope that it will be useful,
00010 // but WITHOUT ANY WARRANTY; without even the implied warranty of
00011 // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
00012 // General Public License for more details.
00013 //
00014 // You should have received a copy of the GNU General Public License
00015 // along with Olena.  If not, see <http://www.gnu.org/licenses/>.
00016 //
00017 // As a special exception, you may use this file as part of a free
00018 // software project without restriction.  Specifically, if other files
00019 // instantiate templates or use macros or inline functions from this
00020 // file, or you compile this file and link it with other files to produce
00021 // an executable, this file does not by itself cause the resulting
00022 // executable to be covered by the GNU General Public License.  This
00023 // exception does not however invalidate any other reasons why the
00024 // executable file might be covered by the GNU General Public License.
00025 
00026 #ifndef MLN_WORLD_BINARY_2D_SUBSAMPLE_HH
00027 # define MLN_WORLD_BINARY_2D_SUBSAMPLE_HH
00028 
00035 
00036 # include <mln/core/image/image2d.hh>
00037 # include <mln/core/alias/dpoint2d.hh>
00038 # include <mln/data/convert.hh>
00039 # include <mln/value/int_u8.hh>
00040 
00041 namespace mln
00042 {
00043 
00044   namespace world
00045   {
00046 
00047     namespace binary_2d
00048     {
00049 
00056       //
00057       image2d<value::int_u8>
00058       subsample(image2d<bool>& input, unsigned n);
00059 
00060 
00061 # ifndef MLN_INCLUDE_ONLY
00062 
00063       image2d<value::int_u8>
00064       subsample(image2d<bool>& input, unsigned n)
00065       {
00066         trace::entering("world::binary_2d::subsample");
00067 
00068         mln_precondition(input.is_valid());
00069 
00070         using value::int_u8;
00071 
00072         if (n == 0)
00073         {
00074           image2d<value::int_u8>
00075             output = data::convert(int_u8(), input);
00076 
00077           trace::exiting("world::binary_2d::subsample");
00078           return output;
00079         }
00080 
00081         const bool** ptr = new const bool*[n];
00082         const unsigned nrows = input.nrows() / n;
00083         const unsigned ncols = input.ncols() / n;
00084         algebra::vec<2, unsigned int> vmin;
00085         algebra::vec<2, unsigned int> vmax;
00086         vmin[0] = 0;
00087         vmin[1] = 0;
00088         vmax[0] = nrows - 1;
00089         vmax[1] = ncols - 1;
00090         point2d pmin(vmin);
00091         point2d pmax(vmax);
00092         image2d<int_u8> output(box<point2d>(pmin, pmax));
00093 
00094         dpoint2d dp_row(1, 0);
00095         const unsigned delta_row = input.delta_index(dp_row);
00096         unsigned count = 0;
00097 
00098         for (unsigned row = 0; row < nrows; ++row)
00099         {
00100           ptr[0] = & input(point2d(n * row, 0));
00101           for (unsigned i = 1; i < n; ++i)
00102             ptr[i] = ptr[i - 1] + delta_row;
00103           for (unsigned col = 0; col < ncols; ++col)
00104           {
00105             count = 0;
00106             for (unsigned i = 0; i < n; ++i)
00107             {
00108               for (unsigned j = 0; j < n; ++j, ++(ptr[i]))
00109               {
00110                 if (*(ptr[i]))
00111                   ++count;
00112               }
00113             }
00114             output(point2d(row, col)) = count * 255 / n / n;
00115           }
00116         }
00117 
00118         trace::exiting("world::binary_2d::subsample");
00119         return output;
00120       }
00121 
00122 # endif // ! MLN_INCLUDE_ONLY
00123 
00124     } // end of namespace mln::world::binary_2d
00125 
00126   } // end of namspace mln::world
00127 
00128 } // end of namespace mln
00129 
00130 #endif // ! MLN_WORLD_BINARY_2D_SUBSAMPLE_HH

Generated on Tue Oct 4 2011 15:24:41 for Milena (Olena) by  doxygen 1.7.1