19 #ifndef __otbContinuousMinimumMaximumImageCalculator_txx
20 #define __otbContinuousMinimumMaximumImageCalculator_txx
24 #include "itkNumericTraits.h"
32 template<
class TInputImage>
36 m_Image = TInputImage::New();
37 m_Maximum = itk::NumericTraits<PixelType>::NonpositiveMin();
38 m_Minimum = itk::NumericTraits<PixelType>::max();
39 m_IndexOfMinimum.Fill(0);
40 m_IndexOfMaximum.Fill(0);
41 m_RegionSetByUser =
false;
47 template<
class TInputImage>
52 if (!m_RegionSetByUser)
54 m_Region = m_Image->GetRequestedRegion();
58 m_Maximum = itk::NumericTraits<PixelType>::NonpositiveMin();
59 m_Minimum = itk::NumericTraits<PixelType>::max();
64 if (value > static_cast<RealPixelType>(m_Maximum))
66 m_Maximum =
static_cast<PixelType>(value);
69 if (value < static_cast<RealPixelType>(m_Minimum))
71 m_Minimum =
static_cast<PixelType>(value);
81 indexNeighbor[0] = m_IndexOfMinimum[0] - 1;
82 indexNeighbor[1] = m_IndexOfMinimum[1];
85 indexNeighbor[0] = m_IndexOfMinimum[0] + 1;
86 indexNeighbor[1] = m_IndexOfMinimum[1];
90 double hOffset = -(rightValue - leftValue) / (2 * (rightValue + leftValue - 2 * m_Minimum));
93 indexNeighbor[0] = m_IndexOfMinimum[0];
94 indexNeighbor[1] = m_IndexOfMinimum[1] - 1;
97 indexNeighbor[0] = m_IndexOfMinimum[0];
98 indexNeighbor[1] = m_IndexOfMinimum[1] + 1;
102 double vOffset = -(bottomValue - topValue) / (2 * (bottomValue + topValue - 2 * m_Minimum));
104 m_ContinuousIndexOfMinimum[0] = m_IndexOfMinimum[0] + hOffset;
105 m_ContinuousIndexOfMinimum[1] = m_IndexOfMinimum[1] + vOffset;
110 indexNeighbor[0] = m_IndexOfMaximum[0] - 1;
111 indexNeighbor[1] = m_IndexOfMaximum[1];
114 indexNeighbor[0] = m_IndexOfMaximum[0] + 1;
115 indexNeighbor[1] = m_IndexOfMaximum[1];
119 double hOffset = -(rightValue - leftValue) / (2 * (rightValue + leftValue - 2 * m_Maximum));
122 indexNeighbor[0] = m_IndexOfMaximum[0];
123 indexNeighbor[1] = m_IndexOfMaximum[1] - 1;
126 indexNeighbor[0] = m_IndexOfMaximum[0];
127 indexNeighbor[1] = m_IndexOfMaximum[1] + 1;
131 double vOffset = -(bottomValue - topValue) / (2 * (bottomValue + topValue - 2 * m_Maximum));
133 m_ContinuousIndexOfMaximum[0] = m_IndexOfMaximum[0] + hOffset;
134 m_ContinuousIndexOfMaximum[1] = m_IndexOfMaximum[1] + vOffset;
142 template<
class TInputImage>
147 if (!m_RegionSetByUser)
149 m_Region = m_Image->GetRequestedRegion();
152 m_Minimum = itk::NumericTraits<PixelType>::max();
157 if (value < static_cast<RealPixelType>(m_Minimum))
159 m_Minimum =
static_cast<PixelType>(value);
168 indexNeighbor[0] = m_IndexOfMinimum[0] - 1;
169 indexNeighbor[1] = m_IndexOfMinimum[1];
172 indexNeighbor[0] = m_IndexOfMinimum[0] + 1;
173 indexNeighbor[1] = m_IndexOfMinimum[1];
177 double hOffset = -(rightValue - leftValue) / (2 * (rightValue + leftValue - 2 * m_Minimum));
180 indexNeighbor[0] = m_IndexOfMinimum[0];
181 indexNeighbor[1] = m_IndexOfMinimum[1] - 1;
184 indexNeighbor[0] = m_IndexOfMinimum[0];
185 indexNeighbor[1] = m_IndexOfMinimum[1] + 1;
189 double vOffset = -(bottomValue - topValue) / (2 * (bottomValue + topValue - 2 * m_Minimum));
191 m_ContinuousIndexOfMinimum[0] = m_IndexOfMinimum[0] + hOffset;
192 m_ContinuousIndexOfMinimum[1] = m_IndexOfMinimum[1] + vOffset;
199 template<
class TInputImage>
204 if (!m_RegionSetByUser)
206 m_Region = m_Image->GetRequestedRegion();
209 m_Maximum = itk::NumericTraits<PixelType>::NonpositiveMin();
214 if (value > static_cast<RealPixelType>(m_Maximum))
216 m_Maximum =
static_cast<PixelType>(value);
237 indexNeighbor[0] = m_IndexOfMaximum[0] - 1;
238 indexNeighbor[1] = m_IndexOfMaximum[1];
241 indexNeighbor[0] = m_IndexOfMaximum[0] + 1;
242 indexNeighbor[1] = m_IndexOfMaximum[1];
246 double hOffset = -(rightValue - leftValue) / (2 * (rightValue + leftValue - 2 * m_Maximum));
249 indexNeighbor[0] = m_IndexOfMaximum[0];
250 indexNeighbor[1] = m_IndexOfMaximum[1] - 1;
253 indexNeighbor[0] = m_IndexOfMaximum[0];
254 indexNeighbor[1] = m_IndexOfMaximum[1] + 1;
258 double vOffset = -(bottomValue - topValue) / (2 * (bottomValue + topValue - 2 * m_Maximum));
260 m_ContinuousIndexOfMaximum[0] = m_IndexOfMaximum[0] + hOffset;
261 m_ContinuousIndexOfMaximum[1] = m_IndexOfMaximum[1] + vOffset;
265 template<
class TInputImage>
271 m_RegionSetByUser =
true;
274 template<
class TInputImage>
279 Superclass::PrintSelf(os, indent);
281 os << indent <<
"Minimum: "
282 <<
static_cast<typename itk::NumericTraits<PixelType>::PrintType
>(m_Minimum)
284 os << indent <<
"Maximum: "
285 <<
static_cast<typename itk::NumericTraits<PixelType>::PrintType
>(m_Maximum)
287 os << indent <<
"Index of Minimum: " << m_IndexOfMinimum << std::endl;
288 os << indent <<
"Index of Maximum: " << m_IndexOfMaximum << std::endl;
289 os << indent <<
"Continuous Index of Minimum: " << m_ContinuousIndexOfMinimum << std::endl;
290 os << indent <<
"Continuous Index of Maximum: " << m_ContinuousIndexOfMaximum << std::endl;
292 os << indent <<
"Image: " << std::endl;
294 os << indent <<
"Region: " << std::endl;
296 os << indent <<
"Region set by User: " << m_RegionSetByUser << std::endl;