/* * Copyright (C) 2005-2019 Centre National d'Etudes Spatiales (CNES) * * This file is part of Orfeo Toolbox * * https://www.orfeo-toolbox.org/ * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ #ifndef otbWindowedSincInterpolateImageGaussianFunction_h #define otbWindowedSincInterpolateImageGaussianFunction_h #include "otbWindowedSincInterpolateImageFunctionBase.h" #include "vnl/vnl_math.h" namespace otb { namespace Function { /** * \class GaussianWindowFunction * \brief Gaussian interpolation windowing function. * \f[ w(x) = exp ( -2. \frac{sigma*sigma * \pi } ) \f] * \sa otbWindowedSincInterpolateImageFunctionBase * * \ingroup OTBInterpolation */ template class GaussianWindowFunction { public: GaussianWindowFunction() : m_Radius(1), m_Factor(-2.0 / CONST_PI) { } // default radius is 1 at construction void SetRadius(unsigned int radius) { m_Radius = radius; m_Factor = -2. / (static_cast(m_Radius * m_Radius) * CONST_PI); } double GetFactor() { return m_Factor; } unsigned int GetRadius() const { return m_Radius; } inline TOutput operator()(const TInput& A) const { double x = static_cast(A); double px = CONST_PI * x; double temp = std::exp(px * px * m_Factor); return (x == 0.0) ? static_cast(temp) : static_cast(temp * std::sin(px) / px); } private: unsigned int m_Radius; double m_Factor; }; } // namespace Function /** * \class WindowedSincInterpolateImageGaussianFunction * \brief Use the WindowedSincInterpolateImageFunctionBase with a Gaussian Function. * * \sa GenericInterpolatorImageFunction * \sa Function::GaussianWindowFunction * \sa Function::HammingWindowFunction * \sa Function::CosineWindowFunction * \sa Function::WelchWindowFunction * \sa Function::LanczosWindowFunction * \sa Function::BlackmanWindowFunction * \ingroup ImageFunctionBases ImageInterpolators * * \ingroup OTBInterpolation */ template , class TCoordRep = double, class TInputInterpolator = double, class TOutputInterpolator = double> class ITK_EXPORT WindowedSincInterpolateImageGaussianFunction : public WindowedSincInterpolateImageFunctionBase, TBoundaryCondition, TCoordRep> { public: /** Standard class typedefs. */ typedef WindowedSincInterpolateImageGaussianFunction Self; typedef WindowedSincInterpolateImageFunctionBase, TBoundaryCondition, TCoordRep> Superclass; typedef itk::SmartPointer Pointer; typedef itk::SmartPointer ConstPointer; /** Run-time type information (and related methods). */ itkTypeMacro(WindowedSincInterpolateImageGaussianFunction, WindowedSincInterpolateImageFunctionBase); /** Method for creation through the object factory. */ itkNewMacro(Self); /** Input and output images typedef definition. */ typedef typename Superclass::InputImageType InputImageType; typedef typename Superclass::OutputType OutputType; /** Dimension underlying input image. */ itkStaticConstMacro(ImageDimension, unsigned int, Superclass::ImageDimension); /** Superclass typedef inheritance. */ typedef typename Superclass::IndexType IndexType; typedef typename Superclass::SizeType SizeType; typedef typename Superclass::RealType RealType; typedef typename Superclass::IteratorType IteratorType; typedef typename Superclass::ContinuousIndexType ContinuousIndexType; protected: WindowedSincInterpolateImageGaussianFunction(){}; ~WindowedSincInterpolateImageGaussianFunction() override { } void PrintSelf(std::ostream& os, itk::Indent indent) const override { Superclass::PrintSelf(os, indent); } private: WindowedSincInterpolateImageGaussianFunction(const Self&) = delete; void operator=(const Self&) = delete; }; } // end namespace otb #endif