37 #ifndef VIGRA_GRADIENT_ENERGY_TENSOR_HXX
38 #define VIGRA_GRADIENT_ENERGY_TENSOR_HXX
42 #include "utilities.hxx"
43 #include "array_vector.hxx"
44 #include "basicimage.hxx"
45 #include "combineimages.hxx"
46 #include "numerictraits.hxx"
47 #include "convolution.hxx"
123 template <
class SrcIterator,
class SrcAccessor,
124 class DestIterator,
class DestAccessor>
126 DestIterator dupperleft, DestAccessor dest,
127 Kernel1D<double>
const & derivKernel, Kernel1D<double>
const & smoothKernel)
129 vigra_precondition(dest.size(dupperleft) == 3,
130 "gradientEnergyTensor(): output image must have 3 bands.");
132 int w = slowerright.x - supperleft.x;
133 int h = slowerright.y - supperleft.y;
136 NumericTraits<typename SrcAccessor::value_type>::RealPromote TmpType;
137 typedef BasicImage<TmpType> TmpImage;
138 TmpImage gx(w, h), gy(w, h),
139 gxx(w, h), gxy(w, h), gyy(w, h),
140 laplace(w, h), gx3(w, h), gy3(w, h);
142 convolveImage(srcIterRange(supperleft, slowerright, src), destImage(gx),
143 derivKernel, smoothKernel);
144 convolveImage(srcIterRange(supperleft, slowerright, src), destImage(gy),
145 smoothKernel, derivKernel);
147 derivKernel, smoothKernel);
149 smoothKernel, derivKernel);
151 smoothKernel, derivKernel);
153 std::plus<TmpType>());
155 derivKernel, smoothKernel);
157 smoothKernel, derivKernel);
158 typename TmpImage::iterator gxi = gx.begin(),
165 for(
int y = 0; y < h; ++y, ++dupperleft.y)
167 typename DestIterator::row_iterator d = dupperleft.rowIterator();
168 for(
int x = 0; x < w; ++x, ++d, ++gxi, ++gyi, ++gxxi, ++gxyi, ++gyyi, ++gx3i, ++gy3i)
170 dest.setComponent(
sq(*gxxi) +
sq(*gxyi) - *gxi * *gx3i, d, 0);
171 dest.setComponent(- *gxyi * (*gxxi + *gyyi) + 0.5 * (*gxi * *gy3i + *gyi * *gx3i), d, 1);
172 dest.setComponent(
sq(*gxyi) +
sq(*gyyi) - *gyi * *gy3i, d, 2);
177 template <
class SrcIterator,
class SrcAccessor,
178 class DestIterator,
class DestAccessor>
181 pair<DestIterator, DestAccessor> dest,
182 Kernel1D<double>
const & derivKernel, Kernel1D<double>
const & smoothKernel)
185 dest.first, dest.second, derivKernel, smoothKernel);
192 #endif // VIGRA_GRADIENT_ENERGY_TENSOR_HXX
void gradientEnergyTensor(...)
Calculate the gradient energy tensor for a scalar valued image.
NumericTraits< T >::Promote sq(T t)
Definition: mathutil.hxx:341
void combineTwoImages(...)
Combine two source images into destination image.
void convolveImage(SrcIterator supperleft, SrcIterator slowerright, SrcAccessor sa, DestIterator dupperleft, DestAccessor da, Kernel1D< T > const &kx, Kernel1D< T > const &ky)
Apply two separable filters successively, the first in x-direction, the second in y-direction...
Definition: convolution.hxx:257