27 #ifndef MLN_LINEAR_CONVOLVE_HH
28 # define MLN_LINEAR_CONVOLVE_HH
34 # include <mln/core/concept/image.hh>
35 # include <mln/core/concept/weighted_window.hh>
36 # include <mln/linear/ch_convolve.hh>
37 # include <mln/accu/convolve.hh>
38 # include <mln/extension/adjust_duplicate.hh>
60 template <
typename I,
typename W>
62 convolve(const Image<I>& input, const Weighted_Window<W>& w_win);
66 # ifndef MLN_INCLUDE_ONLY
73 template <
typename I,
typename W>
75 convolve_tests(
const Image<I>& input,
76 const Weighted_Window<W>& w_win)
78 mln_precondition(
exact(input).is_valid());
79 mln_precondition(
exact(w_win).is_valid());
95 template <
typename I,
typename W>
98 const Weighted_Window<W>& w_win_)
100 mln_trace(
"linear::impl::generic::convolve");
102 const I& input =
exact(input_);
103 const W& w_win =
exact(w_win_);
104 internal::convolve_tests(input, w_win);
108 typedef mln_ch_convolve(I, W) O;
112 accu::
convolve<mln_value(I), mln_weight(W)> a;
114 mln_piter(I)
p(input.domain());
115 mln_qiter(W) q(w_win,
p);
120 for_all(q) if (input.has(q))
121 a.take(input(q), q.w());
122 output(p) = a.to_result();
131 template <typename I, typename W>
132 mln_ch_convolve(I, W)
133 convolve_fastest(const Image<I>& input_,
134 const Weighted_Window<W>& w_win_)
136 mln_trace(
"linear::impl::convolve_fastest");
138 const I& input =
exact(input_);
139 const W& w_win =
exact(w_win_);
140 internal::convolve_tests(input, w_win);
144 typedef mln_ch_convolve(I, W) O;
147 mln_pixter(O) p_out(output);
149 accu::
convolve<mln_value(I), mln_weight(W)> a;
151 mln_pixter(const I) p(input);
152 mln_qixter(const I, W) q(p, w_win);
159 a.take(q.val(), w_win.w(i++));
160 p_out.val() = a.to_result();
174 template <
typename I,
typename W>
175 mln_ch_convolve(I, W)
176 convolve_dispatch(trait::image::speed::any,
177 const Image<I>& input,
178 const Weighted_Window<W>& w_win)
183 template <
typename I,
typename W>
184 mln_ch_convolve(I, W)
185 convolve_dispatch(trait::image::speed::fastest,
186 const Image<I>& input,
187 const Weighted_Window<W>& w_win)
189 return impl::convolve_fastest(input, w_win);
192 template <
typename I,
typename W>
193 mln_ch_convolve(I, W)
194 convolve_dispatch(const Image<I>& input,
195 const Weighted_Window<W>& w_win)
197 return convolve_dispatch(mln_trait_image_speed(I)(),
206 template <
typename I,
typename W>
207 mln_ch_convolve(I, W)
208 convolve(const Image<I>& input, const Weighted_Window<W>& w_win)
210 mln_trace(
"linear::convolve");
212 internal::convolve_tests(input, w_win);
214 mln_ch_convolve(I, W) output;
215 output = internal::convolve_dispatch(mln_trait_image_speed(I)(),
221 # endif // ! MLN_INCLUDE_ONLY
228 #endif // ! MLN_LINEAR_CONVOLVE_HH