22 #ifndef otbBoxAndWhiskerImageFilter_hxx
23 #define otbBoxAndWhiskerImageFilter_hxx
28 #include "itkConstNeighborhoodIterator.h"
29 #include "itkImageRegionIterator.h"
30 #include "itkNeighborhoodAlgorithm.h"
31 #include "itkProgressReporter.h"
39 template <
class TInputImage>
42 this->SetNumberOfRequiredInputs(1);
43 this->SetNumberOfRequiredOutputs(1);
50 template <
class TInputImage>
53 const TInputImage* inputPtr = this->GetInput();
57 typedef typename itk::NeighborhoodAlgorithm::ImageBoundaryFacesCalculator<InputImageType> ImageBoundaryFacesCalculatorType;
58 typename ImageBoundaryFacesCalculatorType::FaceListType faceList;
59 ImageBoundaryFacesCalculatorType boundaryCalculator;
60 faceList = boundaryCalculator(inputPtr, outputRegionForThread, this->GetRadius());
63 typename ImageBoundaryFacesCalculatorType::FaceListType::iterator faceIterator;
66 itk::ImageRegionConstIterator<InputImageType> inputIter;
67 itk::ImageRegionIterator<OutputImageType> outputIter;
73 for (faceIterator = faceList.begin(); faceIterator != faceList.end(); ++faceIterator)
75 inputIter = itk::ImageRegionConstIterator<InputImageType>(inputPtr, *faceIterator);
76 inputIter.GoToBegin();
79 outputIter = itk::ImageRegionIterator<OutputImageType>(outputPtr, *faceIterator);
80 outputIter.GoToBegin();
82 while (!outputIter.IsAtEnd())
84 outputIter.Set(this->PerformBoxAndWhiskerDetection(inputIter.Get()));
93 template <
class TInputImage>
100 const unsigned int vectorSize = pixel.Size();
101 const unsigned int medianPosition = vectorSize / 2;
102 const unsigned int firstQuartilePosition = vectorSize / 4;
103 const unsigned int thirdQuartilePosition = (3 * vectorSize) / 4;
106 for (i = 0; i < vectorSize; ++i)
109 std::sort(data.begin(), data.end());
111 double box = m_Beta *
static_cast<double>(data[thirdQuartilePosition] - data[firstQuartilePosition]);
112 double median = ::fabs(
static_cast<double>(data[medianPosition]));
115 for (i = 0; i < vectorSize; ++i)
117 if (::fabs(
static_cast<double>(outputPixel[i]) - box) >
median)
119 OutlierType::SetToMissingValue(outputPixel[i]);
127 template <
class TInputImage>
130 Superclass::GenerateOutputInformation();
131 this->GetOutput()->SetNumberOfComponentsPerPixel(this->GetInput()->GetNumberOfComponentsPerPixel());
133 this->GetOutput()->CopyInformation(this->GetInput());
136 template <
class TInputImage>
140 output->SetNumberOfComponentsPerPixel(this->GetInput()->GetNumberOfComponentsPerPixel());
141 output->SetBufferedRegion(output->GetRequestedRegion());
Superclass::OutputImageRegionType OutputImageRegionType
InputImageType::PixelType PixelType
BoxAndWhiskerImageFilter()
Superclass::OutputImageType OutputImageType
void GenerateOutputInformation() override
PixelType PerformBoxAndWhiskerDetection(const PixelType &pixel)
void AllocateOutputs() override
void DynamicThreadedGenerateData(const OutputImageRegionType &outputRegionForThread) override
Euclidean distance function facing missing value.
The "otb" namespace contains all Orfeo Toolbox (OTB) classes.