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
00027
00028
00029
00030
00050 #include <mln/core/image/image2d.hh>
00051 #include <mln/core/alias/point2d.hh>
00052 #include <mln/core/alias/window2d.hh>
00053 #include <mln/core/alias/neighb2d.hh>
00054
00056 #include <mln/core/image/edge_image.hh>
00057 #include <mln/core/var.hh>
00058 #include <mln/fun/i2v/array.hh>
00059 #include <mln/util/graph.hh>
00060
00061 #include <mln/morpho/line_gradient.hh>
00062 #include <mln/morpho/closing/area_on_vertices.hh>
00063 #include <mln/morpho/meyer_wst.hh>
00064 #include <mln/data/stretch.hh>
00065
00066 #include <mln/value/int_u8.hh>
00067 #include <mln/value/int_u16.hh>
00068 #include <mln/value/rgb8.hh>
00069 #include <mln/literal/black.hh>
00070 #include <mln/literal/colors.hh>
00071
00072 #include <mln/io/pgm/load.hh>
00073 #include <mln/io/ppm/save.hh>
00074
00075 #include <mln/math/max.hh>
00076 #include <mln/math/abs.hh>
00077
00078 #include "tests/data.hh"
00079
00080
00081
00082 int main()
00083 {
00084 using namespace mln;
00085 using value::int_u8;
00086 using value::int_u16;
00087 using value::rgb8;
00088
00089
00090
00091
00092
00093 typedef int_u8 input_val_t;
00094 image2d<input_val_t> input;
00095 io::pgm::load(input, MLN_IMG_DIR "/small.pgm");
00096
00097
00098
00099
00100
00101
00102 typedef edge_image<util::site_pair<point2d>,input_val_t,util::graph> lg_ima_t;
00103 lg_ima_t lg_ima = morpho::line_gradient(input);
00104
00105
00106
00107
00108
00109 typedef lg_ima_t::nbh_t nbh_t;
00110 nbh_t nbh;
00111
00112 lg_ima_t closed_lg_ima = morpho::closing::area_on_vertices(lg_ima, nbh, 20);
00113
00114
00115
00116
00117
00118
00119 unsigned nbasins;
00120 typedef edge_image<util::site_pair<point2d>,unsigned,util::graph> wshed_t;
00121 wshed_t wshed = morpho::meyer_wst(closed_lg_ima, nbh, nbasins);
00122 mln_assertion(nbasins == 46);
00123
00124
00125
00126
00127
00128
00129
00130
00131
00132
00133 typedef rgb8 output_val_t;
00134 typedef image2d<output_val_t> output_t;
00135 point2d output_pmin = input.domain().pmin();
00136 point2d output_pmax(input.domain().pmax()[0] * 2,
00137 input.domain().pmax()[1] * 2);
00138 output_t output(box2d(output_pmin, output_pmax));
00139 data::fill(output, literal::black);
00140 mln_fwd_piter_(image2d<input_val_t>) p(input.domain());
00141 for_all(p)
00142 {
00143
00144 point2d q(p[0] * 2, p[1] * 2);
00145 input_val_t v = input(p);
00146
00147
00148 output(q) = output_val_t(v, v, v);
00149 }
00150
00151 mln_piter_(output_t) p_out(output.domain());
00152 for_all(p_out)
00153 {
00154
00155 if (p_out[0] % 2 == 0 && p_out[1] % 2 == 1)
00156 output(p_out) = (output(p_out + left) + output(p_out + right)) / 2;
00157
00158 if (p_out[0] % 2 == 1 && p_out[1] % 2 == 0)
00159 output(p_out) = (output(p_out + up) + output(p_out + down)) / 2;
00160
00161 if (p_out[0] % 2 == 1 && p_out[1] % 2 == 1)
00162 output(p_out) =
00163 (output(p_out + dpoint2d(-1, -1)) +
00164 output(p_out + dpoint2d(-1, +1)) +
00165 output(p_out + dpoint2d(+1, -1)) +
00166 output(p_out + dpoint2d(+1, +1))) / 4;
00167 }
00168
00169
00170
00171
00172 mln_piter_(wshed_t) pw(wshed.domain());
00173 for_all(pw)
00174 {
00175 if (wshed(pw) == 0)
00176 {
00177 mln_psite_(lg_ima_t) pp(pw);
00178
00179 int row1 = pp.first()[0] * 2;
00180 int col1 = pp.first()[1] * 2;
00181 int row2 = pp.second()[0] * 2;
00182 int col2 = pp.second()[1] * 2;
00183 point2d q((row1 + row2) / 2, (col1 + col2) / 2);
00184
00185 output(q) = literal::red;
00186 }
00187 }
00188
00189
00190
00191
00192
00193
00194
00195
00196
00197 for_all (p_out)
00198
00199 if (p_out[0] % 2 == 1 && p_out[1] % 2 == 1)
00200 {
00201
00202
00203
00204
00205 unsigned nwsheds =
00206 (output.has(p_out + up ) && output(p_out + up ) == literal::red) +
00207 (output.has(p_out + down ) && output(p_out + down ) == literal::red) +
00208 (output.has(p_out + left ) && output(p_out + right) == literal::red) +
00209 (output.has(p_out + right) && output(p_out + left ) == literal::red);
00210 if (nwsheds >= 2)
00211 output(p_out) = literal::red;
00212 }
00213 io::ppm::save(output, "out.ppm");
00214 }