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