#ifndef GAUSS_H#define GAUSS_H#include <boost/multi_array.hpp>#include <cassert>#include <cmath>#include <deque>#include "image.h"#include "image_conv.h"#include "image_op.h"namespace mimas {/** @defgroup gauss Gaussian blur and Gauss gradientMethods for blurring images with a gauss-bell and gauss-gradient.The filter-parameter \f$\sigma\f$ can be choosen and the size of the filteris computed by choosing an upper bound for the approximation-error.The following example demonstrates how to blur an image:\include gauss_tool/main.cc@author Stuart Meikle (stu@stumeikle.org)@author Jan Wedekind (jan@wedesoft.de)@date Fri Apr 07 18:52:00 2006@{ *//** Compute gauss-bell.The values of the cells are computed by using differences of the integralof the gauss-function:\f$\displaystyle\int_{-r}^{+r}{\frac{1}{\sqrt{2\,\pi}\,\sigma}\,e^{-\displaystyle\frac{x^2}{2\,\sigma^2}}\,\mathrm{d}x}\ =\ \mathrm{erf}(\displaystyle\frac{r}{\sqrt{2}\,\sigma})\f$The coefficients are normalised afterwards such that the sum of allelements of the filter is \f$1\f$.@param sigma Standard deviation of gauss-distribution.@param maxError Maximum error boundary(relative to range of pixel-values).@see gaussBlur */template< typename T >std::deque< T > gaussBlurFilter( T sigma, T maxError = (T)( 1.0 / 256.0 ) );/** Blur 2-D array.Perform gaussian blur on 2-D array.@param x Input array.@param sigma Standard deviation.@param maxError Maximum error boundary (relative to range of pixel-values).@see gaussBlurFilter */template< typename T >boost::multi_array< T, 2 > gaussBlur( const boost::const_multi_array_ref< T, 2 > &x, T sigma, T maxError );/** Blur image.Perform gaussian blur on 2-D image.@param x Input image.@param sigma Standard deviation.@param maxError Maximum error boundary (relative to range of pixel-values).@see gaussBlurFilter */template< typename T >image< T > gaussBlur( const image< T > &x, T sigma,T maxError = (T)( 1.0 / 256.0 ) ){boost::const_multi_array_ref< T, 2 > data( x.rawData(), boost::extents[ x.getHeight() ][ x.getWidth() ] );image< T > retVal; retVal.init( x.getWidth(), x.getHeight() );boost::multi_array_ref< T, 2 >( retVal.rawData(),boost::extents[ retVal.getHeight() ][ retVal.getWidth() ] ) =gaussBlur< T >( data, sigma, maxError );return retVal;}/** Compute gauss-gradient.The values of the cells are computed by using differences of theintegral (the gauss-function):\f$\frac{1}{\sqrt{2\,\pi}\,\sigma}\,e^{-\displaystyle\frac{x^2}{2\,\sigma^2}}\,\mathrm{d}x\big\|_r^\infty\f$The coefficients are normalised afterwards such that the sum of the squareof all elements of the filter is \f$1\f$.@param sigma Standard deviation of gauss-distribution.@param maxError Maximum error boundary(relative to range of pixel-values).@see gaussBlur */template< typename T >std::deque< T > gaussGradientFilter( T sigma,T maxError = (T)( 1.0 / 256.0 ) );/** Take x-gradient of 2-D array.Compute gauss-gradient of 2-D array in x-direction.@param x Input array.@param sigma Standard deviation.@param maxError Maximum error boundary (relative to range of pixel-values).@see gaussGradientFilter */template< typename T >boost::multi_array< T, 2 > gaussGradientX( const boost::const_multi_array_ref< T, 2 > &x, T sigma, T maxError );/** Take x-gradient of 2-D image.Compute gauss-gradient of 2-D image in x-direction.@param x Input image.@param sigma Standard deviation.@param maxError Maximum error boundary (relative to range of pixel-values).@see gaussGradientFilter */template< typename T >image< T > gaussGradientX( const image< T > &x, T sigma,T maxError = (T)( 1.0 / 256.0 ) );/** Take y-gradient of 2-D array.Compute gauss-gradient of 2-D array in y-direction.@param x Input array.@param sigma Standard deviation.@param maxError Maximum error boundary (relative to range of pixel-values).@see gaussGradientFilter */template< typename T >boost::multi_array< T, 2 > gaussGradientY( const boost::const_multi_array_ref< T, 2 > &x, T sigma, T maxError );/** Take y-gradient of 2-D image.Compute gauss-gradient of 2-D image in y-direction.@param x Input image.@param sigma Standard deviation.@param maxError Maximum error boundary (relative to range of pixel-values).@see gaussGradientFilter */template< typename T >image< T > gaussGradientY( const image< T > &x, T sigma,T maxError = (T)( 1.0 / 256.0 ) );/** Square of gradient-norm.Compute square of gradient-norm for 2-D image@param im Input image.@param sigma Standard deviation.@param maxError Maximum error boundary (relative to range of pixel-values).@see gaussGradientFilter */template< typename T >image< T > gaussGradientSqr( const image< T > &im, T sigma,T maxError = (T)( 1.0 / 256.0 ) ){image< T >gradX( gaussGradientX( im, sigma, maxError ) ),gradY( gaussGradientY( im, sigma, maxError ) );return sumSquares( gradX, gradY );}/** Gradient-norm.Compute gradient-norm for 2-D image@param im Input image.@param sigma Standard deviation.@param maxError Maximum error boundary (relative to range of pixel-values).@see gaussGradientFilter */template< typename T >image< T > gaussGradientNorm( const image< T > &im, T sigma,T maxError = (T)( 1.0 / 256.0 ) ){return squareRoot( gaussGradientSqr( im, sigma, maxError ) );}///@}};#include "gauss.tcc"#endif