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_2X1D_HH
00027 # define MLN_LINEAR_CONVOLVE_2X1D_HH
00028
00032
00033 # include <mln/linear/convolve_directional.hh>
00034 # include <mln/extension/adjust.hh>
00035 # include <mln/util/max.hh>
00036
00037
00038
00039 namespace mln
00040 {
00041
00042 namespace linear
00043 {
00044
00053 template <typename I,
00054 typename W, unsigned Sh, unsigned Sv>
00055 mln_ch_convolve(I, W)
00056 convolve_2x1d(const Image<I>& input,
00057 W (&horizontal_weights)[Sh],
00058 W (& vertical_weights)[Sv]);
00059
00060
00061 # ifndef MLN_INCLUDE_ONLY
00062
00063 template <typename I,
00064 typename W, unsigned Sh, unsigned Sv>
00065 mln_ch_convolve(I, W)
00066 convolve_2x1d(const Image<I>& input,
00067 W (&horizontal_weights)[Sh],
00068 W (& vertical_weights)[Sv])
00069 {
00070 trace::entering("linear::convolve_2x1d");
00071
00072 mlc_bool(Sh % 2 == 1)::check();
00073 mlc_bool(Sv % 2 == 1)::check();
00074
00075 mln_precondition(exact(input).is_valid());
00076
00077 extension::adjust(input, util::max(Sh / 2, Sv / 2));
00078
00079 mln_ch_convolve(I, W) tmp, output;
00080
00081 tmp = linear::convolve_directional(input, 1, horizontal_weights);
00082 output = linear::convolve_directional( tmp, 0, vertical_weights);
00083
00084 trace::exiting("linear::convolve_2x1d");
00085 return output;
00086 }
00087
00088 # endif // ! MLN_INCLUDE_ONLY
00089
00090 }
00091
00092 }
00093
00094
00095 #endif // ! MLN_LINEAR_CONVOLVE_2X1D_HH