12 # include <vcl_msvc_warnings.h> 22 const double z = 1/(std::sqrt(2.0)*val_sigma);
69 std::vector<double> &filter)
71 std::size_t centre = filter.size()/2;
77 const double z = 1/(std::sqrt(2.0)*sd);
78 if (filter.size() % 2 == 0)
80 for (
unsigned i=0 ; i<centre; ++i)
84 filter[centre+i] = filter[centre-i-1] = tap;
90 for (
unsigned i=1 ; i<=centre; ++i)
94 filter[centre+i] = filter[centre-i] = tap;
104 const double offset = filter.size() % 2 == 0 ? 0.0 : -0.5;
106 const double eta = -0.5/(sd*sd);
108 for (
unsigned i=1; i<diff; ++i)
115 for (
int i=-(
int)centre ; i+centre<filter.size(); ++i)
117 tap = poly.
evaluate(i+1.0+offset)*std::exp(eta*(i+1.0+offset)*(i+1.0+offset))
118 - poly.
evaluate(i+ offset)*std::exp(eta*(i+ offset)*(i+ offset));
119 sum += std::abs(tap);
120 filter[centre+i] = tap;
126 double norm = 1.0 / sum;
127 std::transform(filter.begin(), filter.end(), filter.begin(),
128 std::bind2nd(std::multiplies<double>(), norm));
void vil_gauss_filter_gen_ntap(double sd, unsigned diff, std::vector< double > &filter)
Generate an n-tap FIR filter from a Gaussian function.
vil_gauss_filter_5tap_params(double sigma_)
Set the.
double evaluate(double x) const
vnl_real_polynomial derivative() const