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_REDUCE_HH
00027 # define MLN_WORLD_BINARY_2D_REDUCE_HH
00028
00029
00033
00034
00035 namespace mln
00036 {
00037
00038 namespace world
00039 {
00040
00041 namespace binary_2d
00042 {
00043
00044
00045 image2d<bool>
00046 reduce(const image2d<bool>& input);
00047
00048
00049 # ifndef MLN_INCLUDE_ONLY
00050
00051
00052 image2d<bool>
00053 reduce(const image2d<bool>& input)
00054 {
00055 trace::entering("world::binary_2d::reduce");
00056
00057 mln_precondition(input.is_valid());
00058
00059 const int
00060 min_row = input.domain().pmin().row(),
00061 min_col = input.domain().pmin().col(),
00062 max_row = input.domain().pmax().row(),
00063 max_col = input.domain().pmax().col();
00064
00065 image2d<bool> output(input.nrows() / 2,
00066 input.ncols() / 2);
00067
00068 for (int row = min_row; row <= max_row; row += 2)
00069 for (int col = min_col; col <= max_col; col += 2)
00070 {
00071 unsigned count = 0;
00072 if (input.at_(row, col) == true) ++count;
00073 if (input.at_(row, col + 1) == true) ++count;
00074 if (input.at_(row + 1, col) == true) ++count;
00075 if (input.at_(row + 1, col + 1) == true) ++count;
00076 output.at_((row - min_row) / 2,
00077 (col - min_col) / 2) = (count >= 2);
00078 }
00079
00080 trace::exiting("world::binary_2d::reduce");
00081 return output;
00082 }
00083
00084
00085 # endif ! // MLN_INCLUDE_ONLY
00086
00087
00088 }
00089
00090 }
00091
00092 }
00093
00094
00095 # endif // ! MLN_WORLD_BINARY_2D_REDUCE_HH