21 #ifndef otbConvolutionImageFilter_hxx
22 #define otbConvolutionImageFilter_hxx
25 #include "itkConstNeighborhoodIterator.h"
26 #include "itkImageRegionIterator.h"
27 #include "itkOffset.h"
28 #include "itkProgressReporter.h"
29 #include "itkConstantBoundaryCondition.h"
37 template <
class TInputImage,
class TOutputImage,
class TBoundaryCondition,
class TFilterPrecision>
41 m_Filter.SetSize(3 * 3);
43 m_NormalizeFilter =
false;
46 template <
class TInputImage,
class TOutputImage,
class TBoundaryCondition,
class TFilterPrecision>
50 Superclass::GenerateInputRequestedRegion();
53 typename Superclass::InputImagePointer inputPtr =
const_cast<TInputImage*
>(this->GetInput());
54 typename Superclass::OutputImagePointer outputPtr = this->GetOutput();
56 if (!inputPtr || !outputPtr)
63 typename TInputImage::RegionType inputRequestedRegion;
64 inputRequestedRegion = inputPtr->GetRequestedRegion();
67 inputRequestedRegion.PadByRadius(m_Radius);
69 otbMsgDevMacro(<<
"Region is now " << inputRequestedRegion.GetIndex() <<
", " << inputRequestedRegion.GetSize());
72 if (inputRequestedRegion.Crop(inputPtr->GetLargestPossibleRegion()))
74 inputPtr->SetRequestedRegion(inputRequestedRegion);
83 inputPtr->SetRequestedRegion(inputRequestedRegion);
86 itk::InvalidRequestedRegionError e(__FILE__, __LINE__);
87 e.SetLocation(ITK_LOCATION);
88 e.SetDescription(
"Requested region is (at least partially) outside the largest possible region.");
89 e.SetDataObject(inputPtr);
94 template <
class TInputImage,
class TOutputImage,
class TBoundaryCondition,
class TFilterPrecision>
99 typename OutputImageType::Pointer output = this->GetOutput();
100 typename InputImageType::ConstPointer input = this->GetInput();
106 this->CallCopyOutputRegionToInputRegion(inputRegionForThread, outputRegionForThread);
108 itk::ConstNeighborhoodIterator<InputImageType, BoundaryConditionType> inputIt(m_Radius, input, inputRegionForThread);
109 itk::ImageRegionIterator<OutputImageType> outputIt(output, outputRegionForThread);
112 const unsigned int neighborhoodSize = inputIt.Size();
116 if (m_NormalizeFilter)
118 InputRealType norm = itk::NumericTraits<InputRealType>::Zero;
119 for (
unsigned int i = 0; i < neighborhoodSize; ++i)
123 const double norm_double = 1. /
static_cast<double>(std::abs(norm));
125 while (!inputIt.IsAtEnd())
127 sum = itk::NumericTraits<InputRealType>::Zero;
129 for (
unsigned int i = 0; i < neighborhoodSize; ++i)
131 sum +=
static_cast<InputRealType>(inputIt.GetPixel(i) * m_Filter(i));
143 while (!inputIt.IsAtEnd())
145 sum = itk::NumericTraits<InputRealType>::Zero;
147 for (
unsigned int i = 0; i < neighborhoodSize; ++i)
149 sum +=
static_cast<InputRealType>(inputIt.GetPixel(i) * m_Filter(i));
163 template <
class TInputImage,
class TOutput,
class TBoundaryCondition,
class TFilterPrecision>
166 Superclass::PrintSelf(os, indent);
167 os << indent <<
"Radius: " << m_Radius <<
'\n';
void GenerateInputRequestedRegion() override
InputImageType::RegionType InputImageRegionType
OutputImageType::RegionType OutputImageRegionType
void DynamicThreadedGenerateData(const OutputImageRegionType &outputRegionForThread) override
itk::NumericTraits< InputPixelType >::RealType InputRealType
OutputImageType::PixelType OutputPixelType
void PrintSelf(std::ostream &os, itk::Indent indent) const override
The "otb" namespace contains all Orfeo Toolbox (OTB) classes.
#define otbMsgDevMacro(x)