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