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_INTER_PIXEL_DIM2_MAKE_EDGE_IMAGE_HH
00027 # define MLN_WORLD_INTER_PIXEL_DIM2_MAKE_EDGE_IMAGE_HH
00028
00032
00033 # include <mln/core/image/dmorph/extension_ima.hh>
00034 # include <mln/core/image/dmorph/image_if.hh>
00035
00036 # include <mln/core/routine/extend.hh>
00037
00038 # include <mln/world/inter_pixel/neighb2d.hh>
00039 # include <mln/world/inter_pixel/dim2/is_edge.hh>
00040 # include <mln/data/fill.hh>
00041
00042 namespace mln
00043 {
00044
00045 namespace world
00046 {
00047
00048 namespace inter_pixel
00049 {
00050
00051 namespace dim2
00052 {
00053
00054 template <typename I, typename F>
00055 mln_concrete(I)
00056 make_edge_image(const Image<I>& input_, const Function_vv2v<F>& f_)
00057 {
00058 trace::entering("world::inter_pixel::dim2::make_edge_image");
00059
00060 const I& input = exact(input_);
00061 const F& f = exact(f_);
00062 mln_precondition(input.is_valid());
00063
00064 typedef image_if<const image2d<value::int_u<8u> >,
00065 world::inter_pixel::dim2::is_edge> edges_t;
00066 edges_t edges = input | is_edge();
00067 typedef extension_ima<const edges_t,const I> edges_ext_t;
00068 edges_ext_t edges_ext = extend(edges, input);
00069
00070 mln_piter(edges_ext_t) p(edges_ext.domain());
00071 dbl_neighb2d nbh = e2c();
00072 mln_niter(dbl_neighb2d) n(nbh, p);
00073 mln_value(I) vs[2];
00074
00075 mln_concrete(I) output;
00076 initialize(output, input);
00077 data::fill(output, literal::zero);
00078
00079 for_all(p)
00080 {
00081 unsigned i = 0;
00082 for_all(n)
00083 {
00084 mln_assertion(i < 2);
00085 vs[i++] = input(n);
00086 }
00087 output(p) = f(vs[0], vs[1]);
00088 }
00089
00090 trace::exiting("world::inter_pixel::dim2::make_edge_image");
00091 return output;
00092 }
00093
00094 }
00095
00096 }
00097
00098 }
00099
00100 }
00101
00102 #endif // ! MLN_WORLD_INTER_PIXEL_DIM2_MAKE_EDGE_IMAGE_HH