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_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     } 
00125 
00126   } 
00127 
00128 } 
00129 
00130 #endif // ! MLN_WORLD_BINARY_2D_SUBSAMPLE_HH