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_CH_CONVOLVE_HH
00027 # define MLN_LINEAR_CH_CONVOLVE_HH
00028
00032
00033 # include <mln/core/concept/image.hh>
00034 # include <mln/core/concept/window.hh>
00035 # include <mln/core/concept/weighted_window.hh>
00036 # include <mln/trait/ch_value.hh>
00037 # include <mln/value/ops.hh>
00038
00039 # include <mln/algebra/vec.hh>
00040
00041
00044 # define mln_ch_convolve(I, W) \
00045 typename mln::linear::ch_convolve<I, W>::ret
00046
00047 # define mln_ch_convolve_grad(I, W) \
00048 typename mln::trait::ch_value< I, algebra::vec< I::site::dim, typename mln::linear::ch_convolve<I,W>::ret::value > >::ret
00049
00050
00051
00052 namespace mln
00053 {
00054
00055 namespace linear
00056 {
00057
00058 namespace internal
00059 {
00060
00061 template <bool b,
00062 typename I, typename W>
00063 struct ch_convolve_helper
00064 {
00065 typedef mln_sum_product(mln_value(I), mln_weight(W)) V;
00066 typedef mln_ch_value(I, V) ret;
00067 };
00068
00069 template <typename I, typename W>
00070 struct ch_convolve_helper<false, I, W>
00071 {
00072 typedef mln_sum_product(mln_value(I), W) V;
00073 typedef mln_ch_value(I, V) ret;
00074 };
00075
00076 }
00077
00078
00079 template <typename I, typename W>
00080 struct ch_convolve
00081 : private mlc_and( mlc_is_a(I, Image),
00082 mlc_is_not_a(W, Window) )::check_t
00083 {
00084 protected:
00085 enum { is_w_win = mlc_is_a(W, Weighted_Window)::value };
00086 typedef internal::ch_convolve_helper<is_w_win, I, W> helper;
00087 public:
00088 typedef mlc_ret(helper) ret;
00089 };
00090
00091 }
00092
00093 }
00094
00095
00096 #endif // ! MLN_LINEAR_CH_CONVOLVE_HH