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_GEOM_CHAMFER_HH
00027 # define MLN_GEOM_CHAMFER_HH
00028
00032
00033 # include <mln/canvas/chamfer.hh>
00034
00035
00036 namespace mln
00037 {
00038
00039 namespace geom
00040 {
00041
00043 template <typename I, typename W>
00044 mln_ch_value(I, unsigned)
00045 chamfer(const Image<I>& input_, const W& w_win_,
00046 unsigned max = mln_max(unsigned));
00047
00048
00049 # ifndef MLN_INCLUDE_ONLY
00050
00051 namespace impl
00052 {
00053
00054
00055
00056 template <typename I_, typename W_>
00057 struct chamfer_t
00058 {
00059 typedef I_ I;
00060 typedef mln_ch_value(I, unsigned) O;
00061 typedef W_ W;
00062 typedef mln_site(I_) P;
00063
00064
00065
00066 const I& input;
00067 const W& win;
00068
00069 O output;
00070 bool status;
00071 unsigned max;
00072
00073 void fill_output()
00074 {
00075 mln_piter(O) p(output.domain());
00076 for_all(p)
00077 {
00078 if (input(p))
00079 output(p) = 0u;
00080 else
00081 output(p) = max;
00082 }
00083 }
00084
00085 inline
00086 void init() { initialize(output, exact(input));
00087 fill_output();
00088
00089
00090
00091 }
00092 inline
00093 bool handles(const P& p) const { return input(p) == false; }
00094
00095
00096
00097 inline
00098 chamfer_t(const I_& input, const W_& win, unsigned max)
00099 : input (input),
00100 win (win),
00101 max (max)
00102 {}
00103 };
00104
00105 }
00106
00107
00108
00109
00110
00111 template <typename I, typename W>
00112 mln_ch_value(I, unsigned)
00113 chamfer(const Image<I>& input_, const W& w_win_,
00114 unsigned max = mln_max(unsigned))
00115 {
00116 trace::entering("mln::geom::chamfer");
00117
00118
00119 const I& input = exact(input_);
00120 const W& w_win = exact(w_win_);
00121
00122 typedef impl::chamfer_t<I, W> F;
00123
00124 F f(input, w_win, max);
00125 canvas::chamfer<F> run(f);
00126
00127 trace::exiting("mln::geom::chamfer");
00128 return f.output;
00129 }
00130
00131 #endif // ! MLN_INCLUDE_ONLY
00132
00133 }
00134
00135 }
00136
00137 #endif // ! MLN_GEOM_CHAMFER_HH