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