1 #ifndef TIL_RF4_GAUSSIAN_H 2 #define TIL_RF4_GAUSSIAN_H 19 template <
typename T >
42 template <
typename T >
66 template <
typename T >
85 template <
typename T >
94 eb0 * (a0 * (cw0 - eb0) - a1*sw0)
95 / (T(2) * cw0 * eb0 - eb0*eb0 - T(1)) +
96 eb1 * (c0 * (cw1 - eb1) - c1*sw1)
97 / (T(2) * cw1 * eb1 - eb1*eb1 - T(1));
100 template <
typename T >
110 ( cw0*a0 + eb0*eb0*a0*cw0 + eb0*eb0*a1*sw0 - 2.0*a0*eb0 -a1*sw0 ) /
111 (4*
square(cw0*eb0)-4*cw0*eb0-4*cw0*eb0*eb0*eb0+2.0*eb0*eb0+
square(eb0*eb0)+1.0) +
113 ( cw1*c0 + eb1*eb1*c0*cw1 + eb1*eb1*c1*sw1 - 2.0*c0*eb1 -c1*sw1 ) /
114 (4*
square(cw1*eb1)-4*cw1*eb1-4*cw1*eb1*eb1*eb1+2.0*eb1*eb1+
square(eb1*eb1)+1.0);
117 template <
typename T >
140 +4*a0*eb0*sw0+a1)*eb0/(
146 (-2*eb0*cw0+
square(eb0)+1))
170 (-2*eb1*cw1+
square(eb1)+1));
175 template <
typename T >
181 const T EPSILON = 128 * std::numeric_limits<T>::epsilon();
189 if (sigma <= EPSILON)
191 resForward.setFilter(1,0,0,0,0,0,0,0);
192 resBackward.setFilter(1,0,0,0,0,0,0,0);
193 return RecGaussian(resForward, resBackward);
196 T a0, a1, c0, c1, b0, b1, w0, w1;
199 resForward.setFilterFromFormula(a0, a1, c0, c1, w0, w1, b0, b1, sigma);
200 resBackward.setFilterFromFormula(a0, a1, c0, c1, w0, w1, b0, b1, sigma);
202 T cw0 = cos(w0/sigma);
203 T cw1 = cos(w1/sigma);
204 T sw0 = sin(w0/sigma);
205 T sw1 = sin(w1/sigma);
208 resForward.normalize(norm);
209 resBackward.normalize(norm);
211 return RecGaussian(resForward, resBackward);
215 template <
typename T >
221 const T EPSILON = 128 * std::numeric_limits<T>::epsilon();
223 if (sigma <= EPSILON)
226 throw std::domain_error(
"Sigma is too small");
229 T a0, a1, c0, c1, b0, b1, w0, w1;
235 resForward.setFilterFromFormula(-a0, -a1, -c0, -c1, w0, w1, b0, b1, sigma);
236 resBackward.setFilterFromFormula(a0, a1, c0, c1, w0, w1, b0, b1, sigma);
238 T cw0 = cos(w0/sigma);
239 T cw1 = cos(w1/sigma);
240 T sw0 = sin(w0/sigma);
241 T sw1 = sin(w1/sigma);
247 resForward.normalize(norm);
248 resBackward.normalize(norm);
250 return RecGaussian(resForward, resBackward);
254 template <
typename T >
263 throw std::invalid_argument(
"Second order derivative computation using recursive filtering are unreliable for sigma < 0.7");
267 T a0, a1, c0, c1, b0, b1, w0, w1;
272 resForward.setFilterFromFormula(a0, a1, c0, c1, w0, w1, b0, b1, sigma);
273 resBackward.setFilterFromFormula(a0, a1, c0, c1, w0, w1, b0, b1, sigma);
275 T cw0 = cos(w0/sigma);
276 T cw1 = cos(w1/sigma);
277 T sw0 = sin(w0/sigma);
278 T sw1 = sin(w1/sigma);
282 resForward.normalize(norm);
283 resBackward.normalize(norm);
285 return RecGaussian(resForward, resBackward);
void setRecursiveFilterCoefficientsToSecondDerivativeGaussian(T &a0, T &a1, T &c0, T &c1, T &w0, T &w1, T &b0, T &b1)
T recursiveGaussianNorm(T a0, T a1, T c0, T c1, T cw0, T sw0, T cw1, T sw1, T eb0, T eb1)
Sum of two recursive filters, a forward and a backward one.
INLINE double norm(const T &a, const T &b)
< Euclidean norm of 2D vector (a, b)
Belongs to package Box Do not include directly, include til/Box.h instead.
RecursiveFilterSum< RecursiveFilter< T,+1, 4 >, RecursiveFilter< T, -1, 4 > > RF4Gaussian(T sigma)
General macros, definitions and functions.
INLINE const T cube(const T &a)
Max of two numbers.
void setRecursiveFilterCoefficientsToDerivativeGaussian(T &a0, T &a1, T &c0, T &c1, T &w0, T &w1, T &b0, T &b1)
T recursiveGaussianDerivativeNorm(T a0, T a1, T c0, T c1, T cw0, T sw0, T cw1, T sw1, T eb0, T eb1)
void setRecursiveFilterCoefficientsToGaussian(T &a0, T &a1, T &c0, T &c1, T &w0, T &w1, T &b0, T &b1)
RecursiveFilterSum< RecursiveFilter< T,+1, 4 >, RecursiveFilter< T, -1, 4 > > RF4GaussianDerivative(T sigma, T stepSize=1)
void square(const TImage &in, TImage &out)
RecursiveFilterSum< RecursiveFilter< T,+1, 4 >, RecursiveFilter< T, -1, 4 > > RF4GaussianSecondDerivative(T sigma)
T recursiveGaussianSecondDerivativeNorm(T a0, T a1, T c0, T c1, T cw0, T sw0, T cw1, T sw1, T eb0, T eb1)