37 #ifndef VIGRA_CONVOLUTION_HXX
38 #define VIGRA_CONVOLUTION_HXX
41 #include "stdconvolution.hxx"
42 #include "separableconvolution.hxx"
43 #include "recursiveconvolution.hxx"
44 #include "nonlineardiffusion.hxx"
45 #include "combineimages.hxx"
254 template <
class SrcIterator,
class SrcAccessor,
255 class DestIterator,
class DestAccessor,
258 SrcIterator slowerright, SrcAccessor sa,
259 DestIterator dupperleft, DestAccessor da,
263 NumericTraits<typename SrcAccessor::value_type>::RealPromote
268 destImage(tmp), kernel1d(kx));
270 destIter(dupperleft, da), kernel1d(ky));
273 template <
class SrcIterator,
class SrcAccessor,
274 class DestIterator,
class DestAccessor,
277 convolveImage(triple<SrcIterator, SrcIterator, SrcAccessor> src,
278 pair<DestIterator, DestAccessor> dest,
279 Kernel1D<T>
const & kx, Kernel1D<T>
const & ky)
282 dest.first, dest.second, kx, ky);
358 template <
class SrcIterator,
class SrcAccessor,
359 class DestIterator,
class DestAccessor>
360 void simpleSharpening(SrcIterator src_ul, SrcIterator src_lr, SrcAccessor src_acc,
361 DestIterator dest_ul, DestAccessor dest_acc,
double sharpening_factor)
364 vigra_precondition(sharpening_factor >= 0.0,
365 "simpleSharpening(): amount of sharpening must be >= 0.");
367 Kernel2D<double> kernel;
369 kernel.initExplicitly(Diff2D(-1,-1), Diff2D(1,1)) = -sharpening_factor/16.0, -sharpening_factor/8.0, -sharpening_factor/16.0,
370 -sharpening_factor/8.0, 1.0+sharpening_factor*0.75, -sharpening_factor/8.0,
371 -sharpening_factor/16.0, -sharpening_factor/8.0, -sharpening_factor/16.0;
374 kernel.center(), kernel.accessor(),
375 kernel.upperLeft(), kernel.lowerRight() , BORDER_TREATMENT_REFLECT );
378 template <
class SrcIterator,
class SrcAccessor,
379 class DestIterator,
class DestAccessor>
382 pair<DestIterator, DestAccessor> dest,
double sharpening_factor)
385 dest.first, dest.second, sharpening_factor);
455 template <
class SrcIterator,
class SrcAccessor,
456 class DestIterator,
class DestAccessor>
458 DestIterator dest_ul, DestAccessor dest_acc,
double sharpening_factor,
461 vigra_precondition(sharpening_factor >= 0.0,
462 "gaussianSharpening(): amount of sharpening must be >= 0");
463 vigra_precondition(scale >= 0.0,
464 "gaussianSharpening(): scale parameter should be >= 0.");
466 typedef typename NumericTraits<typename SrcAccessor::value_type>::RealPromote ValueType;
468 BasicImage<ValueType> tmp(src_lr - src_ul, SkipInitialization);
470 gaussianSmoothing(src_ul, src_lr, src_acc, tmp.upperLeft(), tmp.accessor(), scale);
472 SrcIterator i_src = src_ul;
473 DestIterator i_dest = dest_ul;
474 typename BasicImage<ValueType>::traverser tmp_ul = tmp.upperLeft();
475 typename BasicImage<ValueType>::traverser i_tmp = tmp_ul;
476 typename BasicImage<ValueType>::Accessor tmp_acc = tmp.accessor();
478 for(; i_src.y != src_lr.y ; i_src.y++, i_dest.y++, i_tmp.y++ )
480 for (;i_src.x != src_lr.x ; i_src.x++, i_dest.x++, i_tmp.x++ )
482 dest_acc.set((1.0 + sharpening_factor)*src_acc(i_src) - sharpening_factor*tmp_acc(i_tmp), i_dest);
485 i_dest.x = dest_ul.x;
490 template <
class SrcIterator,
class SrcAccessor,
491 class DestIterator,
class DestAccessor>
493 pair<DestIterator, DestAccessor> dest,
double sharpening_factor,
497 dest.first, dest.second,
498 sharpening_factor, scale);
561 template <
class SrcIterator,
class SrcAccessor,
562 class DestIterator,
class DestAccessor>
564 gaussianSmoothing(SrcIterator supperleft, SrcIterator slowerright, SrcAccessor sa,
565 DestIterator dupperleft, DestAccessor da,
566 double scale_x,
double scale_y)
569 NumericTraits<typename SrcAccessor::value_type>::RealPromote
571 BasicImage<TmpType> tmp(slowerright - supperleft, SkipInitialization);
573 Kernel1D<double> smooth_x, smooth_y;
574 smooth_x.initGaussian(scale_x);
575 smooth_x.setBorderTreatment(BORDER_TREATMENT_REFLECT);
576 smooth_y.initGaussian(scale_y);
577 smooth_y.setBorderTreatment(BORDER_TREATMENT_REFLECT);
580 destImage(tmp), kernel1d(smooth_x));
582 destIter(dupperleft, da), kernel1d(smooth_y));
585 template <
class SrcIterator,
class SrcAccessor,
586 class DestIterator,
class DestAccessor>
588 gaussianSmoothing(SrcIterator supperleft, SrcIterator slowerright, SrcAccessor sa,
589 DestIterator dupperleft, DestAccessor da,
597 template <
class SrcIterator,
class SrcAccessor,
598 class DestIterator,
class DestAccessor>
601 pair<DestIterator, DestAccessor> dest,
602 double scale_x,
double scale_y)
605 dest.first, dest.second, scale_x, scale_y);
608 template <
class SrcIterator,
class SrcAccessor,
609 class DestIterator,
class DestAccessor>
612 pair<DestIterator, DestAccessor> dest,
616 dest.first, dest.second, scale, scale);
701 template <
class SrcIterator,
class SrcAccessor,
702 class DestIteratorX,
class DestAccessorX,
703 class DestIteratorY,
class DestAccessorY>
705 SrcIterator slowerright, SrcAccessor sa,
706 DestIteratorX dupperleftx, DestAccessorX dax,
707 DestIteratorY dupperlefty, DestAccessorY day,
711 NumericTraits<typename SrcAccessor::value_type>::RealPromote
713 BasicImage<TmpType> tmp(slowerright - supperleft, SkipInitialization);
715 Kernel1D<double> smooth, grad;
716 smooth.initGaussian(scale);
717 grad.initGaussianDerivative(scale, 1);
720 destImage(tmp), kernel1d(grad));
722 destIter(dupperleftx, dax), kernel1d(smooth));
724 destImage(tmp), kernel1d(smooth));
726 destIter(dupperlefty, day), kernel1d(grad));
729 template <
class SrcIterator,
class SrcAccessor,
730 class DestIterator,
class DestAccessor>
732 SrcIterator slowerright, SrcAccessor src,
733 DestIterator dupperleft, DestAccessor dest,
736 VectorElementAccessor<DestAccessor> gradx(0, dest), grady(1, dest);
738 dupperleft, gradx, dupperleft, grady, scale);
741 template <
class SrcIterator,
class SrcAccessor,
742 class DestIteratorX,
class DestAccessorX,
743 class DestIteratorY,
class DestAccessorY>
746 pair<DestIteratorX, DestAccessorX> destx,
747 pair<DestIteratorY, DestAccessorY> desty,
751 destx.first, destx.second, desty.first, desty.second, scale);
754 template <
class SrcIterator,
class SrcAccessor,
755 class DestIterator,
class DestAccessor>
758 pair<DestIterator, DestAccessor> dest,
762 dest.first, dest.second, scale);
817 template <
class SrcIterator,
class SrcAccessor,
818 class DestIterator,
class DestAccessor>
820 SrcIterator slr, SrcAccessor src,
821 DestIterator dupperleft, DestAccessor dest,
824 typedef typename NumericTraits<typename SrcAccessor::value_type>::RealPromote TmpType;
825 BasicImage<TmpType> gradx(slr-sul, SkipInitialization), grady(slr-sul, SkipInitialization);
828 destImage(gradx), destImage(grady), scale);
829 combineTwoImages(srcImageRange(gradx), srcImage(grady), destIter(dupperleft, dest),
830 MagnitudeFunctor<TmpType>());
833 template <
class SrcIterator,
class SrcAccessor,
834 class DestIterator,
class DestAccessor>
837 pair<DestIterator, DestAccessor> dest,
841 dest.first, dest.second, scale);
901 template <
class SrcIterator,
class SrcAccessor,
902 class DestIterator,
class DestAccessor>
904 SrcIterator slowerright, SrcAccessor sa,
905 DestIterator dupperleft, DestAccessor da,
909 NumericTraits<typename SrcAccessor::value_type>::RealPromote
911 BasicImage<TmpType> tmp(slowerright - supperleft, SkipInitialization),
912 tmpx(slowerright - supperleft, SkipInitialization),
913 tmpy(slowerright - supperleft, SkipInitialization);
915 Kernel1D<double> smooth, deriv;
916 smooth.initGaussian(scale);
917 deriv.initGaussianDerivative(scale, 2);
920 destImage(tmp), kernel1d(deriv));
922 destImage(tmpx), kernel1d(smooth));
924 destImage(tmp), kernel1d(smooth));
926 destImage(tmpy), kernel1d(deriv));
928 destIter(dupperleft, da), std::plus<TmpType>());
931 template <
class SrcIterator,
class SrcAccessor,
932 class DestIterator,
class DestAccessor>
935 pair<DestIterator, DestAccessor> dest,
939 dest.first, dest.second, scale);
1024 template <
class SrcIterator,
class SrcAccessor,
1025 class DestIteratorX,
class DestAccessorX,
1026 class DestIteratorXY,
class DestAccessorXY,
1027 class DestIteratorY,
class DestAccessorY>
1029 SrcIterator slowerright, SrcAccessor sa,
1030 DestIteratorX dupperleftx, DestAccessorX dax,
1031 DestIteratorXY dupperleftxy, DestAccessorXY daxy,
1032 DestIteratorY dupperlefty, DestAccessorY day,
1036 NumericTraits<typename SrcAccessor::value_type>::RealPromote
1038 BasicImage<TmpType> tmp(slowerright - supperleft, SkipInitialization);
1040 Kernel1D<double> smooth, deriv1, deriv2;
1041 smooth.initGaussian(scale);
1042 deriv1.initGaussianDerivative(scale, 1);
1043 deriv2.initGaussianDerivative(scale, 2);
1046 destImage(tmp), kernel1d(deriv2));
1048 destIter(dupperleftx, dax), kernel1d(smooth));
1050 destImage(tmp), kernel1d(smooth));
1052 destIter(dupperlefty, day), kernel1d(deriv2));
1054 destImage(tmp), kernel1d(deriv1));
1056 destIter(dupperleftxy, daxy), kernel1d(deriv1));
1059 template <
class SrcIterator,
class SrcAccessor,
1060 class DestIteratorX,
class DestAccessorX,
1061 class DestIteratorXY,
class DestAccessorXY,
1062 class DestIteratorY,
class DestAccessorY>
1065 pair<DestIteratorX, DestAccessorX> destx,
1066 pair<DestIteratorXY, DestAccessorXY> destxy,
1067 pair<DestIteratorY, DestAccessorY> desty,
1071 destx.first, destx.second,
1072 destxy.first, destxy.second,
1073 desty.first, desty.second,
1189 template <
class SrcIterator,
class SrcAccessor,
1190 class DestIteratorX,
class DestAccessorX,
1191 class DestIteratorXY,
class DestAccessorXY,
1192 class DestIteratorY,
class DestAccessorY>
1194 SrcIterator slowerright, SrcAccessor sa,
1195 DestIteratorX dupperleftx, DestAccessorX dax,
1196 DestIteratorXY dupperleftxy, DestAccessorXY daxy,
1197 DestIteratorY dupperlefty, DestAccessorY day,
1198 double inner_scale,
double outer_scale)
1201 NumericTraits<typename SrcAccessor::value_type>::RealPromote
1203 BasicImage<TmpType> tmp(slowerright - supperleft, SkipInitialization),
1204 tmpx(slowerright - supperleft, SkipInitialization),
1205 tmpy(slowerright - supperleft, SkipInitialization);
1208 destImage(tmpx), destImage(tmpy), inner_scale);
1210 destImage(tmp), std::multiplies<TmpType>());
1212 destIter(dupperleftx, dax), outer_scale);
1214 destImage(tmp), std::multiplies<TmpType>());
1216 destIter(dupperlefty, day), outer_scale);
1218 destImage(tmp), std::multiplies<TmpType>());
1220 destIter(dupperleftxy, daxy), outer_scale);
1223 template <
class SrcIterator,
class SrcAccessor,
1224 class DestIteratorX,
class DestAccessorX,
1225 class DestIteratorXY,
class DestAccessorXY,
1226 class DestIteratorY,
class DestAccessorY>
1229 pair<DestIteratorX, DestAccessorX> destx,
1230 pair<DestIteratorXY, DestAccessorXY> destxy,
1231 pair<DestIteratorY, DestAccessorY> desty,
1232 double inner_scale,
double outer_scale)
1235 destx.first, destx.second,
1236 destxy.first, destxy.second,
1237 desty.first, desty.second,
1238 inner_scale, outer_scale);
1243 template <
class SrcIterator,
class SrcAccessor,
1244 class DestIterator,
class DestAccessor>
1246 SrcIterator slowerright, SrcAccessor src,
1247 DestIterator dupperleft, DestAccessor dest,
1248 double inner_scale,
double outer_scale,
1251 typedef VectorElementAccessor<DestAccessor> DA;
1253 dupperleft, DA(0, dest),
1254 dupperleft, DA(1, dest),
1255 dupperleft, DA(2, dest),
1256 inner_scale, outer_scale);
1259 template <
class SrcIterator,
class SrcAccessor,
1260 class DestIterator,
class DestAccessor>
1262 SrcIterator slowerright, SrcAccessor src,
1263 DestIterator dupperleft, DestAccessor dest,
1264 double inner_scale,
double outer_scale,
1267 int bands = src.size(supperleft);
1268 typedef VectorElementAccessor<SrcAccessor> SA;
1272 inner_scale, outer_scale,
1275 BasicImage<typename DestAccessor::value_type> st(slowerright - supperleft, SkipInitialization);
1276 for(
int k=1; k < bands; ++k)
1279 st.upperLeft(), st.accessor(),
1280 inner_scale, outer_scale,
1282 combineTwoImages(srcImageRange(st), srcIter(dupperleft, dest), destIter(dupperleft, dest),
1283 std::plus<typename DestAccessor::value_type>());
1289 template <
class SrcIterator,
class SrcAccessor,
1290 class DestIterator,
class DestAccessor>
1292 SrcIterator slowerright, SrcAccessor src,
1293 DestIterator dupperleft, DestAccessor dest,
1294 double inner_scale,
double outer_scale)
1297 NumericTraits<typename SrcAccessor::value_type>::isScalar isScalar;
1298 detail::structureTensor(supperleft, slowerright, src,
1299 dupperleft, dest, inner_scale, outer_scale, isScalar());
1302 template <
class SrcIterator,
class SrcAccessor,
1303 class DestIterator,
class DestAccessor>
1306 pair<DestIterator, DestAccessor> dest,
1307 double inner_scale,
double outer_scale)
1310 dest.first, dest.second,
1311 inner_scale, outer_scale);
1318 #endif // VIGRA_CONVOLUTION_HXX
Generic 1 dimensional convolution kernel.
Definition: separableconvolution.hxx:1267
void simpleSharpening(...)
Perform simple sharpening function.
void gaussianGradient(...)
Calculate the gradient vector by means of a 1st derivatives of Gaussian filter.
void laplacianOfGaussian(...)
Filter image with the Laplacian of Gaussian operator at the given scale.
void gaussianGradientMagnitude(...)
Calculate the gradient magnitude by means of a 1st derivatives of Gaussian filter.
void gaussianSmoothing(...)
Perform isotropic Gaussian convolution.
void separableConvolveX(...)
Performs a 1 dimensional convolution in x direction.
void combineTwoImages(...)
Combine two source images into destination image.
void gaussianSharpening(...)
Perform sharpening function with gaussian filter.
Fundamental class template for images.
Definition: basicimage.hxx:473
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
void structureTensor(...)
Calculate the Structure Tensor for each pixel of and image, using Gaussian (derivative) filters...
void hessianMatrixOfGaussian(...)
Filter image with the 2nd derivatives of the Gaussian at the given scale to get the Hessian matrix...
void separableConvolveY(...)
Performs a 1 dimensional convolution in y direction.