13 #include "itkCommand.h" 28 this->InvokeEvent(::itk::ProgressEvent());
30 auto* process =
dynamic_cast<itk::ProcessObject*
>(caller);
33 this->m_Progress = process->GetProgress();
37 template <
typename TPixel,
unsigned int VDim>
41 m_InternalMask =
dynamic_cast<InternalMaskType*
>(
image);
43 if (m_InternalMask.IsNull())
45 MITK_INFO <<
"Parameter Fit Generator. Need to cast mask for parameter fit.";
47 using CastFilterType = itk::CastImageFilter< InputImageType, InternalMaskType >;
48 typename CastFilterType::Pointer spImageCaster = CastFilterType::New();
50 spImageCaster->SetInput(image);
52 m_InternalMask = spImageCaster->GetOutput();
53 spImageCaster->Update();
57 template<
typename TImage>
61 for (mitk::ModelFitFunctorBase::ParameterNamesType::size_type j = 0; j < paramNames.size(); ++j)
63 if (source->GetNumberOfOutputs() < startPos+j)
65 mitkThrow() <<
"Error while generating fitted parameter images. Number of sources is too low and does not match expected parameter number. Output size: "<< source->GetNumberOfOutputs()<<
"; number of param names: "<<paramNames.size()<<
";source start pos: " << startPos;
69 typename TImage::ConstPointer outputImg = source->GetOutput(startPos+j);
72 result.insert(std::make_pair(paramNames[j],paramImage));
75 endPos = startPos + paramNames.size();
80 template <
typename TPixel,
unsigned int VDim>
84 using InputFrameImageType =
itk::Image<TPixel, VDim-1>;
89 typename FitFilterType::Pointer fitFilter = FitFilterType::New();
91 typename ::itk::MemberCommand<Self>::Pointer spProgressCommand = ::itk::MemberCommand<Self>::New();
92 spProgressCommand->SetCallbackFunction(
this, &Self::onFitProgressEvent);
93 fitFilter->AddObserver(::itk::ProgressEvent(), spProgressCommand);
97 imageTimeSelector->SetInput(this->m_DynamicImage);
98 std::vector<Image::Pointer> frameCache;
99 for (
unsigned int i = 0; i < this->m_DynamicImage->GetTimeSteps(); ++i)
101 typename InputFrameImageType::Pointer frameImage;
102 imageTimeSelector->SetTimeNr(i);
103 imageTimeSelector->UpdateLargestPossibleRegion();
106 frameCache.push_back(frameMITKImage);
108 fitFilter->SetInput(i,frameImage);
112 if (m_TimeGridByParameterizer)
114 if (timeGrid.GetSize() != m_ModelParameterizer->GetDefaultTimeGrid().GetSize())
116 mitkThrow() <<
"Cannot do fitting. Filter is set to use default time grid of the parameterizer, but grid size does not match the number of input image frames. Grid size: " << m_ModelParameterizer->GetDefaultTimeGrid().GetSize() <<
"; frame count: " << timeGrid.GetSize();
122 this->m_ModelParameterizer->SetDefaultTimeGrid(timeGrid);
129 fitFilter->SetFunctor(functor);
130 if (this->m_InternalMask.IsNotNull())
132 fitFilter->SetMask(this->m_InternalMask);
146 if (fitFilter->GetNumberOfOutputs() != (paramNames.size() + derivedParamNames.size() + criterionNames.size() + evaluationParamNames.size() + debugParamNames.size()))
148 mitkThrow() <<
"Error while generating fitted parameter images. Fit filter output size does not match expected parameter number. Output size: "<< fitFilter->GetNumberOfOutputs();
151 ModelFitFunctorBase::ParameterNamesType::size_type resultPos = 0;
152 this->m_TempResultMap = StoreResultImages<ParameterImageType>(paramNames,fitFilter,resultPos, resultPos);
153 this->m_TempDerivedResultMap = StoreResultImages<ParameterImageType>(derivedParamNames,fitFilter,resultPos, resultPos);
154 this->m_TempCriterionResultMap = StoreResultImages<ParameterImageType>(criterionNames,fitFilter,resultPos, resultPos);
155 this->m_TempEvaluationResultMap = StoreResultImages<ParameterImageType>(evaluationParamNames,fitFilter,resultPos, resultPos);
158 this->m_TempEvaluationResultMap.insert(debugMap.begin(), debugMap.end());
164 bool result = Superclass::HasOutdatedResult();
166 if (m_ModelParameterizer.IsNotNull())
174 if (m_FitFunctor.IsNotNull())
182 if (m_DynamicImage.IsNotNull())
190 if (m_Mask.IsNotNull())
205 Superclass::CheckValidInputs();
207 if (m_DynamicImage.IsNull())
209 mitkThrow() <<
"Cannot generate fitted parameter images. Input dynamic image is not set.";
216 this->m_Progress = 0;
218 if(this->m_Mask.IsNotNull())
224 this->m_InternalMask =
nullptr;
229 parameterImages = this->m_TempResultMap;
230 derivedParameterImages = this->m_TempDerivedResultMap;
231 criterionImages = this->m_TempCriterionResultMap;
232 evaluationParameterImages = this->m_TempEvaluationResultMap;
246 m_ModelParameterizer->GenerateParameterizedModel();
248 return parameterizedModel->GetParameterNames();
255 m_ModelParameterizer->GenerateParameterizedModel();
257 return parameterizedModel->GetDerivedParameterNames();
263 return this->m_FitFunctor->GetCriterionNames();
269 auto evals = this->m_FitFunctor->GetEvaluationParameterNames();
270 auto debugs = this->m_FitFunctor->GetDebugParameterNames();
272 evals.insert(evals.end(), debugs.begin(), debugs.end());
ParameterNamesType GetParameterNames() const override
#define AccessFixedDimensionByItk(mitkImage, itkImageTypeFunction, dimension)
Access a mitk-image with known dimension by an itk-image.
ParameterFitImageGeneratorBase::ParameterImageMapType ParameterImageMapType
ModelBaseType::ParameterNamesType ParameterNamesType
::mitk::Image InputImageType
void DoPrepareMask(itk::Image< TPixel, VDim > *image)
ModelBase::ParameterNamesType ParameterNamesType
double GetProgress() const override
void CheckValidInputs() const override
itk::Array< double > TimeGridType
mitk::PixelBasedParameterFitImageGenerator::ParameterImageMapType StoreResultImages(mitk::ModelFitFunctorBase::ParameterNamesType ¶mNames, itk::ImageSource< TImage > *source, mitk::ModelFitFunctorBase::ParameterNamesType::size_type startPos, mitk::ModelFitFunctorBase::ParameterNamesType::size_type &endPos)
void SetModelFitFunctor(const mitk::ModelFitFunctorBase *functor)
bool HasOutdatedResult() const override
Perform a generic pixel-wise operation on N images and produces m output images.
void DoFitAndGetResults(ParameterImageMapType ¶meterImages, ParameterImageMapType &derivedParameterImages, ParameterImageMapType &criterionImages, ParameterImageMapType &evaluationParameterImages) override
ParameterNamesType GetEvaluationParameterNames() const override
itk::TimeStamp m_GenerationTimeStamp
ParameterNamesType GetCriterionNames() const override
void onFitProgressEvent(::itk::Object *caller, const ::itk::EventObject &eventObject)
MITKMODELFIT_EXPORT ModelBase::TimeGridType ExtractTimeGrid(const Image *image)
std::map< ParameterNameType, Image::Pointer > ParameterImageMapType
mitk::Image::Pointer image
void CastToMitkImage(const itk::SmartPointer< ItkOutputImageType > &itkimage, itk::SmartPointer< mitk::Image > &mitkoutputimage)
Cast an itk::Image (with a specific type) to an mitk::Image.
void MITKCORE_EXPORT CastToItkImage(const mitk::Image *mitkImage, itk::SmartPointer< ItkOutputImageType > &itkOutputImage)
Cast an mitk::Image to an itk::Image with a specific type.
ParameterNamesType GetDerivedParameterNames() const override
void SetModelParameterizer(const ParameterizerType *parameterizer)
void DoParameterFit(itk::Image< TPixel, VDim > *image)