22 #ifndef otbStreamingMinMaxImageFilter_hxx
23 #define otbStreamingMinMaxImageFilter_hxx
27 #include "itkImageRegionIterator.h"
28 #include "itkProgressReporter.h"
34 template <
class TInputImage>
37 this->DynamicMultiThreadingOff();
45 for (
int i = 1; i < 5; ++i)
47 this->itk::ProcessObject::SetNthOutput(i, this->MakeOutput(i));
50 this->GetMinimumOutput()->Set(itk::NumericTraits<PixelType>::max());
51 this->GetMaximumOutput()->Set(itk::NumericTraits<PixelType>::NonpositiveMin());
56 template <
class TInputImage>
59 itk::DataObject::Pointer ret;
63 ret =
static_cast<itk::DataObject*
>(TInputImage::New().GetPointer());
67 ret =
static_cast<itk::DataObject*
>(PixelObjectType::New().GetPointer());
71 ret =
static_cast<itk::DataObject*
>(IndexObjectType::New().GetPointer());
77 template <
class TInputImage>
80 return static_cast<PixelObjectType*
>(this->itk::ProcessObject::GetOutput(1));
83 template <
class TInputImage>
86 return static_cast<const PixelObjectType*
>(this->itk::ProcessObject::GetOutput(1));
89 template <
class TInputImage>
92 return static_cast<PixelObjectType*
>(this->itk::ProcessObject::GetOutput(2));
95 template <
class TInputImage>
98 return static_cast<const PixelObjectType*
>(this->itk::ProcessObject::GetOutput(2));
102 template <
class TInputImage>
105 return static_cast<IndexObjectType*
>(this->itk::ProcessObject::GetOutput(3));
108 template <
class TInputImage>
111 return static_cast<const IndexObjectType*
>(this->itk::ProcessObject::GetOutput(3));
114 template <
class TInputImage>
117 return static_cast<IndexObjectType*
>(this->itk::ProcessObject::GetOutput(4));
120 template <
class TInputImage>
123 return static_cast<const IndexObjectType*
>(this->itk::ProcessObject::GetOutput(4));
126 template <
class TInputImage>
129 Superclass::GenerateOutputInformation();
130 if (this->GetInput())
132 this->GetOutput()->CopyInformation(this->GetInput());
133 this->GetOutput()->SetLargestPossibleRegion(this->GetInput()->GetLargestPossibleRegion());
135 if (this->GetOutput()->GetRequestedRegion().GetNumberOfPixels() == 0)
137 this->GetOutput()->SetRequestedRegion(this->GetOutput()->GetLargestPossibleRegion());
141 template <
class TInputImage>
151 template <
class TInputImage>
155 int numberOfThreads = this->GetNumberOfWorkUnits();
157 PixelType minimum = itk::NumericTraits<PixelType>::max();
158 PixelType maximum = itk::NumericTraits<PixelType>::NonpositiveMin();
162 for (i = 0; i < numberOfThreads; ++i)
164 if (m_ThreadMin[i] < minimum)
166 minimum = m_ThreadMin[i];
167 minimumIdx = m_ThreadMinIndex[i];
169 if (m_ThreadMax[i] > maximum)
171 maximum = m_ThreadMax[i];
172 maximumIdx = m_ThreadMaxIndex[i];
177 this->GetMinimumOutput()->Set(minimum);
178 this->GetMaximumOutput()->Set(maximum);
179 this->GetMinimumIndexOutput()->Set(minimumIdx);
180 this->GetMaximumIndexOutput()->Set(maximumIdx);
183 template <
class TInputImage>
186 int numberOfThreads = this->GetNumberOfWorkUnits();
188 m_ThreadMin.resize(numberOfThreads);
189 m_ThreadMax.resize(numberOfThreads);
190 std::fill(m_ThreadMin.begin(), m_ThreadMin.end(), itk::NumericTraits<PixelType>::max());
191 std::fill(m_ThreadMax.begin(), m_ThreadMax.end(), itk::NumericTraits<PixelType>::NonpositiveMin());
195 m_ThreadMinIndex.resize(numberOfThreads);
196 m_ThreadMaxIndex.resize(numberOfThreads);
197 std::fill(m_ThreadMinIndex.begin(), m_ThreadMinIndex.end(), zeroIdx);
198 std::fill(m_ThreadMaxIndex.begin(), m_ThreadMaxIndex.end(), zeroIdx);
201 template <
class TInputImage>
205 itk::ProgressReporter progress(
this, threadId, outputRegionForThread.GetNumberOfPixels());
208 itk::ImageRegionConstIterator<TInputImage> it(inputPtr, outputRegionForThread);
211 while (!it.IsAtEnd())
214 if (value < m_ThreadMin[threadId])
216 m_ThreadMin[threadId] = value;
217 m_ThreadMinIndex[threadId] = it.GetIndex();
219 if (value > m_ThreadMax[threadId])
221 m_ThreadMax[threadId] = value;
222 m_ThreadMaxIndex[threadId] = it.GetIndex();
225 progress.CompletedPixel();
229 template <
class TImage>
232 Superclass::PrintSelf(os, indent);
234 os << indent <<
"Minimum: " <<
static_cast<typename itk::NumericTraits<PixelType>::PrintType
>(this->GetMinimum()) << std::endl;
235 os << indent <<
"Maximum: " <<
static_cast<typename itk::NumericTraits<PixelType>::PrintType
>(this->GetMaximum()) << std::endl;
236 os << indent <<
"Minimum Index: " << this->GetMinimumIndex() << std::endl;
237 os << indent <<
"Maximum Index: " << this->GetMaximumIndex() << std::endl;
void AllocateOutputs() override
PixelObjectType * GetMaximumOutput()
void Reset(void) override
TInputImage::Pointer InputImagePointer
TInputImage::PixelType PixelType
void PrintSelf(std::ostream &os, itk::Indent indent) const override
PixelObjectType * GetMinimumOutput()
itk::ProcessObject::DataObjectPointerArraySizeType DataObjectPointerArraySizeType
itk::SimpleDataObjectDecorator< PixelType > PixelObjectType
IndexObjectType * GetMaximumIndexOutput()
itk::SimpleDataObjectDecorator< IndexType > IndexObjectType
DataObjectPointer MakeOutput(DataObjectPointerArraySizeType idx) override
void Synthetize(void) override
void GenerateOutputInformation() override
TInputImage::RegionType RegionType
TInputImage::IndexType IndexType
PersistentMinMaxImageFilter()
IndexObjectType * GetMinimumIndexOutput()
void ThreadedGenerateData(const RegionType &outputRegionForThread, itk::ThreadIdType threadId) override
The "otb" namespace contains all Orfeo Toolbox (OTB) classes.