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 APPS_GRAPH_MORPHO_MAKE_COMPLEX2D_HH
00027 # define APPS_GRAPH_MORPHO_MAKE_COMPLEX2D_HH
00028
00031
00032 # include <mln/core/image/image2d.hh>
00033 # include <mln/world/inter_pixel/dim2/is_pixel.hh>
00034
00044 template <typename I>
00045 inline
00046 mln_concrete(I)
00047 make_complex2d(const mln::Image<I>& input_)
00048 {
00049 using namespace mln;
00050
00051 const I& input = exact(input_);
00052
00053
00054
00055
00056 typedef mln_concrete(I) O;
00057 O output(2 * input.nrows() - 1, 2 * input.ncols() - 1);
00058
00059 mln_piter(O) p(output.domain());
00060 for_all(p)
00061 {
00062 point2d p_ = p;
00063 if (p_.row() % 2 == 0)
00064 {
00065 if (p_.col() % 2 == 0)
00066
00067 output(p) = input.at_(p_.row() / 2, p_.col() / 2);
00068 else
00069
00070 output(p) =
00071 input.at_(p_.row() / 2, (p_.col() - 1) / 2) &&
00072 input.at_(p_.row() / 2, (p_.col() + 1) / 2);
00073 }
00074 else
00075 {
00076 if (p_.col() % 2 == 0)
00077
00078 output(p) =
00079 input.at_((p_.row() - 1) / 2, p_.col() / 2) &&
00080 input.at_((p_.row() + 1) / 2, p_.col() / 2);
00081 else
00082
00083
00084 output(p) =
00085 input.at_((p_.row() - 1) / 2, (p_.col() - 1) / 2) &&
00086 input.at_((p_.row() - 1) / 2, (p_.col() + 1) / 2) &&
00087 input.at_((p_.row() + 1) / 2, (p_.col() - 1) / 2) &&
00088 input.at_((p_.row() + 1) / 2, (p_.col() + 1) / 2);
00089 }
00090 }
00091 return output;
00092 }
00093
00094
00100 template <typename I>
00101 inline
00102 mln_concrete(I)
00103 unmake_complex2d(const mln::Image<I>& input_)
00104 {
00105 using namespace mln;
00106
00107 const I& input = exact(input_);
00108
00109 mln_precondition(input.nrows() % 2 == 1);
00110 mln_precondition(input.ncols() % 2 == 1);
00111
00112
00113 typedef image_if< const I, world::inter_pixel::dim2::is_pixel > J;
00114 J input_pixels = input | world::inter_pixel::dim2::is_pixel();
00115
00116
00117
00118
00119
00120 typedef mln_concrete(I) O;
00121
00122 O output(input.nrows() / 2 + 1, input.ncols() / 2 + 1);
00123
00124 mln_piter(J) p_in(input_pixels.domain());
00125 mln_piter(O) p_out(output.domain());
00126 for_all_2(p_in, p_out)
00127 output(p_out) = input(p_in);
00128 return output;
00129 }
00130
00131
00132 #endif // ! APPS_GRAPH_MORPHO_MAKE_COMPLEX2D_HH