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_LINEAR_CONVOLVE_DIRECTIONAL_HH
00027 # define MLN_LINEAR_CONVOLVE_DIRECTIONAL_HH
00028
00032
00033 # include <mln/linear/convolve.hh>
00034 # include <mln/make/w_window_directional.hh>
00035 # include <mln/literal/zero.hh>
00036
00037
00038
00039 namespace mln
00040 {
00041
00042 namespace linear
00043 {
00044
00057 template <typename I, typename W, unsigned S>
00058 mln_ch_convolve(I, W)
00059 convolve_directional(const Image<I>& input, unsigned dir, W (&weights)[S]);
00060
00061
00062 # ifndef MLN_INCLUDE_ONLY
00063
00064 template <typename I, typename W, unsigned S>
00065 inline
00066 mln_ch_convolve(I, W)
00067 convolve_directional(const Image<I>& input, unsigned dir, W (&weights)[S])
00068 {
00069 trace::entering("linear::convolve_directional");
00070
00071 mlc_bool(S % 2 == 1)::check();
00072
00073 mln_precondition(exact(input).is_valid());
00074 typedef mln_site(I) P;
00075 mln_precondition(dir < P::dim);
00076
00077 typedef mln_delta(P) D;
00078 D dp = literal::zero;
00079 ++dp[dir];
00080 w_window<D,W> w_win = make::w_window_directional(dp, weights);
00081 mln_ch_convolve(I, W) output = convolve(input, w_win);
00082
00083 trace::exiting("linear::convolve_directional");
00084 return output;
00085 }
00086
00087 # endif // ! MLN_INCLUDE_ONLY
00088
00089 }
00090
00091 }
00092
00093
00094 #endif // ! MLN_LINEAR_CONVOLVE_DIRECTIONAL_HH