22 #ifndef otbStreamingMinMaxVectorImageFilter_hxx
23 #define otbStreamingMinMaxVectorImageFilter_hxx
26 #include "itkImageRegionIterator.h"
27 #include "itkImageRegionConstIteratorWithIndex.h"
28 #include "itkNumericTraits.h"
29 #include "itkProgressReporter.h"
35 template <
class TInputImage>
45 this->DynamicMultiThreadingOff();
46 for (
int i = 1; i < 3; ++i)
49 this->itk::ProcessObject::SetNthOutput(i, output.GetPointer());
53 template <
class TInputImage>
56 itk::DataObject::Pointer ret;
60 ret =
static_cast<itk::DataObject*
>(TInputImage::New().GetPointer());
64 ret =
static_cast<itk::DataObject*
>(PixelObjectType::New().GetPointer());
70 template <
class TInputImage>
73 return static_cast<PixelObjectType*
>(this->itk::ProcessObject::GetOutput(1));
76 template <
class TInputImage>
79 return static_cast<const PixelObjectType*
>(this->itk::ProcessObject::GetOutput(1));
82 template <
class TInputImage>
85 return static_cast<PixelObjectType*
>(this->itk::ProcessObject::GetOutput(2));
88 template <
class TInputImage>
91 return static_cast<const PixelObjectType*
>(this->itk::ProcessObject::GetOutput(2));
94 template <
class TInputImage>
97 Superclass::GenerateOutputInformation();
100 this->GetOutput()->CopyInformation(this->GetInput());
101 this->GetOutput()->SetLargestPossibleRegion(this->GetInput()->GetLargestPossibleRegion());
103 if (this->GetOutput()->GetRequestedRegion().GetNumberOfPixels() == 0)
105 this->GetOutput()->SetRequestedRegion(this->GetOutput()->GetLargestPossibleRegion());
110 template <
class TInputImage>
120 template <
class TInputImage>
123 TInputImage* inputPtr =
const_cast<TInputImage*
>(this->GetInput());
124 inputPtr->UpdateOutputInformation();
126 unsigned int numberOfThreads = this->GetNumberOfWorkUnits();
127 unsigned int numberOfComponent = inputPtr->GetNumberOfComponentsPerPixel();
131 tempPixel.SetSize(numberOfComponent);
132 tempPixel.Fill(itk::NumericTraits<InternalPixelType>::NonpositiveMin());
133 this->GetMaximumOutput()->Set(tempPixel);
135 tempPixel.Fill(itk::NumericTraits<InternalPixelType>::max());
136 this->GetMinimumOutput()->Set(tempPixel);
139 tempTemporariesPixel.SetSize(numberOfComponent);
140 tempTemporariesPixel.Fill(itk::NumericTraits<InternalPixelType>::max());
141 m_ThreadMin =
ArrayPixelType(numberOfThreads, tempTemporariesPixel);
143 tempTemporariesPixel.Fill(itk::NumericTraits<InternalPixelType>::NonpositiveMin());
144 m_ThreadMax =
ArrayPixelType(numberOfThreads, tempTemporariesPixel);
147 template <
class TInputImage>
152 int numberOfThreads = this->GetNumberOfWorkUnits();
153 unsigned int numberOfComponent = this->GetInput()->GetNumberOfComponentsPerPixel();
156 minimumVector.SetSize(numberOfComponent);
157 minimumVector.Fill(itk::NumericTraits<InternalPixelType>::max());
160 maximumVector.SetSize(numberOfComponent);
161 maximumVector.Fill(itk::NumericTraits<InternalPixelType>::NonpositiveMin());
165 for (i = 0; i < numberOfThreads; ++i)
167 for (
unsigned int j = 0; j < numberOfComponent; ++j)
169 if (m_ThreadMin[i][j] < minimumVector[j])
171 minimumVector[j] = m_ThreadMin[i][j];
173 if (m_ThreadMax[i][j] > maximumVector[j])
175 maximumVector[j] = m_ThreadMax[i][j];
181 this->GetMinimumOutput()->Set(minimumVector);
182 this->GetMaximumOutput()->Set(maximumVector);
185 template <
class TInputImage>
193 itk::ProgressReporter progress(
this, threadId, outputRegionForThread.GetNumberOfPixels());
196 itk::ImageRegionConstIteratorWithIndex<TInputImage> it(inputPtr, outputRegionForThread);
200 while (!it.IsAtEnd())
204 for (
unsigned int j = 0; j < vectorValue.GetSize(); ++j)
208 if ((!m_NoDataFlag) || value != m_NoDataValue)
210 if (value < m_ThreadMin[threadId][j])
212 m_ThreadMin[threadId][j] = value;
214 if (value > m_ThreadMax[threadId][j])
216 m_ThreadMax[threadId][j] = value;
221 progress.CompletedPixel();
225 template <
class TImage>
228 Superclass::PrintSelf(os, indent);
230 os << indent <<
"Minimum: " << this->GetMinimumOutput()->Get() << std::endl;
231 os << indent <<
"Maximum: " << this->GetMaximumOutput()->Get() << std::endl;
TInputImage::PixelType PixelType
PixelObjectType * GetMaximumOutput()
itk::SimpleDataObjectDecorator< PixelType > PixelObjectType
TInputImage::Pointer InputImagePointer
void Reset(void) override
itk::ProcessObject::DataObjectPointerArraySizeType DataObjectPointerArraySizeType
void AllocateOutputs() override
std::vector< PixelType > ArrayPixelType
PersistentMinMaxVectorImageFilter()
PixelObjectType * GetMinimumOutput()
void GenerateOutputInformation() override
TInputImage::RegionType RegionType
void PrintSelf(std::ostream &os, itk::Indent indent) const override
TInputImage::InternalPixelType InternalPixelType
void Synthetize(void) override
DataObjectPointer MakeOutput(DataObjectPointerArraySizeType idx) override
void ThreadedGenerateData(const RegionType &outputRegionForThread, itk::ThreadIdType threadId) override
The "otb" namespace contains all Orfeo Toolbox (OTB) classes.