00001
00002 #ifndef vil1_convolve_h_
00003 #define vil1_convolve_h_
00004
00005
00006
00007
00008 #include <vcl_compiler.h>
00009 #include <vil1/vil1_memory_image_of.h>
00010
00011
00012
00013
00014
00015 enum vil1_convolve_boundary_option {
00016
00017
00018
00019
00020
00021 vil1_convolve_no_extend,
00022
00023
00024
00025
00026
00027
00028 vil1_convolve_zero_extend,
00029
00030
00031
00032
00033
00034
00035 vil1_convolve_constant_extend,
00036
00037
00038
00039
00040
00041
00042 vil1_convolve_periodic_extend,
00043
00044
00045
00046
00047
00048
00049 vil1_convolve_reflect_extend,
00050
00051
00052
00053
00054
00055
00056 vil1_convolve_trim
00057 };
00058
00059
00060
00061
00062
00063
00064
00065
00066 template <class T>
00067 struct vil1_convolve_signal_1d {
00068 T *array_;
00069 int begin_;
00070 int origin_;
00071 int end_;
00072 vil1_convolve_signal_1d(T *a, int b, int o, int e)
00073 : array_(a), begin_(b), origin_(o), end_(e) { }
00074 };
00075
00076
00077 template <class T>
00078 struct vil1_convolve_signal_2d {
00079 T * const *array_;
00080 int beginx_, originx_, endx_;
00081 int beginy_, originy_, endy_;
00082 vil1_convolve_signal_2d(T * const *a,
00083 int bx, int ox, int ex,
00084 int by, int oy, int ey)
00085 : array_(a)
00086 , beginx_(bx), originx_(ox), endx_(ex)
00087 , beginy_(by), originy_(oy), endy_(ey)
00088 { }
00089 };
00090
00091
00092
00093
00094
00095
00096
00097
00098
00099 template <class I1, class I2, class AC, class O>
00100 void vil1_convolve_1d_x(vil1_convolve_signal_1d<I1 const> const &kernel,
00101 vil1_convolve_signal_2d<I2 const> const &input,
00102 AC * ,
00103 vil1_convolve_signal_2d<O> const &output,
00104 vil1_convolve_boundary_option b,
00105 vil1_convolve_boundary_option e);
00106
00107
00108 template <class I1, class I2, class AC, class O>
00109 void vil1_convolve_1d_y(vil1_convolve_signal_1d<I1 const> const &kernel,
00110 vil1_convolve_signal_2d<I2 const> const &input,
00111 AC * ,
00112 vil1_convolve_signal_2d<O> const &output,
00113 vil1_convolve_boundary_option b,
00114 vil1_convolve_boundary_option e);
00115
00116 template <class I1, class I2, class AC, class O>
00117 void vil1_convolve_separable(I1 const kernel[], unsigned N,
00118 vil1_memory_image_of<I2>& buf,
00119 vil1_memory_image_of<AC>& tmp,
00120 vil1_memory_image_of<O>& out);
00121
00122 template <class I1, class I2, class AC, class O>
00123 vil1_image vil1_convolve_separable(vil1_image const& in,
00124 I1 const* kernel,
00125 int N, I2*, AC*, O*);
00126
00127
00128
00129
00130 template <class I1, class I2, class AC, class O>
00131 void vil1_convolve_1d_x(I1 const *half_kernel, unsigned kernel_size,
00132 vil1_convolve_signal_2d<I2 const> const &input,
00133 AC * ,
00134 vil1_convolve_signal_2d<O> const &output,
00135 vil1_convolve_boundary_option b,
00136 vil1_convolve_boundary_option e);
00137
00138
00139
00140
00141 template <class I1, class I2, class AC, class O>
00142 void vil1_convolve_1d_y(I1 const *half_kernel, unsigned kernel_size,
00143 vil1_convolve_signal_2d<I2 const> const &input,
00144 AC * ,
00145 vil1_convolve_signal_2d<O> const &output,
00146 vil1_convolve_boundary_option b,
00147 vil1_convolve_boundary_option e);
00148
00149 #endif // vil1_convolve_h_