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"
46#include "multi_shape.hxx"
328 NumericTraits<typename SrcAccessor::value_type>::RealPromote
333 destImage(
tmp), kernel1d(
kx));
338template <
class SrcIterator,
class SrcAccessor,
339 class DestIterator,
class DestAccessor,
342convolveImage(triple<SrcIterator, SrcIterator, SrcAccessor> src,
343 pair<DestIterator, DestAccessor> dest,
344 Kernel1D<T>
const & kx, Kernel1D<T>
const & ky)
347 dest.first, dest.second, kx, ky);
350template <
class T1,
class S1,
355 MultiArrayView<2, T2, S2> dest,
356 Kernel1D<T>
const & k)
358 vigra_precondition(src.shape() == dest.shape(),
359 "convolveImage(): shape mismatch between input and output.");
361 destImage(dest), k, k);
364template <
class T1,
class S1,
369 MultiArrayView<2, T2, S2> dest,
370 Kernel1D<T>
const & kx, Kernel1D<T>
const & ky)
372 vigra_precondition(src.shape() == dest.shape(),
373 "convolveImage(): shape mismatch between input and output.");
375 destImage(dest), kx, ky);
470 "simpleSharpening(): amount of sharpening must be >= 0.");
480 kernel.upperLeft(),
kernel.lowerRight() , BORDER_TREATMENT_REFLECT );
483template <
class SrcIterator,
class SrcAccessor,
484 class DestIterator,
class DestAccessor>
487 pair<DestIterator, DestAccessor> dest,
double sharpening_factor)
490 dest.first, dest.second, sharpening_factor);
493template <
class T1,
class S1,
497 MultiArrayView<2, T2, S2> dest,
498 double sharpening_factor)
500 vigra_precondition(src.shape() == dest.shape(),
501 "simpleSharpening(): shape mismatch between input and output.");
503 destImage(dest), sharpening_factor);
602 "gaussianSharpening(): amount of sharpening must be >= 0");
603 vigra_precondition(scale >= 0.0,
604 "gaussianSharpening(): scale parameter should be >= 0.");
606 typedef typename NumericTraits<typename SrcAccessor::value_type>::RealPromote ValueType;
630template <
class SrcIterator,
class SrcAccessor,
631 class DestIterator,
class DestAccessor>
634 pair<DestIterator, DestAccessor> dest,
double sharpening_factor,
638 dest.first, dest.second,
639 sharpening_factor, scale);
642template <
class T1,
class S1,
646 MultiArrayView<2, T2, S2> dest,
647 double sharpening_factor,
650 vigra_precondition(src.shape() == dest.shape(),
651 "gaussianSharpening(): shape mismatch between input and output.");
654 sharpening_factor, scale);
748 NumericTraits<typename SrcAccessor::value_type>::RealPromote
754 smooth_x.setBorderTreatment(BORDER_TREATMENT_REFLECT);
756 smooth_y.setBorderTreatment(BORDER_TREATMENT_REFLECT);
764template <
class SrcIterator,
class SrcAccessor,
765 class DestIterator,
class DestAccessor>
767gaussianSmoothing(SrcIterator supperleft, SrcIterator slowerright, SrcAccessor sa,
768 DestIterator dupperleft, DestAccessor da,
776template <
class SrcIterator,
class SrcAccessor,
777 class DestIterator,
class DestAccessor>
780 pair<DestIterator, DestAccessor> dest,
781 double scale_x,
double scale_y)
784 dest.first, dest.second, scale_x, scale_y);
787template <
class SrcIterator,
class SrcAccessor,
788 class DestIterator,
class DestAccessor>
791 pair<DestIterator, DestAccessor> dest,
795 dest.first, dest.second, scale, scale);
798template <
class T1,
class S1,
802 MultiArrayView<2, T2, S2> dest,
803 double scale_x,
double scale_y)
805 vigra_precondition(src.shape() == dest.shape(),
806 "gaussianSmoothing(): shape mismatch between input and output.");
808 destImage(dest), scale_x, scale_y);
811template <
class T1,
class S1,
815 MultiArrayView<2, T2, S2> dest,
818 vigra_precondition(src.shape() == dest.shape(),
819 "gaussianSmoothing(): shape mismatch between input and output.");
821 destImage(dest), scale, scale);
954 NumericTraits<typename SrcAccessor::value_type>::RealPromote
959 smooth.initGaussian(scale);
960 grad.initGaussianDerivative(scale, 1);
963 destImage(
tmp), kernel1d(grad));
972template <
class SrcIterator,
class SrcAccessor,
973 class DestIterator,
class DestAccessor>
975 SrcIterator slowerright, SrcAccessor src,
976 DestIterator dupperleft, DestAccessor dest,
979 VectorElementAccessor<DestAccessor> gradx(0, dest), grady(1, dest);
981 dupperleft, gradx, dupperleft, grady, scale);
984template <
class SrcIterator,
class SrcAccessor,
985 class DestIteratorX,
class DestAccessorX,
986 class DestIteratorY,
class DestAccessorY>
989 pair<DestIteratorX, DestAccessorX> destx,
990 pair<DestIteratorY, DestAccessorY> desty,
994 destx.first, destx.second, desty.first, desty.second, scale);
997template <
class SrcIterator,
class SrcAccessor,
998 class DestIterator,
class DestAccessor>
1001 pair<DestIterator, DestAccessor> dest,
1005 dest.first, dest.second, scale);
1008template <
class T1,
class S1,
1009 class T2X,
class S2X,
1010 class T2Y,
class S2Y>
1013 MultiArrayView<2, T2X, S2X> destx,
1014 MultiArrayView<2, T2Y, S2Y> desty,
1017 vigra_precondition(src.shape() == destx.shape(),
1018 "gaussianGradient(): shape mismatch between input and output.");
1020 destImage(destx), destImage(desty), scale);
1023template <
class T1,
class S1,
1027 MultiArrayView<2, TinyVector<T2, 2>, S2> dest,
1030 vigra_precondition(src.shape() == dest.shape(),
1031 "gaussianGradient(): shape mismatch between input and output.");
1033 destImage(dest), scale);
1207 typedef typename NumericTraits<typename SrcAccessor::value_type>::RealPromote
TmpType;
1216template <
class SrcIterator,
class SrcAccessor,
1217 class DestIterator,
class DestAccessor>
1220 pair<DestIterator, DestAccessor> dest,
1224 dest.first, dest.second, scale);
1315 NumericTraits<typename SrcAccessor::value_type>::RealPromote
1322 smooth.initGaussian(scale);
1323 deriv.initGaussianDerivative(scale, 2);
1337template <
class SrcIterator,
class SrcAccessor,
1338 class DestIterator,
class DestAccessor>
1341 pair<DestIterator, DestAccessor> dest,
1345 dest.first, dest.second, scale);
1348template <
class T1,
class S1,
1352 MultiArrayView<2, T2, S2> dest,
1355 vigra_precondition(src.shape() == dest.shape(),
1356 "laplacianOfGaussian(): shape mismatch between input and output.");
1358 destImage(dest), scale);
1480 NumericTraits<typename SrcAccessor::value_type>::RealPromote
1485 smooth.initGaussian(scale);
1486 deriv1.initGaussianDerivative(scale, 1);
1487 deriv2.initGaussianDerivative(scale, 2);
1503template <
class SrcIterator,
class SrcAccessor,
1504 class DestIteratorX,
class DestAccessorX,
1505 class DestIteratorXY,
class DestAccessorXY,
1506 class DestIteratorY,
class DestAccessorY>
1509 pair<DestIteratorX, DestAccessorX> destx,
1510 pair<DestIteratorXY, DestAccessorXY> destxy,
1511 pair<DestIteratorY, DestAccessorY> desty,
1515 destx.first, destx.second,
1516 destxy.first, destxy.second,
1517 desty.first, desty.second,
1521template <
class T1,
class S1,
1522 class T2X,
class S2X,
1523 class T2XY,
class S2XY,
1524 class T2Y,
class S2Y>
1527 MultiArrayView<2, T2X, S2X> destx,
1528 MultiArrayView<2, T2XY, S2XY> destxy,
1529 MultiArrayView<2, T2Y, S2Y> desty,
1532 vigra_precondition(src.shape() == destx.shape() && src.shape() == destxy.shape() && src.shape() == desty.shape(),
1533 "hessianMatrixOfGaussian(): shape mismatch between input and output.");
1541template <
class T1,
class S1,
1545 MultiArrayView<2, TinyVector<T2, 3>, S2> dest,
1548 vigra_precondition(src.shape() == dest.shape(),
1549 "hessianMatrixOfGaussian(): shape mismatch between input and output.");
1551 MultiArrayView<3, T2> expanded(dest.expandElements(0));
1552 MultiArrayView<2, T2> dxx(expanded.template bind<0>(0));
1553 MultiArrayView<2, T2> dxy(expanded.template bind<0>(1));
1554 MultiArrayView<2, T2> dyy(expanded.template bind<0>(2));
1727 NumericTraits<typename SrcAccessor::value_type>::RealPromote
1736 destImage(
tmp), std::multiplies<TmpType>());
1740 destImage(
tmp), std::multiplies<TmpType>());
1744 destImage(
tmp), std::multiplies<TmpType>());
1749template <
class SrcIterator,
class SrcAccessor,
1750 class DestIteratorX,
class DestAccessorX,
1751 class DestIteratorXY,
class DestAccessorXY,
1752 class DestIteratorY,
class DestAccessorY>
1755 pair<DestIteratorX, DestAccessorX> destx,
1756 pair<DestIteratorXY, DestAccessorXY> destxy,
1757 pair<DestIteratorY, DestAccessorY> desty,
1758 double inner_scale,
double outer_scale)
1761 destx.first, destx.second,
1762 destxy.first, destxy.second,
1763 desty.first, desty.second,
1764 inner_scale, outer_scale);
1767template <
class T,
class S,
1769 class TXY,
class SXY,
1773 MultiArrayView<2, TX, SX> destx,
1774 MultiArrayView<2, TXY, SXY> destxy,
1775 MultiArrayView<2, TY, SY> desty,
1776 double inner_scale,
double outer_scale)
1778 vigra_precondition(src.shape() == destx.shape(),
1779 "structureTensor(): shape mismatch between input and output.");
1781 destImage(destx), destImage(destxy), destImage(desty),
1782 inner_scale, outer_scale);
1787template <
class SrcIterator,
class SrcAccessor,
1788 class DestIterator,
class DestAccessor>
1790 SrcIterator slowerright, SrcAccessor src,
1791 DestIterator dupperleft, DestAccessor dest,
1792 double inner_scale,
double outer_scale,
1795 typedef VectorElementAccessor<DestAccessor> DA;
1797 dupperleft, DA(0, dest),
1798 dupperleft, DA(1, dest),
1799 dupperleft, DA(2, dest),
1800 inner_scale, outer_scale);
1803template <
class SrcIterator,
class SrcAccessor,
1804 class DestIterator,
class DestAccessor>
1806 SrcIterator slowerright, SrcAccessor src,
1807 DestIterator dupperleft, DestAccessor dest,
1808 double inner_scale,
double outer_scale,
1811 int bands = src.
size(supperleft);
1812 typedef VectorElementAccessor<SrcAccessor> SA;
1816 inner_scale, outer_scale,
1819 BasicImage<typename DestAccessor::value_type> st(slowerright - supperleft, SkipInitialization);
1820 for(
int k=1; k < bands; ++k)
1823 st.upperLeft(), st.accessor(),
1824 inner_scale, outer_scale,
1826 combineTwoImages(srcImageRange(st), srcIter(dupperleft, dest), destIter(dupperleft, dest),
1827 std::plus<typename DestAccessor::value_type>());
1833template <
class SrcIterator,
class SrcAccessor,
1834 class DestIterator,
class DestAccessor>
1836 SrcIterator slowerright, SrcAccessor src,
1837 DestIterator dupperleft, DestAccessor dest,
1838 double inner_scale,
double outer_scale)
1841 NumericTraits<typename SrcAccessor::value_type>::isScalar isScalar;
1842 detail::structureTensor(supperleft, slowerright, src,
1843 dupperleft, dest, inner_scale, outer_scale, isScalar());
1846template <
class SrcIterator,
class SrcAccessor,
1847 class DestIterator,
class DestAccessor>
1850 pair<DestIterator, DestAccessor> dest,
1851 double inner_scale,
double outer_scale)
1854 dest.first, dest.second,
1855 inner_scale, outer_scale);
1858template <
class T1,
class S1,
1862 MultiArrayView<2, TinyVector<T2, 3>, S2> dest,
1863 double inner_scale,
double outer_scale)
1865 vigra_precondition(src.shape() == dest.shape(),
1866 "structureTensor(): shape mismatch between input and output.");
1869 inner_scale, outer_scale);
Two dimensional difference vector.
Definition diff2d.hxx:186
Class for a single RGB value.
Definition rgbvalue.hxx:128
size_type size() const
Definition tinyvector.hxx:913
void gaussianGradientMagnitude(...)
Calculate the gradient magnitude by means of a 1st derivatives of Gaussian filter.
void gaussianSmoothing(...)
Perform isotropic Gaussian convolution.
void structureTensor(...)
Calculate the Structure Tensor for each pixel of and image, using Gaussian (derivative) filters.
void separableConvolveX(...)
Performs a 1 dimensional convolution in x direction.
void gaussianSharpening(...)
Perform sharpening function with gaussian filter.
void separableConvolveY(...)
Performs a 1 dimensional convolution in y direction.
void laplacianOfGaussian(...)
Filter image with the Laplacian of Gaussian operator at the given scale.
void gaussianGradient(...)
Calculate the gradient vector by means of a 1st derivatives of Gaussian filter.
void combineTwoImages(...)
Combine two source images into destination image.
void convolveImage(...)
Convolve an image with the given kernel(s).
void hessianMatrixOfGaussian(...)
Filter image with the 2nd derivatives of the Gaussian at the given scale to get the Hessian matrix.
void simpleSharpening(...)
Perform simple sharpening function.