19 #ifndef __otbMarkovRandomFieldFilter_txx
20 #define __otbMarkovRandomFieldFilter_txx
25 template<
class TInputImage,
class TClassifiedImage>
29 m_MaximumNumberOfIterations(50),
31 m_ImageDeltaEnergy(0.0),
32 m_NeighborhoodRadius(1),
33 m_TotalNumberOfValidPixelsInOutputImage(1),
34 m_TotalNumberOfPixelsInInputImage(1),
35 m_ErrorTolerance(0.0),
36 m_SmoothingFactor(1.0),
37 m_NumberOfIterations(0),
39 m_ExternalClassificationSet(false),
40 m_StopCondition(MaximumNumberOfIterations)
42 m_Generator = RandomGeneratorType::New();
43 m_Generator->SetSeed();
45 this->SetNumberOfRequiredInputs(1);
46 if ((
int) InputImageDimension != (
int) ClassifiedImageDimension)
48 std::ostringstream msg;
49 msg <<
"Input image dimension: " << InputImageDimension <<
" != output image dimension: " <<
50 ClassifiedImageDimension;
53 m_InputImageNeighborhoodRadius.Fill(m_NeighborhoodRadius);
64 template<
class TInputImage,
class TClassifiedImage>
69 m_ExternalClassificationSet =
true;
75 template <
class TInputImage,
class TClassifiedImage>
80 if (this->GetNumberOfInputs() < 2)
88 template<
class TInputImage,
class TClassifiedImage>
93 Superclass::PrintSelf(os, indent);
95 os << indent <<
" MRF Image filter object " << std::endl;
97 os << indent <<
" Number of classes: " << m_NumberOfClasses << std::endl;
99 os << indent <<
" Maximum number of iterations: " <<
100 m_MaximumNumberOfIterations << std::endl;
102 os << indent <<
" Error tolerance for convergence: " <<
103 m_ErrorTolerance << std::endl;
105 os << indent <<
" Size of the MRF neighborhood radius:" <<
106 m_InputImageNeighborhoodRadius << std::endl;
108 os << indent <<
"StopCondition: "
109 << m_StopCondition << std::endl;
111 os << indent <<
" Number of iterations: " <<
112 m_NumberOfIterations << std::endl;
114 os << indent <<
" Lambda: " <<
115 m_Lambda << std::endl;
121 template <
class TInputImage,
class TClassifiedImage>
131 inputPtr->SetRequestedRegion(outputPtr->GetRequestedRegion());
137 template <
class TInputImage,
class TClassifiedImage>
144 TClassifiedImage *imgData;
145 imgData =
dynamic_cast<TClassifiedImage*
>(output);
146 imgData->SetRequestedRegionToLargestPossibleRegion();
152 template <
class TInputImage,
class TClassifiedImage>
157 typename TInputImage::ConstPointer input = this->GetInput();
158 typename TClassifiedImage::Pointer output = this->GetOutput();
159 output->SetLargestPossibleRegion(input->GetLargestPossibleRegion());
162 template<
class TInputImage,
class TClassifiedImage>
177 this->ApplyMarkovRandomFieldFilter();
184 template<
class TInputImage,
class TClassifiedImage>
191 for (
unsigned int i = 0; i < InputImageDimension; ++i)
193 radius[i] = radiusValue;
195 this->SetNeighborhoodRadius(radius);
202 template<
class TInputImage,
class TClassifiedImage>
208 for (
unsigned int i = 0; i < InputImageDimension; ++i)
210 radius[i] = radiusArray[i];
213 this->SetNeighborhoodRadius(radius);
220 template<
class TInputImage,
class TClassifiedImage>
226 for (
unsigned int i = 0; i < InputImageDimension; ++i)
228 m_InputImageNeighborhoodRadius[i] = radius[i];
229 m_LabelledImageNeighborhoodRadius[i] = radius[i];
238 template<
class TInputImage,
class TClassifiedImage>
243 if (m_NumberOfClasses <= 0)
252 outputPtr->SetBufferedRegion(outputPtr->GetRequestedRegion());
253 outputPtr->Allocate();
258 outImageIt(outputPtr, outputPtr->GetRequestedRegion());
260 if (m_ExternalClassificationSet)
262 typename TrainingImageType::ConstPointer trainingImage = this->GetTrainingInput();
264 trainingImageIt(trainingImage, outputPtr->GetRequestedRegion());
266 while (!outImageIt.IsAtEnd())
270 outImageIt.Set(labelvalue);
278 while (!outImageIt.IsAtEnd())
281 m_Generator->GetIntegerVariate() %
static_cast<int>(m_NumberOfClasses)
283 outImageIt.Set(randomvalue);
294 template<
class TInputImage,
class TClassifiedImage>
300 m_ImageDeltaEnergy = 0.0;
303 this->GetInput()->GetBufferedRegion().GetSize();
309 m_TotalNumberOfPixelsInInputImage = 1;
310 m_TotalNumberOfValidPixelsInOutputImage = 1;
312 for (
unsigned int i = 0; i < InputImageDimension; ++i)
314 m_TotalNumberOfPixelsInInputImage *=
static_cast<int>(inputImageSize[i]);
316 m_TotalNumberOfValidPixelsInOutputImage *=
317 (
static_cast<int>(inputImageSize[i])
318 - 2 * m_InputImageNeighborhoodRadius[i]);
321 srand((
unsigned) time(0));
323 if (!m_EnergyRegularization)
325 itkExceptionMacro(<<
"EnergyRegularization is not present");
328 if (!m_EnergyFidelity)
330 itkExceptionMacro(<<
"EnergyFidelity is not present");
335 itkExceptionMacro(<<
"Optimizer is not present");
340 itkExceptionMacro(<<
"Sampler is not present");
343 m_Sampler->SetLambda(m_Lambda);
344 m_Sampler->SetEnergyRegularization(m_EnergyRegularization);
345 m_Sampler->SetEnergyFidelity(m_EnergyFidelity);
346 m_Sampler->SetNumberOfClasses(m_NumberOfClasses);
352 template<
class TInputImage,
class TClassifiedImage>
359 int maxNumPixelError = itk::Math::Round<int, double> (m_ErrorTolerance *
360 m_TotalNumberOfPixelsInInputImage);
362 m_NumberOfIterations = 0;
363 m_ErrorCounter = m_TotalNumberOfValidPixelsInOutputImage;
365 while ((m_NumberOfIterations < m_MaximumNumberOfIterations) &&
366 (m_ErrorCounter >= maxNumPixelError))
370 this->MinimizeOnce();
372 otbMsgDevMacro(<<
"m_ErrorCounter/m_TotalNumberOfPixelsInInputImage: "
373 << m_ErrorCounter / ((
double) (m_TotalNumberOfPixelsInInputImage)));
376 ++m_NumberOfIterations;
380 otbMsgDevMacro(<<
"m_NumberOfIterations: " << m_NumberOfIterations);
381 otbMsgDevMacro(<<
"m_MaximumNumberOfIterations: " << m_MaximumNumberOfIterations);
386 if (m_NumberOfIterations >= m_MaximumNumberOfIterations)
388 m_StopCondition = MaximumNumberOfIterations;
390 else if (m_ErrorCounter <= maxNumPixelError)
392 m_StopCondition = ErrorTolerance;
400 template<
class TInputImage,
class TClassifiedImage>
406 labelledIterator(m_LabelledImageNeighborhoodRadius, this->GetOutput(),
407 this->GetOutput()->GetLargestPossibleRegion());
409 dataIterator(m_InputImageNeighborhoodRadius, this->GetInput(),
410 this->GetInput()->GetLargestPossibleRegion());
415 ++labelledIterator, ++dataIterator)
419 bool changeValueBool;
420 m_Sampler->Compute(dataIterator, labelledIterator);
421 value = m_Sampler->GetValue();
422 changeValueBool = m_Optimizer->Compute(m_Sampler->GetDeltaEnergy());
427 m_ImageDeltaEnergy += m_Sampler->GetDeltaEnergy();